The "drive" structure is always malloc'ed and therefore always starts off described as a 32-bit "flat" pointer. Instead of switching to/from 16bit pointers, make all the code use the 32bit pointer. This eliminates the confusing 16/32 bit pointer switches.
This patch also removes the "_g" suffixes on local variables in functions that are always called in 32bit mode.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- src/block.c | 100 ++++++++++---------- src/block.h | 10 +- src/cdrom.c | 31 +++---- src/disk.c | 257 +++++++++++++++++++++++++-------------------------- src/hw/ahci.c | 28 +++--- src/hw/ata.c | 164 ++++++++++++++++---------------- src/hw/blockcmd.c | 12 +-- src/hw/esp-scsi.c | 15 +-- src/hw/floppy.c | 58 ++++++------ src/hw/lsi-scsi.c | 15 +-- src/hw/megasas.c | 16 ++-- src/hw/pvscsi.c | 19 ++-- src/hw/ramdisk.c | 12 +-- src/hw/usb-msc.c | 42 ++++----- src/hw/usb-uas.c | 18 ++-- src/hw/virtio-blk.c | 50 +++++----- src/hw/virtio-scsi.c | 13 +-- 17 files changed, 429 insertions(+), 431 deletions(-)
diff --git a/src/block.c b/src/block.c index af254ce..7493a5d 100644 --- a/src/block.c +++ b/src/block.c @@ -31,17 +31,15 @@ getDrive(u8 exttype, u8 extdriveoffset) { if (extdriveoffset >= ARRAY_SIZE(IDMap[0])) return NULL; - struct drive_s *drive_gf = GET_GLOBAL(IDMap[exttype][extdriveoffset]); - if (!drive_gf) - return NULL; - return GLOBALFLAT2GLOBAL(drive_gf); + return GET_GLOBAL(IDMap[exttype][extdriveoffset]); }
-int getDriveId(u8 exttype, struct drive_s *drive_g) +int getDriveId(u8 exttype, struct drive_s *drive) { + ASSERT32FLAT(); int i; for (i = 0; i < ARRAY_SIZE(IDMap[0]); i++) - if (getDrive(exttype, i) == drive_g) + if (getDrive(exttype, i) == drive) return i; return -1; } @@ -65,12 +63,12 @@ int create_bounce_buf(void) ****************************************************************/
static u8 -get_translation(struct drive_s *drive_g) +get_translation(struct drive_s *drive) { - u8 type = GET_GLOBAL(drive_g->type); + u8 type = drive->type; if (CONFIG_QEMU && type == DTYPE_ATA) { // Emulators pass in the translation info via nvram. - u8 ataid = GET_GLOBAL(drive_g->cntl_id); + u8 ataid = drive->cntl_id; u8 channel = ataid / 2; u8 translation = rtc_read(CMOS_BIOS_DISKTRANSFLAG + channel/2); translation >>= 2 * (ataid % 4); @@ -79,10 +77,10 @@ get_translation(struct drive_s *drive_g) }
// Otherwise use a heuristic to determine translation type. - u16 heads = GET_GLOBAL(drive_g->pchs.head); - u16 cylinders = GET_GLOBAL(drive_g->pchs.cylinder); - u16 spt = GET_GLOBAL(drive_g->pchs.sector); - u64 sectors = GET_GLOBAL(drive_g->sectors); + u16 heads = drive->pchs.head; + u16 cylinders = drive->pchs.cylinder; + u16 spt = drive->pchs.sector; + u64 sectors = drive->sectors; u64 psectors = (u64)heads * cylinders * spt; if (!heads || !cylinders || !spt || psectors > sectors) // pchs doesn't look valid - use LBA. @@ -96,15 +94,15 @@ get_translation(struct drive_s *drive_g) }
static void -setup_translation(struct drive_s *drive_g) +setup_translation(struct drive_s *drive) { - u8 translation = get_translation(drive_g); - SET_GLOBAL(drive_g->translation, translation); + u8 translation = get_translation(drive); + drive->translation = translation;
- u16 heads = GET_GLOBAL(drive_g->pchs.head); - u16 cylinders = GET_GLOBAL(drive_g->pchs.cylinder); - u16 spt = GET_GLOBAL(drive_g->pchs.sector); - u64 sectors = GET_GLOBAL(drive_g->sectors); + u16 heads = drive->pchs.head ; + u16 cylinders = drive->pchs.cylinder; + u16 spt = drive->pchs.sector; + u64 sectors = drive->sectors; const char *desc = NULL;
switch (translation) { @@ -161,15 +159,15 @@ setup_translation(struct drive_s *drive_g) if (cylinders > 1024) cylinders = 1024; dprintf(1, "drive %p: PCHS=%u/%d/%d translation=%s LCHS=%d/%d/%d s=%d\n" - , drive_g - , drive_g->pchs.cylinder, drive_g->pchs.head, drive_g->pchs.sector + , drive + , drive->pchs.cylinder, drive->pchs.head, drive->pchs.sector , desc , cylinders, heads, spt , (u32)sectors);
- SET_GLOBAL(drive_g->lchs.head, heads); - SET_GLOBAL(drive_g->lchs.cylinder, cylinders); - SET_GLOBAL(drive_g->lchs.sector, spt); + drive->lchs.head = heads; + drive->lchs.cylinder = cylinders; + drive->lchs.sector = spt; }
@@ -179,18 +177,18 @@ setup_translation(struct drive_s *drive_g)
// Fill in Fixed Disk Parameter Table (located in ebda). static void -fill_fdpt(struct drive_s *drive_g, int hdid) +fill_fdpt(struct drive_s *drive, int hdid) { if (hdid > 1) return;
- u16 nlc = GET_GLOBAL(drive_g->lchs.cylinder); - u16 nlh = GET_GLOBAL(drive_g->lchs.head); - u16 nls = GET_GLOBAL(drive_g->lchs.sector); + u16 nlc = drive->lchs.cylinder; + u16 nlh = drive->lchs.head; + u16 nls = drive->lchs.sector;
- u16 npc = GET_GLOBAL(drive_g->pchs.cylinder); - u16 nph = GET_GLOBAL(drive_g->pchs.head); - u16 nps = GET_GLOBAL(drive_g->pchs.sector); + u16 npc = drive->pchs.cylinder; + u16 nph = drive->pchs.head; + u16 nps = drive->pchs.sector;
struct fdpt_s *fdpt = &get_ebda_ptr()->fdpt[hdid]; fdpt->precompensation = 0xffff; @@ -224,47 +222,49 @@ fill_fdpt(struct drive_s *drive_g, int hdid)
// Find spot to add a drive static void -add_drive(struct drive_s **idmap, u8 *count, struct drive_s *drive_g) +add_drive(struct drive_s **idmap, u8 *count, struct drive_s *drive) { if (*count >= ARRAY_SIZE(IDMap[0])) { warn_noalloc(); return; } - idmap[*count] = drive_g; + idmap[*count] = drive; *count = *count + 1; }
// Map a hard drive void -map_hd_drive(struct drive_s *drive_g) +map_hd_drive(struct drive_s *drive) { ASSERT32FLAT(); struct bios_data_area_s *bda = MAKE_FLATPTR(SEG_BDA, 0); int hdid = bda->hdcount; - dprintf(3, "Mapping hd drive %p to %d\n", drive_g, hdid); - add_drive(IDMap[EXTTYPE_HD], &bda->hdcount, drive_g); + dprintf(3, "Mapping hd drive %p to %d\n", drive, hdid); + add_drive(IDMap[EXTTYPE_HD], &bda->hdcount, drive);
// Setup disk geometry translation. - setup_translation(drive_g); + setup_translation(drive);
// Fill "fdpt" structure. - fill_fdpt(drive_g, hdid); + fill_fdpt(drive, hdid); }
// Map a cd void -map_cd_drive(struct drive_s *drive_g) +map_cd_drive(struct drive_s *drive) { - dprintf(3, "Mapping cd drive %p\n", drive_g); - add_drive(IDMap[EXTTYPE_CD], &CDCount, drive_g); + ASSERT32FLAT(); + dprintf(3, "Mapping cd drive %p\n", drive); + add_drive(IDMap[EXTTYPE_CD], &CDCount, drive); }
// Map a floppy void -map_floppy_drive(struct drive_s *drive_g) +map_floppy_drive(struct drive_s *drive) { - dprintf(3, "Mapping floppy drive %p\n", drive_g); - add_drive(IDMap[EXTTYPE_FLOPPY], &FloppyCount, drive_g); + ASSERT32FLAT(); + dprintf(3, "Mapping floppy drive %p\n", drive); + add_drive(IDMap[EXTTYPE_FLOPPY], &FloppyCount, drive);
// Update equipment word bits for floppy if (FloppyCount == 1) { @@ -350,7 +350,7 @@ int process_op(struct disk_op_s *op) { ASSERT16(); - u8 type = GET_GLOBAL(op->drive_g->type); + u8 type = GET_GLOBALFLAT(op->drive_gf->type); switch (type) { case DTYPE_FLOPPY: return process_floppy_op(op); @@ -362,15 +362,13 @@ process_op(struct disk_op_s *op) return process_cdemu_op(op); case DTYPE_VIRTIO_BLK: return process_virtio_blk_op(op); - case DTYPE_AHCI: - op->drive_g = (void*)op->drive_g + BUILD_BIOS_ADDR; + case DTYPE_AHCI: ; extern void _cfunc32flat_process_ahci_op(void); return call32(_cfunc32flat_process_ahci_op , (u32)MAKE_FLATPTR(GET_SEG(SS), op), DISK_RET_EPARAM); case DTYPE_ATA_ATAPI: return process_atapi_op(op); - case DTYPE_AHCI_ATAPI: - op->drive_g = (void*)op->drive_g + BUILD_BIOS_ADDR; + case DTYPE_AHCI_ATAPI: ; extern void _cfunc32flat_process_atapi_op(void); return call32(_cfunc32flat_process_atapi_op , (u32)MAKE_FLATPTR(GET_SEG(SS), op), DISK_RET_EPARAM); @@ -398,7 +396,7 @@ __send_disk_op(struct disk_op_s *op_far, u16 op_seg) , sizeof(dop));
dprintf(DEBUG_HDL_13, "disk_op d=%p lba=%d buf=%p count=%d cmd=%d\n" - , dop.drive_g, (u32)dop.lba, dop.buf_fl + , dop.drive_gf, (u32)dop.lba, dop.buf_fl , dop.count, dop.command);
int status = process_op(&dop); diff --git a/src/block.h b/src/block.h index 9bffa09..9cb25d0 100644 --- a/src/block.h +++ b/src/block.h @@ -11,7 +11,7 @@ struct disk_op_s { u64 lba; void *buf_fl; - struct drive_s *drive_g; + struct drive_s *drive_gf; u16 count; u8 command; }; @@ -109,10 +109,10 @@ extern struct dpte_s DefaultDPTE; extern u8 FloppyCount, CDCount; extern u8 *bounce_buf_fl; struct drive_s *getDrive(u8 exttype, u8 extdriveoffset); -int getDriveId(u8 exttype, struct drive_s *drive_g); -void map_floppy_drive(struct drive_s *drive_g); -void map_hd_drive(struct drive_s *drive_g); -void map_cd_drive(struct drive_s *drive_g); +int getDriveId(u8 exttype, struct drive_s *drive); +void map_floppy_drive(struct drive_s *drive); +void map_hd_drive(struct drive_s *drive); +void map_cd_drive(struct drive_s *drive); struct bregs; void __disk_ret(struct bregs *regs, u32 linecode, const char *fname); void __disk_ret_unimplemented(struct bregs *regs, u32 linecode diff --git a/src/cdrom.c b/src/cdrom.c index 836808b..811bef5 100644 --- a/src/cdrom.c +++ b/src/cdrom.c @@ -30,10 +30,9 @@ struct drive_s *cdemu_drive_gf VARFSEG; static int cdemu_read(struct disk_op_s *op) { - struct drive_s *drive_g; - drive_g = GLOBALFLAT2GLOBAL(GET_LOW(CDEmu.emulated_drive_gf)); + struct drive_s *drive_gf = GET_LOW(CDEmu.emulated_drive_gf); struct disk_op_s dop; - dop.drive_g = drive_g; + dop.drive_gf = drive_gf; dop.command = op->command; dop.lba = GET_LOW(CDEmu.ilba) + op->lba / 4;
@@ -120,17 +119,17 @@ cdrom_prepboot(void) if (create_bounce_buf() < 0) return;
- struct drive_s *drive_g = malloc_fseg(sizeof(*drive_g)); - if (!drive_g) { + struct drive_s *drive = malloc_fseg(sizeof(*drive)); + if (!drive) { warn_noalloc(); - free(drive_g); + free(drive); return; } - cdemu_drive_gf = drive_g; - memset(drive_g, 0, sizeof(*drive_g)); - drive_g->type = DTYPE_CDEMU; - drive_g->blksize = DISK_SECTOR_SIZE; - drive_g->sectors = (u64)-1; + cdemu_drive_gf = drive; + memset(drive, 0, sizeof(*drive)); + drive->type = DTYPE_CDEMU; + drive->blksize = DISK_SECTOR_SIZE; + drive->sectors = (u64)-1; }
#define SET_INT13ET(regs,var,val) \ @@ -175,14 +174,14 @@ cdemu_134b(struct bregs *regs) ****************************************************************/
int -cdrom_boot(struct drive_s *drive_g) +cdrom_boot(struct drive_s *drive) { ASSERT32FLAT(); struct disk_op_s dop; - int cdid = getDriveId(EXTTYPE_CD, drive_g); + int cdid = getDriveId(EXTTYPE_CD, drive); memset(&dop, 0, sizeof(dop)); - dop.drive_g = drive_g; - if (!dop.drive_g || cdid < 0) + dop.drive_gf = drive; + if (!dop.drive_gf || cdid < 0) return 1;
int ret = scsi_is_ready(&dop); @@ -231,7 +230,7 @@ cdrom_boot(struct drive_s *drive_g) u8 media = buffer[0x21]; CDEmu.media = media;
- CDEmu.emulated_drive_gf = dop.drive_g; + CDEmu.emulated_drive_gf = dop.drive_gf;
u16 boot_segment = *(u16*)&buffer[0x22]; if (!boot_segment) diff --git a/src/disk.c b/src/disk.c index 80290ce..1011b39 100644 --- a/src/disk.c +++ b/src/disk.c @@ -34,11 +34,10 @@ __disk_stub(struct bregs *regs, int lineno, const char *fname)
// Get the cylinders/heads/sectors for the given drive. static struct chs_s -getLCHS(struct drive_s *drive_g) +getLCHS(struct drive_s *drive_gf) { struct chs_s res = { }; - if (CONFIG_CDROM_EMU - && drive_g == GLOBALFLAT2GLOBAL(GET_GLOBAL(cdemu_drive_gf))) { + if (CONFIG_CDROM_EMU && drive_gf == GET_GLOBAL(cdemu_drive_gf)) { // Emulated drive - get info from CDEmu. (It's not possible to // populate the geometry directly in the driveid because the // geometry is only known after the bios segment is made @@ -48,18 +47,18 @@ getLCHS(struct drive_s *drive_g) res.sector = GET_LOW(CDEmu.lchs.sector); return res; } - res.cylinder = GET_GLOBAL(drive_g->lchs.cylinder); - res.head = GET_GLOBAL(drive_g->lchs.head); - res.sector = GET_GLOBAL(drive_g->lchs.sector); + res.cylinder = GET_GLOBALFLAT(drive_gf->lchs.cylinder); + res.head = GET_GLOBALFLAT(drive_gf->lchs.head); + res.sector = GET_GLOBALFLAT(drive_gf->lchs.sector); return res; }
// Perform read/write/verify using old-style chs accesses static void noinline -basic_access(struct bregs *regs, struct drive_s *drive_g, u16 command) +basic_access(struct bregs *regs, struct drive_s *drive_gf, u16 command) { struct disk_op_s dop; - dop.drive_g = drive_g; + dop.drive_gf = drive_gf; dop.command = command;
u8 count = regs->al; @@ -74,7 +73,7 @@ basic_access(struct bregs *regs, struct drive_s *drive_g, u16 command) } dop.count = count;
- struct chs_s chs = getLCHS(drive_g); + struct chs_s chs = getLCHS(drive_gf); u16 nlc=chs.cylinder, nlh=chs.head, nls=chs.sector;
// sanity check on cyl heads, sec @@ -99,15 +98,15 @@ basic_access(struct bregs *regs, struct drive_s *drive_g, u16 command)
// Perform read/write/verify using new-style "int13ext" accesses. static void noinline -extended_access(struct bregs *regs, struct drive_s *drive_g, u16 command) +extended_access(struct bregs *regs, struct drive_s *drive_gf, u16 command) { struct disk_op_s dop; struct int13ext_s *param_far = (struct int13ext_s*)(regs->si+0); // Get lba and check. dop.lba = GET_FARVAR(regs->ds, param_far->lba); dop.command = command; - dop.drive_g = drive_g; - if (dop.lba >= GET_GLOBAL(drive_g->sectors)) { + dop.drive_gf = drive_gf; + if (dop.lba >= GET_GLOBALFLAT(drive_gf->sectors)) { warn_invalid(regs); disk_ret(regs, DISK_RET_EPARAM); return; @@ -135,10 +134,10 @@ extended_access(struct bregs *regs, struct drive_s *drive_g, u16 command)
// disk controller reset static void -disk_1300(struct bregs *regs, struct drive_s *drive_g) +disk_1300(struct bregs *regs, struct drive_s *drive_gf) { struct disk_op_s dop; - dop.drive_g = drive_g; + dop.drive_gf = drive_gf; dop.command = CMD_RESET; int status = send_disk_op(&dop); disk_ret(regs, status); @@ -146,7 +145,7 @@ disk_1300(struct bregs *regs, struct drive_s *drive_g)
// read disk status static void -disk_1301(struct bregs *regs, struct drive_s *drive_g) +disk_1301(struct bregs *regs, struct drive_s *drive_gf) { u8 v; if (regs->dl < EXTSTART_HD) @@ -161,32 +160,32 @@ disk_1301(struct bregs *regs, struct drive_s *drive_g)
// read disk sectors static void -disk_1302(struct bregs *regs, struct drive_s *drive_g) +disk_1302(struct bregs *regs, struct drive_s *drive_gf) { - basic_access(regs, drive_g, CMD_READ); + basic_access(regs, drive_gf, CMD_READ); }
// write disk sectors static void -disk_1303(struct bregs *regs, struct drive_s *drive_g) +disk_1303(struct bregs *regs, struct drive_s *drive_gf) { - basic_access(regs, drive_g, CMD_WRITE); + basic_access(regs, drive_gf, CMD_WRITE); }
// verify disk sectors static void -disk_1304(struct bregs *regs, struct drive_s *drive_g) +disk_1304(struct bregs *regs, struct drive_s *drive_gf) { - basic_access(regs, drive_g, CMD_VERIFY); + basic_access(regs, drive_gf, CMD_VERIFY); }
// format disk track static void noinline -disk_1305(struct bregs *regs, struct drive_s *drive_g) +disk_1305(struct bregs *regs, struct drive_s *drive_gf) { debug_stub(regs);
- struct chs_s chs = getLCHS(drive_g); + struct chs_s chs = getLCHS(drive_gf); u16 nlh=chs.head, nls=chs.sector;
u8 num_sectors = regs->al; @@ -198,7 +197,7 @@ disk_1305(struct bregs *regs, struct drive_s *drive_g) }
struct disk_op_s dop; - dop.drive_g = drive_g; + dop.drive_gf = drive_gf; dop.command = CMD_FORMAT; dop.lba = head; dop.count = num_sectors; @@ -209,10 +208,10 @@ disk_1305(struct bregs *regs, struct drive_s *drive_g)
// read disk drive parameters static void noinline -disk_1308(struct bregs *regs, struct drive_s *drive_g) +disk_1308(struct bregs *regs, struct drive_s *drive_gf) { // Get logical geometry from table - struct chs_s chs = getLCHS(drive_g); + struct chs_s chs = getLCHS(drive_gf); u16 nlc=chs.cylinder, nlh=chs.head, nls=chs.sector; nlc--; nlh--; @@ -221,11 +220,10 @@ disk_1308(struct bregs *regs, struct drive_s *drive_g) // Floppy count = GET_GLOBAL(FloppyCount);
- if (CONFIG_CDROM_EMU - && drive_g == GLOBALFLAT2GLOBAL(GET_GLOBAL(cdemu_drive_gf))) + if (CONFIG_CDROM_EMU && drive_gf == GET_GLOBAL(cdemu_drive_gf)) regs->bx = GET_LOW(CDEmu.media) * 2; else - regs->bx = GET_GLOBAL(drive_g->floppy_type); + regs->bx = GET_GLOBALFLAT(drive_gf->floppy_type);
// set es & di to point to 11 byte diskette param table in ROM regs->es = SEG_BIOS; @@ -261,33 +259,33 @@ disk_1308(struct bregs *regs, struct drive_s *drive_g)
// initialize drive parameters static void -disk_1309(struct bregs *regs, struct drive_s *drive_g) +disk_1309(struct bregs *regs, struct drive_s *drive_gf) { DISK_STUB(regs); }
// seek to specified cylinder static void -disk_130c(struct bregs *regs, struct drive_s *drive_g) +disk_130c(struct bregs *regs, struct drive_s *drive_gf) { DISK_STUB(regs); }
// alternate disk reset static void -disk_130d(struct bregs *regs, struct drive_s *drive_g) +disk_130d(struct bregs *regs, struct drive_s *drive_gf) { DISK_STUB(regs); }
// check drive ready static void -disk_1310(struct bregs *regs, struct drive_s *drive_g) +disk_1310(struct bregs *regs, struct drive_s *drive_gf) { // should look at 40:8E also???
struct disk_op_s dop; - dop.drive_g = drive_g; + dop.drive_gf = drive_gf; dop.command = CMD_ISREADY; int status = send_disk_op(&dop); disk_ret(regs, status); @@ -295,21 +293,21 @@ disk_1310(struct bregs *regs, struct drive_s *drive_g)
// recalibrate static void -disk_1311(struct bregs *regs, struct drive_s *drive_g) +disk_1311(struct bregs *regs, struct drive_s *drive_gf) { DISK_STUB(regs); }
// controller internal diagnostic static void -disk_1314(struct bregs *regs, struct drive_s *drive_g) +disk_1314(struct bregs *regs, struct drive_s *drive_gf) { DISK_STUB(regs); }
// read disk drive size static void noinline -disk_1315(struct bregs *regs, struct drive_s *drive_g) +disk_1315(struct bregs *regs, struct drive_s *drive_gf) { disk_ret(regs, DISK_RET_SUCCESS); if (regs->dl < EXTSTART_HD || regs->dl >= EXTSTART_CD) { @@ -320,7 +318,7 @@ disk_1315(struct bregs *regs, struct drive_s *drive_g) // Hard drive
// Get logical geometry from table - struct chs_s chs = getLCHS(drive_g); + struct chs_s chs = getLCHS(drive_gf); u16 nlc=chs.cylinder, nlh=chs.head, nls=chs.sector;
// Compute sector count seen by int13 @@ -331,7 +329,7 @@ disk_1315(struct bregs *regs, struct drive_s *drive_g) }
static void -disk_1316(struct bregs *regs, struct drive_s *drive_g) +disk_1316(struct bregs *regs, struct drive_s *drive_gf) { if (regs->dl >= EXTSTART_HD) { // Hard drive @@ -343,7 +341,7 @@ disk_1316(struct bregs *regs, struct drive_s *drive_g)
// IBM/MS installation check static void -disk_1341(struct bregs *regs, struct drive_s *drive_g) +disk_1341(struct bregs *regs, struct drive_s *drive_gf) { regs->bx = 0xaa55; // install check regs->cx = 0x0007; // ext disk access and edd, removable supported @@ -353,28 +351,28 @@ disk_1341(struct bregs *regs, struct drive_s *drive_g)
// IBM/MS extended read static void -disk_1342(struct bregs *regs, struct drive_s *drive_g) +disk_1342(struct bregs *regs, struct drive_s *drive_gf) { - extended_access(regs, drive_g, CMD_READ); + extended_access(regs, drive_gf, CMD_READ); }
// IBM/MS extended write static void -disk_1343(struct bregs *regs, struct drive_s *drive_g) +disk_1343(struct bregs *regs, struct drive_s *drive_gf) { - extended_access(regs, drive_g, CMD_WRITE); + extended_access(regs, drive_gf, CMD_WRITE); }
// IBM/MS verify static void -disk_1344(struct bregs *regs, struct drive_s *drive_g) +disk_1344(struct bregs *regs, struct drive_s *drive_gf) { - extended_access(regs, drive_g, CMD_VERIFY); + extended_access(regs, drive_gf, CMD_VERIFY); }
// lock static void -disk_134500(struct bregs *regs, struct drive_s *drive_g) +disk_134500(struct bregs *regs, struct drive_s *drive_gf) { int cdid = regs->dl - EXTSTART_CD; u8 locks = GET_LOW(CDRom_locks[cdid]); @@ -390,7 +388,7 @@ disk_134500(struct bregs *regs, struct drive_s *drive_g)
// unlock static void -disk_134501(struct bregs *regs, struct drive_s *drive_g) +disk_134501(struct bregs *regs, struct drive_s *drive_gf) { int cdid = regs->dl - EXTSTART_CD; u8 locks = GET_LOW(CDRom_locks[cdid]); @@ -407,7 +405,7 @@ disk_134501(struct bregs *regs, struct drive_s *drive_g)
// status static void -disk_134502(struct bregs *regs, struct drive_s *drive_g) +disk_134502(struct bregs *regs, struct drive_s *drive_gf) { int cdid = regs->dl - EXTSTART_CD; u8 locks = GET_LOW(CDRom_locks[cdid]); @@ -416,14 +414,14 @@ disk_134502(struct bregs *regs, struct drive_s *drive_g) }
static void -disk_1345XX(struct bregs *regs, struct drive_s *drive_g) +disk_1345XX(struct bregs *regs, struct drive_s *drive_gf) { disk_ret_unimplemented(regs, DISK_RET_EPARAM); }
// IBM/MS lock/unlock drive static void -disk_1345(struct bregs *regs, struct drive_s *drive_g) +disk_1345(struct bregs *regs, struct drive_s *drive_gf) { if (regs->dl < EXTSTART_CD) { // Always success for HD @@ -432,16 +430,16 @@ disk_1345(struct bregs *regs, struct drive_s *drive_g) }
switch (regs->al) { - case 0x00: disk_134500(regs, drive_g); break; - case 0x01: disk_134501(regs, drive_g); break; - case 0x02: disk_134502(regs, drive_g); break; - default: disk_1345XX(regs, drive_g); break; + case 0x00: disk_134500(regs, drive_gf); break; + case 0x01: disk_134501(regs, drive_gf); break; + case 0x02: disk_134502(regs, drive_gf); break; + default: disk_1345XX(regs, drive_gf); break; } }
// IBM/MS eject media static void noinline -disk_1346(struct bregs *regs, struct drive_s *drive_g) +disk_1346(struct bregs *regs, struct drive_s *drive_gf) { if (regs->dl < EXTSTART_CD) { // Volume Not Removable @@ -475,14 +473,14 @@ disk_1346(struct bregs *regs, struct drive_s *drive_g)
// IBM/MS extended seek static void -disk_1347(struct bregs *regs, struct drive_s *drive_g) +disk_1347(struct bregs *regs, struct drive_s *drive_gf) { - extended_access(regs, drive_g, CMD_SEEK); + extended_access(regs, drive_gf, CMD_SEEK); }
// IBM/MS get drive parameters static void noinline -disk_1348(struct bregs *regs, struct drive_s *drive_g) +disk_1348(struct bregs *regs, struct drive_s *drive_gf) { u16 seg = regs->ds; struct int13dpt_s *param_far = (struct int13dpt_s*)(regs->si+0); @@ -497,12 +495,12 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
// EDD 1.x
- u8 type = GET_GLOBAL(drive_g->type); - u16 npc = GET_GLOBAL(drive_g->pchs.cylinder); - u16 nph = GET_GLOBAL(drive_g->pchs.head); - u16 nps = GET_GLOBAL(drive_g->pchs.sector); - u64 lba = GET_GLOBAL(drive_g->sectors); - u16 blksize = GET_GLOBAL(drive_g->blksize); + u8 type = GET_GLOBALFLAT(drive_gf->type); + u16 npc = GET_GLOBALFLAT(drive_gf->pchs.cylinder); + u16 nph = GET_GLOBALFLAT(drive_gf->pchs.head); + u16 nps = GET_GLOBALFLAT(drive_gf->pchs.sector); + u64 lba = GET_GLOBALFLAT(drive_gf->sectors); + u16 blksize = GET_GLOBALFLAT(drive_gf->blksize);
dprintf(DEBUG_HDL_13, "disk_1348 size=%d t=%d chs=%d,%d,%d lba=%d bs=%d\n" , size, type, npc, nph, nps, (u32)lba, blksize); @@ -547,10 +545,10 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g) SET_FARVAR(seg, param_far->dpte, SEGOFF(SEG_LOW, (u32)&DefaultDPTE));
// Fill in dpte - struct atadrive_s *adrive_g = container_of( - drive_g, struct atadrive_s, drive); - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); - u8 slave = GET_GLOBAL(adrive_g->slave); + struct atadrive_s *adrive_gf = container_of( + drive_gf, struct atadrive_s, drive); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); + u8 slave = GET_GLOBALFLAT(adrive_gf->slave); u16 iobase2 = GET_GLOBALFLAT(chan_gf->iobase2); u8 irq = GET_GLOBALFLAT(chan_gf->irq); iobase1 = GET_GLOBALFLAT(chan_gf->iobase1); @@ -560,7 +558,7 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
u16 options = 0; if (type == DTYPE_ATA) { - u8 translation = GET_GLOBAL(drive_g->translation); + u8 translation = GET_GLOBALFLAT(drive_gf->translation); if (translation != TRANSLATION_NONE) { options |= 1<<3; // CHS translation if (translation == TRANSLATION_LBA) @@ -594,7 +592,7 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g) SET_LOW(DefaultDPTE.checksum, -sum); } else { SET_FARVAR(seg, param_far->dpte.segoff, 0xffffffff); - bdf = GET_GLOBAL(drive_g->cntl_id); + bdf = GET_GLOBALFLAT(drive_gf->cntl_id); }
if (size < 66) { @@ -664,7 +662,7 @@ disk_1348(struct bregs *regs, struct drive_s *drive_g)
// IBM/MS extended media change static void -disk_1349(struct bregs *regs, struct drive_s *drive_g) +disk_1349(struct bregs *regs, struct drive_s *drive_gf) { if (regs->dl < EXTSTART_CD) { // Always success for HD @@ -677,56 +675,56 @@ disk_1349(struct bregs *regs, struct drive_s *drive_g) }
static void -disk_134e01(struct bregs *regs, struct drive_s *drive_g) +disk_134e01(struct bregs *regs, struct drive_s *drive_gf) { disk_ret(regs, DISK_RET_SUCCESS); }
static void -disk_134e03(struct bregs *regs, struct drive_s *drive_g) +disk_134e03(struct bregs *regs, struct drive_s *drive_gf) { disk_ret(regs, DISK_RET_SUCCESS); }
static void -disk_134e04(struct bregs *regs, struct drive_s *drive_g) +disk_134e04(struct bregs *regs, struct drive_s *drive_gf) { disk_ret(regs, DISK_RET_SUCCESS); }
static void -disk_134e06(struct bregs *regs, struct drive_s *drive_g) +disk_134e06(struct bregs *regs, struct drive_s *drive_gf) { disk_ret(regs, DISK_RET_SUCCESS); }
static void -disk_134eXX(struct bregs *regs, struct drive_s *drive_g) +disk_134eXX(struct bregs *regs, struct drive_s *drive_gf) { disk_ret(regs, DISK_RET_EPARAM); }
// IBM/MS set hardware configuration static void -disk_134e(struct bregs *regs, struct drive_s *drive_g) +disk_134e(struct bregs *regs, struct drive_s *drive_gf) { switch (regs->al) { - case 0x01: disk_134e01(regs, drive_g); break; - case 0x03: disk_134e03(regs, drive_g); break; - case 0x04: disk_134e04(regs, drive_g); break; - case 0x06: disk_134e06(regs, drive_g); break; - default: disk_134eXX(regs, drive_g); break; + case 0x01: disk_134e01(regs, drive_gf); break; + case 0x03: disk_134e03(regs, drive_gf); break; + case 0x04: disk_134e04(regs, drive_gf); break; + case 0x06: disk_134e06(regs, drive_gf); break; + default: disk_134eXX(regs, drive_gf); break; } }
static void -disk_13XX(struct bregs *regs, struct drive_s *drive_g) +disk_13XX(struct bregs *regs, struct drive_s *drive_gf) { disk_ret_unimplemented(regs, DISK_RET_EPARAM); }
static void -disk_13(struct bregs *regs, struct drive_s *drive_g) +disk_13(struct bregs *regs, struct drive_s *drive_gf) { //debug_stub(regs);
@@ -734,37 +732,37 @@ disk_13(struct bregs *regs, struct drive_s *drive_g) SET_BDA(disk_interrupt_flag, 0);
switch (regs->ah) { - case 0x00: disk_1300(regs, drive_g); break; - case 0x01: disk_1301(regs, drive_g); break; - case 0x02: disk_1302(regs, drive_g); break; - case 0x03: disk_1303(regs, drive_g); break; - case 0x04: disk_1304(regs, drive_g); break; - case 0x05: disk_1305(regs, drive_g); break; - case 0x08: disk_1308(regs, drive_g); break; - case 0x09: disk_1309(regs, drive_g); break; - case 0x0c: disk_130c(regs, drive_g); break; - case 0x0d: disk_130d(regs, drive_g); break; - case 0x10: disk_1310(regs, drive_g); break; - case 0x11: disk_1311(regs, drive_g); break; - case 0x14: disk_1314(regs, drive_g); break; - case 0x15: disk_1315(regs, drive_g); break; - case 0x16: disk_1316(regs, drive_g); break; - case 0x41: disk_1341(regs, drive_g); break; - case 0x42: disk_1342(regs, drive_g); break; - case 0x43: disk_1343(regs, drive_g); break; - case 0x44: disk_1344(regs, drive_g); break; - case 0x45: disk_1345(regs, drive_g); break; - case 0x46: disk_1346(regs, drive_g); break; - case 0x47: disk_1347(regs, drive_g); break; - case 0x48: disk_1348(regs, drive_g); break; - case 0x49: disk_1349(regs, drive_g); break; - case 0x4e: disk_134e(regs, drive_g); break; - default: disk_13XX(regs, drive_g); break; - } -} - -static void -floppy_13(struct bregs *regs, struct drive_s *drive_g) + case 0x00: disk_1300(regs, drive_gf); break; + case 0x01: disk_1301(regs, drive_gf); break; + case 0x02: disk_1302(regs, drive_gf); break; + case 0x03: disk_1303(regs, drive_gf); break; + case 0x04: disk_1304(regs, drive_gf); break; + case 0x05: disk_1305(regs, drive_gf); break; + case 0x08: disk_1308(regs, drive_gf); break; + case 0x09: disk_1309(regs, drive_gf); break; + case 0x0c: disk_130c(regs, drive_gf); break; + case 0x0d: disk_130d(regs, drive_gf); break; + case 0x10: disk_1310(regs, drive_gf); break; + case 0x11: disk_1311(regs, drive_gf); break; + case 0x14: disk_1314(regs, drive_gf); break; + case 0x15: disk_1315(regs, drive_gf); break; + case 0x16: disk_1316(regs, drive_gf); break; + case 0x41: disk_1341(regs, drive_gf); break; + case 0x42: disk_1342(regs, drive_gf); break; + case 0x43: disk_1343(regs, drive_gf); break; + case 0x44: disk_1344(regs, drive_gf); break; + case 0x45: disk_1345(regs, drive_gf); break; + case 0x46: disk_1346(regs, drive_gf); break; + case 0x47: disk_1347(regs, drive_gf); break; + case 0x48: disk_1348(regs, drive_gf); break; + case 0x49: disk_1349(regs, drive_gf); break; + case 0x4e: disk_134e(regs, drive_gf); break; + default: disk_13XX(regs, drive_gf); break; + } +} + +static void +floppy_13(struct bregs *regs, struct drive_s *drive_gf) { // Only limited commands are supported on floppies. switch (regs->ah) { @@ -777,9 +775,9 @@ floppy_13(struct bregs *regs, struct drive_s *drive_g) case 0x08: case 0x15: case 0x16: - disk_13(regs, drive_g); + disk_13(regs, drive_gf); break; - default: disk_13XX(regs, drive_g); break; + default: disk_13XX(regs, drive_gf); break; } }
@@ -798,21 +796,21 @@ handle_legacy_disk(struct bregs *regs, u8 extdrive) }
if (extdrive < EXTSTART_HD) { - struct drive_s *drive_g = getDrive(EXTTYPE_FLOPPY, extdrive); - if (!drive_g) + struct drive_s *drive_gf = getDrive(EXTTYPE_FLOPPY, extdrive); + if (!drive_gf) goto fail; - floppy_13(regs, drive_g); + floppy_13(regs, drive_gf); return; }
- struct drive_s *drive_g; + struct drive_s *drive_gf; if (extdrive >= EXTSTART_CD) - drive_g = getDrive(EXTTYPE_CD, extdrive - EXTSTART_CD); + drive_gf = getDrive(EXTTYPE_CD, extdrive - EXTSTART_CD); else - drive_g = getDrive(EXTTYPE_HD, extdrive - EXTSTART_HD); - if (!drive_g) + drive_gf = getDrive(EXTTYPE_HD, extdrive - EXTSTART_HD); + if (!drive_gf) goto fail; - disk_13(regs, drive_g); + disk_13(regs, drive_gf); return;
fail: @@ -843,14 +841,13 @@ handle_13(struct bregs *regs) u8 emudrive = GET_LOW(CDEmu.emulated_extdrive); if (extdrive == emudrive) { // Access to an emulated drive. - struct drive_s *cdemu_g; - cdemu_g = GLOBALFLAT2GLOBAL(GET_GLOBAL(cdemu_drive_gf)); + struct drive_s *cdemu_gf = GET_GLOBAL(cdemu_drive_gf); if (regs->ah > 0x16) { // Only old-style commands supported. - disk_13XX(regs, cdemu_g); + disk_13XX(regs, cdemu_gf); return; } - disk_13(regs, cdemu_g); + disk_13(regs, cdemu_gf); return; } if (extdrive < EXTSTART_CD && ((emudrive ^ extdrive) & 0x80) == 0) diff --git a/src/hw/ahci.c b/src/hw/ahci.c index 82a6194..a4ef5c5 100644 --- a/src/hw/ahci.c +++ b/src/hw/ahci.c @@ -102,15 +102,15 @@ static void ahci_port_writel(struct ahci_ctrl_s *ctrl, u32 pnr, u32 reg, u32 val }
// submit ahci command + wait for result -static int ahci_command(struct ahci_port_s *port, int iswrite, int isatapi, +static int ahci_command(struct ahci_port_s *port_gf, int iswrite, int isatapi, void *buffer, u32 bsize) { u32 val, status, success, flags, intbits, error; - struct ahci_ctrl_s *ctrl = GET_GLOBAL(port->ctrl); - struct ahci_cmd_s *cmd = GET_GLOBAL(port->cmd); - struct ahci_fis_s *fis = GET_GLOBAL(port->fis); - struct ahci_list_s *list = GET_GLOBAL(port->list); - u32 pnr = GET_GLOBAL(port->pnr); + struct ahci_ctrl_s *ctrl = GET_GLOBALFLAT(port_gf->ctrl); + struct ahci_cmd_s *cmd = GET_GLOBALFLAT(port_gf->cmd); + struct ahci_fis_s *fis = GET_GLOBALFLAT(port_gf->fis); + struct ahci_list_s *list = GET_GLOBALFLAT(port_gf->list); + u32 pnr = GET_GLOBALFLAT(port_gf->pnr);
SET_LOWFLAT(cmd->fis.reg, 0x27); SET_LOWFLAT(cmd->fis.pmp_type, (1 << 7)); /* cmd fis */ @@ -218,9 +218,9 @@ int ahci_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) if (! CONFIG_AHCI) return 0;
- struct ahci_port_s *port = container_of( - op->drive_g, struct ahci_port_s, drive); - struct ahci_cmd_s *cmd = GET_GLOBAL(port->cmd); + struct ahci_port_s *port_gf = container_of( + op->drive_gf, struct ahci_port_s, drive); + struct ahci_cmd_s *cmd = GET_GLOBALFLAT(port_gf->cmd); u8 *atapi = cdbcmd; int i, rc;
@@ -228,7 +228,7 @@ int ahci_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) for (i = 0; i < CDROM_CDB_SIZE; i++) { SET_LOWFLAT(cmd->atapi[i], atapi[i]); } - rc = ahci_command(port, 0, 1, op->buf_fl, + rc = ahci_command(port_gf, 0, 1, op->buf_fl, op->count * blocksize); if (rc < 0) return DISK_RET_EBADTRACK; @@ -239,13 +239,13 @@ int ahci_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) static int ahci_disk_readwrite_aligned(struct disk_op_s *op, int iswrite) { - struct ahci_port_s *port = container_of( - op->drive_g, struct ahci_port_s, drive); - struct ahci_cmd_s *cmd = GET_GLOBAL(port->cmd); + struct ahci_port_s *port_gf = container_of( + op->drive_gf, struct ahci_port_s, drive); + struct ahci_cmd_s *cmd = GET_GLOBALFLAT(port_gf->cmd); int rc;
sata_prep_readwrite(&cmd->fis, op, iswrite); - rc = ahci_command(port, iswrite, 0, op->buf_fl, + rc = ahci_command(port_gf, iswrite, 0, op->buf_fl, op->count * DISK_SECTOR_SIZE); dprintf(8, "ahci disk %s, lba %6x, count %3x, buf %p, rc %d\n", iswrite ? "write" : "read", (u32)op->lba, op->count, op->buf_fl, rc); diff --git a/src/hw/ata.c b/src/hw/ata.c index e5ef685..de2a919 100644 --- a/src/hw/ata.c +++ b/src/hw/ata.c @@ -6,7 +6,7 @@ // This file may be distributed under the terms of the GNU LGPLv3 license.
#include "ata.h" // ATA_CB_STAT -#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // struct drive_s #include "blockcmd.h" // CDB_CMD_READ_10 #include "byteorder.h" // be16_to_cpu @@ -80,14 +80,14 @@ ndelay_await_not_bsy(u16 iobase1)
// Reset a drive static void -ata_reset(struct atadrive_s *adrive_g) +ata_reset(struct atadrive_s *adrive_gf) { - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); - u8 slave = GET_GLOBAL(adrive_g->slave); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); + u8 slave = GET_GLOBALFLAT(adrive_gf->slave); u16 iobase1 = GET_GLOBALFLAT(chan_gf->iobase1); u16 iobase2 = GET_GLOBALFLAT(chan_gf->iobase2);
- dprintf(6, "ata_reset drive=%p\n", &adrive_g->drive); + dprintf(6, "ata_reset drive=%p\n", &adrive_gf->drive); // Pulse SRST outb(ATA_CB_DC_HD15 | ATA_CB_DC_NIEN | ATA_CB_DC_SRST, iobase2+ATA_CB_DC); udelay(5); @@ -120,7 +120,7 @@ ata_reset(struct atadrive_s *adrive_g) }
// On a user-reset request, wait for RDY if it is an ATA device. - u8 type=GET_GLOBAL(adrive_g->drive.type); + u8 type=GET_GLOBALFLAT(adrive_gf->drive.type); if (type == DTYPE_ATA) status = await_rdy(iobase1);
@@ -133,10 +133,10 @@ done:
// Check for drive RDY for 16bit interface command. static int -isready(struct atadrive_s *adrive_g) +isready(struct atadrive_s *adrive_gf) { // Read the status from controller - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); u16 iobase1 = GET_GLOBALFLAT(chan_gf->iobase1); u8 status = inb(iobase1 + ATA_CB_STAT); if ((status & (ATA_CB_STAT_BSY|ATA_CB_STAT_RDY)) == ATA_CB_STAT_RDY) @@ -167,10 +167,10 @@ struct ata_pio_command {
// Send an ata command to the drive. static int -send_cmd(struct atadrive_s *adrive_g, struct ata_pio_command *cmd) +send_cmd(struct atadrive_s *adrive_gf, struct ata_pio_command *cmd) { - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); - u8 slave = GET_GLOBAL(adrive_g->slave); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); + u8 slave = GET_GLOBALFLAT(adrive_gf->slave); u16 iobase1 = GET_GLOBALFLAT(chan_gf->iobase1);
// Select device @@ -229,16 +229,16 @@ ata_wait_data(u16 iobase1)
// Send an ata command that does not transfer any further data. int -ata_cmd_nondata(struct atadrive_s *adrive_g, struct ata_pio_command *cmd) +ata_cmd_nondata(struct atadrive_s *adrive_gf, struct ata_pio_command *cmd) { - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); u16 iobase1 = GET_GLOBALFLAT(chan_gf->iobase1); u16 iobase2 = GET_GLOBALFLAT(chan_gf->iobase2);
// Disable interrupts outb(ATA_CB_DC_HD15 | ATA_CB_DC_NIEN, iobase2 + ATA_CB_DC);
- int ret = send_cmd(adrive_g, cmd); + int ret = send_cmd(adrive_gf, cmd); if (ret) goto fail; ret = ndelay_await_not_bsy(iobase1); @@ -270,16 +270,16 @@ fail: ****************************************************************/
// Transfer 'op->count' blocks (of 'blocksize' bytes) to/from drive -// 'op->drive_g'. +// 'op->drive_gf'. static int ata_pio_transfer(struct disk_op_s *op, int iswrite, int blocksize) { dprintf(16, "ata_pio_transfer id=%p write=%d count=%d bs=%d buf=%p\n" - , op->drive_g, iswrite, op->count, blocksize, op->buf_fl); + , op->drive_gf, iswrite, op->count, blocksize, op->buf_fl);
- struct atadrive_s *adrive_g = container_of( - op->drive_g, struct atadrive_s, drive); - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); + struct atadrive_s *adrive_gf = container_of( + op->drive_gf, struct atadrive_s, drive); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); u16 iobase1 = GET_GLOBALFLAT(chan_gf->iobase1); u16 iobase2 = GET_GLOBALFLAT(chan_gf->iobase2); int count = op->count; @@ -288,14 +288,14 @@ ata_pio_transfer(struct disk_op_s *op, int iswrite, int blocksize) for (;;) { if (iswrite) { // Write data to controller - dprintf(16, "Write sector id=%p dest=%p\n", op->drive_g, buf_fl); + dprintf(16, "Write sector id=%p dest=%p\n", op->drive_gf, buf_fl); if (CONFIG_ATA_PIO32) outsl_fl(iobase1, buf_fl, blocksize / 4); else outsw_fl(iobase1, buf_fl, blocksize / 2); } else { // Read data from controller - dprintf(16, "Read sector id=%p dest=%p\n", op->drive_g, buf_fl); + dprintf(16, "Read sector id=%p dest=%p\n", op->drive_gf, buf_fl); if (CONFIG_ATA_PIO32) insl_fl(iobase1, buf_fl, blocksize / 4); else @@ -364,9 +364,9 @@ ata_try_dma(struct disk_op_s *op, int iswrite, int blocksize) if (dest & 1) // Need minimum alignment of 1. return -1; - struct atadrive_s *adrive_g = container_of( - op->drive_g, struct atadrive_s, drive); - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); + struct atadrive_s *adrive_gf = container_of( + op->drive_gf, struct atadrive_s, drive); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); u16 iomaster = GET_GLOBALFLAT(chan_gf->iomaster); if (! iomaster) return -1; @@ -412,11 +412,11 @@ ata_dma_transfer(struct disk_op_s *op) { if (! CONFIG_ATA_DMA) return -1; - dprintf(16, "ata_dma_transfer id=%p buf=%p\n", op->drive_g, op->buf_fl); + dprintf(16, "ata_dma_transfer id=%p buf=%p\n", op->drive_gf, op->buf_fl);
- struct atadrive_s *adrive_g = container_of( - op->drive_g, struct atadrive_s, drive); - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); + struct atadrive_s *adrive_gf = container_of( + op->drive_gf, struct atadrive_s, drive); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); u16 iomaster = GET_GLOBALFLAT(chan_gf->iomaster);
// Start bus-master controller. @@ -465,16 +465,16 @@ ata_dma_transfer(struct disk_op_s *op) static int ata_pio_cmd_data(struct disk_op_s *op, int iswrite, struct ata_pio_command *cmd) { - struct atadrive_s *adrive_g = container_of( - op->drive_g, struct atadrive_s, drive); - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); + struct atadrive_s *adrive_gf = container_of( + op->drive_gf, struct atadrive_s, drive); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); u16 iobase1 = GET_GLOBALFLAT(chan_gf->iobase1); u16 iobase2 = GET_GLOBALFLAT(chan_gf->iobase2);
// Disable interrupts outb(ATA_CB_DC_HD15 | ATA_CB_DC_NIEN, iobase2 + ATA_CB_DC);
- int ret = send_cmd(adrive_g, cmd); + int ret = send_cmd(adrive_gf, cmd); if (ret) goto fail; ret = ata_wait_data(iobase1); @@ -494,9 +494,9 @@ ata_dma_cmd_data(struct disk_op_s *op, struct ata_pio_command *cmd) { if (! CONFIG_ATA_DMA) return -1; - struct atadrive_s *adrive_g = container_of( - op->drive_g, struct atadrive_s, drive); - int ret = send_cmd(adrive_g, cmd); + struct atadrive_s *adrive_gf = container_of( + op->drive_gf, struct atadrive_s, drive); + int ret = send_cmd(adrive_gf, cmd); if (ret) return ret; return ata_dma_transfer(op); @@ -558,18 +558,18 @@ process_ata_op(struct disk_op_s *op) if (!CONFIG_ATA) return 0;
- struct atadrive_s *adrive_g = container_of( - op->drive_g, struct atadrive_s, drive); + struct atadrive_s *adrive_gf = container_of( + op->drive_gf, struct atadrive_s, drive); switch (op->command) { case CMD_READ: return ata_readwrite(op, 0); case CMD_WRITE: return ata_readwrite(op, 1); case CMD_RESET: - ata_reset(adrive_g); + ata_reset(adrive_gf); return DISK_RET_SUCCESS; case CMD_ISREADY: - return isready(adrive_g); + return isready(adrive_gf); case CMD_FORMAT: case CMD_VERIFY: case CMD_SEEK: @@ -594,9 +594,9 @@ atapi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) if (! CONFIG_ATA) return 0;
- struct atadrive_s *adrive_g = container_of( - op->drive_g, struct atadrive_s, drive); - struct ata_channel_s *chan_gf = GET_GLOBAL(adrive_g->chan_gf); + struct atadrive_s *adrive_gf = container_of( + op->drive_gf, struct atadrive_s, drive); + struct ata_channel_s *chan_gf = GET_GLOBALFLAT(adrive_gf->chan_gf); u16 iobase1 = GET_GLOBALFLAT(chan_gf->iobase1); u16 iobase2 = GET_GLOBALFLAT(chan_gf->iobase2);
@@ -609,7 +609,7 @@ atapi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) // Disable interrupts outb(ATA_CB_DC_HD15 | ATA_CB_DC_NIEN, iobase2 + ATA_CB_DC);
- int ret = send_cmd(adrive_g, &cmd); + int ret = send_cmd(adrive_gf, &cmd); if (ret) goto fail; ret = ata_wait_data(iobase1); @@ -659,13 +659,13 @@ fail:
// Send an identify device or identify device packet command. static int -send_ata_identity(struct atadrive_s *adrive_g, u16 *buffer, int command) +send_ata_identity(struct atadrive_s *adrive, u16 *buffer, int command) { memset(buffer, 0, DISK_SECTOR_SIZE);
struct disk_op_s dop; memset(&dop, 0, sizeof(dop)); - dop.drive_g = &adrive_g->drive; + dop.drive_gf = &adrive->drive; dop.count = 1; dop.lba = 1; dop.buf_fl = MAKE_FLATPTR(GET_SEG(SS), buffer); @@ -709,17 +709,17 @@ ata_extract_model(char *model, u32 size, u16 *buffer) static struct atadrive_s * init_atadrive(struct atadrive_s *dummy, u16 *buffer) { - struct atadrive_s *adrive_g = malloc_fseg(sizeof(*adrive_g)); - if (!adrive_g) { + struct atadrive_s *adrive = malloc_fseg(sizeof(*adrive)); + if (!adrive) { warn_noalloc(); return NULL; } - memset(adrive_g, 0, sizeof(*adrive_g)); - adrive_g->chan_gf = dummy->chan_gf; - adrive_g->slave = dummy->slave; - adrive_g->drive.cntl_id = adrive_g->chan_gf->chanid * 2 + dummy->slave; - adrive_g->drive.removable = (buffer[0] & 0x80) ? 1 : 0; - return adrive_g; + memset(adrive, 0, sizeof(*adrive)); + adrive->chan_gf = dummy->chan_gf; + adrive->slave = dummy->slave; + adrive->drive.cntl_id = adrive->chan_gf->chanid * 2 + dummy->slave; + adrive->drive.removable = (buffer[0] & 0x80) ? 1 : 0; + return adrive; }
// Detect if the given drive is an atapi - initialize it if so. @@ -732,17 +732,17 @@ init_drive_atapi(struct atadrive_s *dummy, u16 *buffer) return NULL;
// Success - setup as ATAPI. - struct atadrive_s *adrive_g = init_atadrive(dummy, buffer); - if (!adrive_g) + struct atadrive_s *adrive = init_atadrive(dummy, buffer); + if (!adrive) return NULL; - adrive_g->drive.type = DTYPE_ATA_ATAPI; - adrive_g->drive.blksize = CDROM_SECTOR_SIZE; - adrive_g->drive.sectors = (u64)-1; + adrive->drive.type = DTYPE_ATA_ATAPI; + adrive->drive.blksize = CDROM_SECTOR_SIZE; + adrive->drive.sectors = (u64)-1; u8 iscd = ((buffer[0] >> 8) & 0x1f) == 0x05; char model[MAXMODEL+1]; char *desc = znprintf(MAXDESCSIZE , "DVD/CD [ata%d-%d: %s ATAPI-%d %s]" - , adrive_g->chan_gf->chanid, adrive_g->slave + , adrive->chan_gf->chanid, adrive->slave , ata_extract_model(model, MAXMODEL, buffer) , ata_extract_version(buffer) , (iscd ? "DVD/CD" : "Device")); @@ -750,13 +750,13 @@ init_drive_atapi(struct atadrive_s *dummy, u16 *buffer)
// fill cdidmap if (iscd) { - int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_tmp, - adrive_g->chan_gf->chanid, - adrive_g->slave); - boot_add_cd(&adrive_g->drive, desc, prio); + int prio = bootprio_find_ata_device(adrive->chan_gf->pci_tmp, + adrive->chan_gf->chanid, + adrive->slave); + boot_add_cd(&adrive->drive, desc, prio); }
- return adrive_g; + return adrive; }
// Detect if the given drive is a regular ata drive - initialize it if so. @@ -769,22 +769,22 @@ init_drive_ata(struct atadrive_s *dummy, u16 *buffer) return NULL;
// Success - setup as ATA. - struct atadrive_s *adrive_g = init_atadrive(dummy, buffer); - if (!adrive_g) + struct atadrive_s *adrive = init_atadrive(dummy, buffer); + if (!adrive) return NULL; - adrive_g->drive.type = DTYPE_ATA; - adrive_g->drive.blksize = DISK_SECTOR_SIZE; + adrive->drive.type = DTYPE_ATA; + adrive->drive.blksize = DISK_SECTOR_SIZE;
- adrive_g->drive.pchs.cylinder = buffer[1]; - adrive_g->drive.pchs.head = buffer[3]; - adrive_g->drive.pchs.sector = buffer[6]; + adrive->drive.pchs.cylinder = buffer[1]; + adrive->drive.pchs.head = buffer[3]; + adrive->drive.pchs.sector = buffer[6];
u64 sectors; if (buffer[83] & (1 << 10)) // word 83 - lba48 support sectors = *(u64*)&buffer[100]; // word 100-103 else sectors = *(u32*)&buffer[60]; // word 60 and word 61 - adrive_g->drive.sectors = sectors; + adrive->drive.sectors = sectors; u64 adjsize = sectors >> 11; char adjprefix = 'M'; if (adjsize >= (1 << 16)) { @@ -794,19 +794,19 @@ init_drive_ata(struct atadrive_s *dummy, u16 *buffer) char model[MAXMODEL+1]; char *desc = znprintf(MAXDESCSIZE , "ata%d-%d: %s ATA-%d Hard-Disk (%u %ciBytes)" - , adrive_g->chan_gf->chanid, adrive_g->slave + , adrive->chan_gf->chanid, adrive->slave , ata_extract_model(model, MAXMODEL, buffer) , ata_extract_version(buffer) , (u32)adjsize, adjprefix); dprintf(1, "%s\n", desc);
- int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_tmp, - adrive_g->chan_gf->chanid, - adrive_g->slave); + int prio = bootprio_find_ata_device(adrive->chan_gf->pci_tmp, + adrive->chan_gf->chanid, + adrive->slave); // Register with bcv system. - boot_add_hd(&adrive_g->drive, desc, prio); + boot_add_hd(&adrive->drive, desc, prio);
- return adrive_g; + return adrive; }
static u32 SpinupEnd; @@ -883,8 +883,8 @@ ata_detect(void *data)
// check for ATAPI u16 buffer[256]; - struct atadrive_s *adrive_g = init_drive_atapi(&dummy, buffer); - if (!adrive_g) { + struct atadrive_s *adrive = init_drive_atapi(&dummy, buffer); + if (!adrive) { // Didn't find an ATAPI drive - look for ATA drive. u8 st = inb(iobase1+ATA_CB_STAT); if (!st) @@ -897,8 +897,8 @@ ata_detect(void *data) continue;
// check for ATA. - adrive_g = init_drive_ata(&dummy, buffer); - if (!adrive_g) + adrive = init_drive_ata(&dummy, buffer); + if (!adrive) // No ATA drive found continue; } diff --git a/src/hw/blockcmd.c b/src/hw/blockcmd.c index 7b07ab6..96950f2 100644 --- a/src/hw/blockcmd.c +++ b/src/hw/blockcmd.c @@ -7,7 +7,7 @@
#include "ahci.h" // atapi_cmd_data #include "ata.h" // atapi_cmd_data -#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // struct disk_op_s #include "blockcmd.h" // struct cdb_request_sense #include "byteorder.h" // be32_to_cpu @@ -27,7 +27,7 @@ static int cdb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) { - u8 type = GET_GLOBAL(op->drive_g->type); + u8 type = GET_GLOBALFLAT(op->drive_gf->type); switch (type) { case DTYPE_ATA_ATAPI: return atapi_cmd_data(op, cdbcmd, blocksize); @@ -64,7 +64,7 @@ cdb_is_read(u8 *cdbcmd, u16 blocksize) int scsi_is_ready(struct disk_op_s *op) { - dprintf(6, "scsi_is_ready (drive=%p)\n", op->drive_g); + dprintf(6, "scsi_is_ready (drive=%p)\n", op->drive_gf);
/* Retry TEST UNIT READY for 5 seconds unless MEDIUM NOT PRESENT is * reported by the device. If the device reports "IN PROGRESS", @@ -111,7 +111,7 @@ scsi_drive_setup(struct drive_s *drive, const char *s, int prio) { struct disk_op_s dop; memset(&dop, 0, sizeof(dop)); - dop.drive_g = drive; + dop.drive_gf = drive; struct cdbres_inquiry data; int ret = cdb_get_inquiry(&dop, &data); if (ret) @@ -268,7 +268,7 @@ cdb_read(struct disk_op_s *op) cmd.command = CDB_CMD_READ_10; cmd.lba = cpu_to_be32(op->lba); cmd.count = cpu_to_be16(op->count); - return cdb_cmd_data(op, &cmd, GET_GLOBAL(op->drive_g->blksize)); + return cdb_cmd_data(op, &cmd, GET_GLOBALFLAT(op->drive_gf->blksize)); }
// Write sectors. @@ -280,5 +280,5 @@ cdb_write(struct disk_op_s *op) cmd.command = CDB_CMD_WRITE_10; cmd.lba = cpu_to_be32(op->lba); cmd.count = cpu_to_be16(op->count); - return cdb_cmd_data(op, &cmd, GET_GLOBAL(op->drive_g->blksize)); + return cdb_cmd_data(op, &cmd, GET_GLOBALFLAT(op->drive_gf->blksize)); } diff --git a/src/hw/esp-scsi.c b/src/hw/esp-scsi.c index 118a1f5..982c1d5 100644 --- a/src/hw/esp-scsi.c +++ b/src/hw/esp-scsi.c @@ -10,7 +10,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // struct drive_s #include "blockcmd.h" // scsi_drive_setup #include "config.h" // CONFIG_* @@ -77,10 +77,10 @@ esp_scsi_dma(u32 iobase, u32 buf, u32 len, int read) }
static int -esp_scsi_cmd(struct esp_lun_s *llun, struct disk_op_s *op, +esp_scsi_cmd(struct esp_lun_s *llun_gf, struct disk_op_s *op, u8 *cdbcmd, u16 target, u16 lun, u16 blocksize) { - u32 iobase = GET_GLOBAL(llun->iobase); + u32 iobase = GET_GLOBALFLAT(llun_gf->iobase); int i, state; u8 status;
@@ -150,11 +150,12 @@ esp_scsi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) if (!CONFIG_ESP_SCSI) return DISK_RET_EBADTRACK;
- struct esp_lun_s *llun = - container_of(op->drive_g, struct esp_lun_s, drive); + struct esp_lun_s *llun_gf = + container_of(op->drive_gf, struct esp_lun_s, drive);
- return esp_scsi_cmd(llun, op, cdbcmd, - GET_GLOBAL(llun->target), GET_GLOBAL(llun->lun), + return esp_scsi_cmd(llun_gf, op, cdbcmd, + GET_GLOBALFLAT(llun_gf->target), + GET_GLOBALFLAT(llun_gf->lun), blocksize); }
diff --git a/src/hw/floppy.c b/src/hw/floppy.c index 7f63bcc..e73b303 100644 --- a/src/hw/floppy.c +++ b/src/hw/floppy.c @@ -103,33 +103,33 @@ init_floppy(int floppyid, int ftype) return NULL; }
- struct drive_s *drive_g = malloc_fseg(sizeof(*drive_g)); - if (!drive_g) { + struct drive_s *drive = malloc_fseg(sizeof(*drive)); + if (!drive) { warn_noalloc(); return NULL; } - memset(drive_g, 0, sizeof(*drive_g)); - drive_g->cntl_id = floppyid; - drive_g->type = DTYPE_FLOPPY; - drive_g->blksize = DISK_SECTOR_SIZE; - drive_g->floppy_type = ftype; - drive_g->sectors = (u64)-1; - - memcpy(&drive_g->lchs, &FloppyInfo[ftype].chs + memset(drive, 0, sizeof(*drive)); + drive->cntl_id = floppyid; + drive->type = DTYPE_FLOPPY; + drive->blksize = DISK_SECTOR_SIZE; + drive->floppy_type = ftype; + drive->sectors = (u64)-1; + + memcpy(&drive->lchs, &FloppyInfo[ftype].chs , sizeof(FloppyInfo[ftype].chs)); - return drive_g; + return drive; }
static void addFloppy(int floppyid, int ftype) { - struct drive_s *drive_g = init_floppy(floppyid, ftype); - if (!drive_g) + struct drive_s *drive = init_floppy(floppyid, ftype); + if (!drive) return; char *desc = znprintf(MAXDESCSIZE, "Floppy [drive %c]", 'A' + floppyid); struct pci_device *pci = pci_find_class(PCI_CLASS_BRIDGE_ISA); /* isa-to-pci bridge */ int prio = bootprio_find_fdc_device(pci, PORT_FD_BASE, floppyid); - boot_add_floppy(drive_g, desc, prio); + boot_add_floppy(drive, desc, prio); }
void @@ -376,10 +376,10 @@ floppy_drive_readid(u8 floppyid, u8 data_rate, u8 head) }
static int -floppy_media_sense(struct drive_s *drive_g) +floppy_media_sense(struct drive_s *drive_gf) { - u8 ftype = GET_GLOBAL(drive_g->floppy_type), stype = ftype; - u8 floppyid = GET_GLOBAL(drive_g->cntl_id); + u8 ftype = GET_GLOBALFLAT(drive_gf->floppy_type), stype = ftype; + u8 floppyid = GET_GLOBALFLAT(drive_gf->cntl_id);
u8 data_rate = GET_GLOBAL(FloppyInfo[stype].data_rate); int ret = floppy_drive_readid(floppyid, data_rate, 0); @@ -418,9 +418,9 @@ floppy_media_sense(struct drive_s *drive_g) }
static int -check_recal_drive(struct drive_s *drive_g) +check_recal_drive(struct drive_s *drive_gf) { - u8 floppyid = GET_GLOBAL(drive_g->cntl_id); + u8 floppyid = GET_GLOBALFLAT(drive_gf->cntl_id); if ((GET_BDA(floppy_recalibration_status) & (1<<floppyid)) && (GET_BDA(floppy_media_state[floppyid]) & FMS_MEDIA_DRIVE_ESTABLISHED)) // Media is known. @@ -432,7 +432,7 @@ check_recal_drive(struct drive_s *drive_g) return ret;
// Sense media. - return floppy_media_sense(drive_g); + return floppy_media_sense(drive_gf); }
@@ -444,7 +444,7 @@ check_recal_drive(struct drive_s *drive_g) static int floppy_cmd(struct disk_op_s *op, int blocksize, struct floppy_pio_s *pio) { - int ret = check_recal_drive(op->drive_g); + int ret = check_recal_drive(op->drive_gf); if (ret) return ret;
@@ -496,11 +496,11 @@ lba2chs(struct disk_op_s *op) u32 lba = op->lba;
u32 tmp = lba + 1; - u16 nls = GET_GLOBAL(op->drive_g->lchs.sector); + u16 nls = GET_GLOBALFLAT(op->drive_gf->lchs.sector); res.sector = tmp % nls;
tmp /= nls; - u16 nlh = GET_GLOBAL(op->drive_g->lchs.head); + u16 nlh = GET_GLOBALFLAT(op->drive_gf->lchs.head); res.head = tmp % nlh;
tmp /= nlh; @@ -513,7 +513,7 @@ lba2chs(struct disk_op_s *op) static int floppy_reset(struct disk_op_s *op) { - u8 floppyid = GET_GLOBAL(op->drive_g->cntl_id); + u8 floppyid = GET_GLOBALFLAT(op->drive_gf->cntl_id); SET_BDA(floppy_recalibration_status, 0); SET_BDA(floppy_media_state[0], 0); SET_BDA(floppy_media_state[1], 0); @@ -531,7 +531,7 @@ floppy_read(struct disk_op_s *op) struct chs_s chs = lba2chs(op);
// send read-normal-data command (9 bytes) to controller - u8 floppyid = GET_GLOBAL(op->drive_g->cntl_id); + u8 floppyid = GET_GLOBALFLAT(op->drive_gf->cntl_id); struct floppy_pio_s pio; pio.cmdlen = 9; pio.data[0] = 0xe6; // e6: read normal data @@ -560,7 +560,7 @@ floppy_write(struct disk_op_s *op) struct chs_s chs = lba2chs(op);
// send write-normal-data command (9 bytes) to controller - u8 floppyid = GET_GLOBAL(op->drive_g->cntl_id); + u8 floppyid = GET_GLOBALFLAT(op->drive_gf->cntl_id); struct floppy_pio_s pio; pio.cmdlen = 9; pio.data[0] = 0xc5; // c5: write normal data @@ -586,14 +586,14 @@ fail: static int floppy_verify(struct disk_op_s *op) { - int res = check_recal_drive(op->drive_g); + int res = check_recal_drive(op->drive_gf); if (res) goto fail;
struct chs_s chs = lba2chs(op);
// ??? should track be new val from return_status[3] ? - u8 floppyid = GET_GLOBAL(op->drive_g->cntl_id); + u8 floppyid = GET_GLOBALFLAT(op->drive_gf->cntl_id); set_diskette_current_cyl(floppyid, chs.cylinder); return DISK_RET_SUCCESS; fail: @@ -608,7 +608,7 @@ floppy_format(struct disk_op_s *op) u8 head = op->lba;
// send format-track command (6 bytes) to controller - u8 floppyid = GET_GLOBAL(op->drive_g->cntl_id); + u8 floppyid = GET_GLOBALFLAT(op->drive_gf->cntl_id); struct floppy_pio_s pio; pio.cmdlen = 6; pio.data[0] = 0x4d; // 4d: format track diff --git a/src/hw/lsi-scsi.c b/src/hw/lsi-scsi.c index 021aa61..b1d6bbf 100644 --- a/src/hw/lsi-scsi.c +++ b/src/hw/lsi-scsi.c @@ -10,7 +10,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // struct drive_s #include "blockcmd.h" // scsi_drive_setup #include "config.h" // CONFIG_* @@ -51,10 +51,10 @@ struct lsi_lun_s { };
static int -lsi_scsi_cmd(struct lsi_lun_s *llun, struct disk_op_s *op, +lsi_scsi_cmd(struct lsi_lun_s *llun_gf, struct disk_op_s *op, void *cdbcmd, u16 target, u16 lun, u16 blocksize) { - u32 iobase = GET_GLOBAL(llun->iobase); + u32 iobase = GET_GLOBALFLAT(llun_gf->iobase); u32 dma = ((cdb_is_read(cdbcmd, blocksize) ? 0x01000000 : 0x00000000) | (op->count * blocksize)); u8 msgout[] = { @@ -128,11 +128,12 @@ lsi_scsi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) if (!CONFIG_LSI_SCSI) return DISK_RET_EBADTRACK;
- struct lsi_lun_s *llun = - container_of(op->drive_g, struct lsi_lun_s, drive); + struct lsi_lun_s *llun_gf = + container_of(op->drive_gf, struct lsi_lun_s, drive);
- return lsi_scsi_cmd(llun, op, cdbcmd, - GET_GLOBAL(llun->target), GET_GLOBAL(llun->lun), + return lsi_scsi_cmd(llun_gf, op, cdbcmd, + GET_GLOBALFLAT(llun_gf->target), + GET_GLOBALFLAT(llun_gf->lun), blocksize); }
diff --git a/src/hw/megasas.c b/src/hw/megasas.c index ebc49f9..3ded877 100644 --- a/src/hw/megasas.c +++ b/src/hw/megasas.c @@ -10,7 +10,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // struct drive_s #include "blockcmd.h" // scsi_drive_setup #include "config.h" // CONFIG_* @@ -159,11 +159,11 @@ static int megasas_fire_cmd(u16 pci_id, u32 ioaddr, int megasas_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) { - struct megasas_lun_s *mlun = - container_of(op->drive_g, struct megasas_lun_s, drive); + struct megasas_lun_s *mlun_gf = + container_of(op->drive_gf, struct megasas_lun_s, drive); u8 *cdb = cdbcmd; - struct megasas_cmd_frame *frame = GET_GLOBAL(mlun->frame); - u16 pci_id = GET_GLOBAL(mlun->pci->device); + struct megasas_cmd_frame *frame = GET_GLOBALFLAT(mlun_gf->frame); + u16 pci_id = GET_GLOBALFLAT(mlun_gf->pci->device); int i;
if (!CONFIG_MEGASAS) @@ -172,8 +172,8 @@ megasas_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) memset_fl(frame, 0, sizeof(*frame)); SET_LOWFLAT(frame->cmd, MFI_CMD_LD_SCSI_IO); SET_LOWFLAT(frame->cmd_status, 0xFF); - SET_LOWFLAT(frame->target_id, GET_GLOBAL(mlun->target)); - SET_LOWFLAT(frame->lun, GET_GLOBAL(mlun->lun)); + SET_LOWFLAT(frame->target_id, GET_GLOBALFLAT(mlun_gf->target)); + SET_LOWFLAT(frame->lun, GET_GLOBALFLAT(mlun_gf->lun)); SET_LOWFLAT(frame->flags, 0x0001); SET_LOWFLAT(frame->data_xfer_len, op->count * blocksize); SET_LOWFLAT(frame->cdb_len, 16); @@ -191,7 +191,7 @@ megasas_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) } SET_LOWFLAT(frame->context, (u32)frame);
- if (megasas_fire_cmd(pci_id, GET_GLOBAL(mlun->iobase), frame) == 0) + if (megasas_fire_cmd(pci_id, GET_GLOBALFLAT(mlun_gf->iobase), frame) == 0) return DISK_RET_SUCCESS;
dprintf(2, "pthru cmd 0x%x failed\n", cdb[0]); diff --git a/src/hw/pvscsi.c b/src/hw/pvscsi.c index 740a74b..6911230 100644 --- a/src/hw/pvscsi.c +++ b/src/hw/pvscsi.c @@ -7,7 +7,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // struct drive_s #include "blockcmd.h" // scsi_drive_setup #include "config.h" // CONFIG_* @@ -234,10 +234,10 @@ pvscsi_get_rsp(struct PVSCSIRingsState *s, }
static int -pvscsi_cmd(struct pvscsi_lun_s *plun, struct disk_op_s *op, +pvscsi_cmd(struct pvscsi_lun_s *plun_gf, struct disk_op_s *op, void *cdbcmd, u16 target, u16 lun, u16 blocksize) { - struct pvscsi_ring_dsc_s *ring_dsc = GET_GLOBAL(plun->ring_dsc); + struct pvscsi_ring_dsc_s *ring_dsc = GET_GLOBALFLAT(plun_gf->ring_dsc); struct PVSCSIRingsState *s = GET_LOWFLAT(ring_dsc->ring_state); u32 req_entries = GET_LOWFLAT(s->reqNumEntriesLog2); u32 cmp_entries = GET_LOWFLAT(s->cmpNumEntriesLog2); @@ -254,8 +254,8 @@ pvscsi_cmd(struct pvscsi_lun_s *plun, struct disk_op_s *op, req = GET_LOWFLAT(ring_dsc->ring_reqs) + (GET_LOWFLAT(s->reqProdIdx) & MASK(req_entries)); pvscsi_fill_req(s, req, target, lun, cdbcmd, blocksize, op);
- pvscsi_kick_rw_io(GET_GLOBAL(plun->iobase)); - pvscsi_wait_intr_cmpl(GET_GLOBAL(plun->iobase)); + pvscsi_kick_rw_io(GET_GLOBALFLAT(plun_gf->iobase)); + pvscsi_wait_intr_cmpl(GET_GLOBALFLAT(plun_gf->iobase));
rsp = GET_LOWFLAT(ring_dsc->ring_cmps) + (GET_LOWFLAT(s->cmpConsIdx) & MASK(cmp_entries)); status = pvscsi_get_rsp(s, rsp); @@ -269,11 +269,12 @@ pvscsi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) if (!CONFIG_PVSCSI) return DISK_RET_EBADTRACK;
- struct pvscsi_lun_s *plun = - container_of(op->drive_g, struct pvscsi_lun_s, drive); + struct pvscsi_lun_s *plun_gf = + container_of(op->drive_gf, struct pvscsi_lun_s, drive);
- return pvscsi_cmd(plun, op, cdbcmd, - GET_GLOBAL(plun->target), GET_GLOBAL(plun->lun), + return pvscsi_cmd(plun_gf, op, cdbcmd, + GET_GLOBALFLAT(plun_gf->target), + GET_GLOBALFLAT(plun_gf->lun), blocksize);
} diff --git a/src/hw/ramdisk.c b/src/hw/ramdisk.c index eeddf25..81aed50 100644 --- a/src/hw/ramdisk.c +++ b/src/hw/ramdisk.c @@ -4,7 +4,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // struct drive_s #include "bregs.h" // struct bregs #include "malloc.h" // malloc_fseg @@ -49,19 +49,19 @@ ramdisk_setup(void) return;
// Setup driver. - struct drive_s *drive_g = init_floppy((u32)pos, ftype); - if (!drive_g) + struct drive_s *drive = init_floppy((u32)pos, ftype); + if (!drive) return; - drive_g->type = DTYPE_RAMDISK; + drive->type = DTYPE_RAMDISK; dprintf(1, "Mapping CBFS floppy %s to addr %p\n", filename, pos); char *desc = znprintf(MAXDESCSIZE, "Ramdisk [%s]", &filename[10]); - boot_add_floppy(drive_g, desc, bootprio_find_named_rom(filename, 0)); + boot_add_floppy(drive, desc, bootprio_find_named_rom(filename, 0)); }
static int ramdisk_copy(struct disk_op_s *op, int iswrite) { - u32 offset = GET_GLOBAL(op->drive_g->cntl_id); + u32 offset = GET_GLOBALFLAT(op->drive_gf->cntl_id); offset += (u32)op->lba * DISK_SECTOR_SIZE; u64 opd = GDT_DATA | GDT_LIMIT(0xfffff) | GDT_BASE((u32)op->buf_fl); u64 ramd = GDT_DATA | GDT_LIMIT(0xfffff) | GDT_BASE(offset); diff --git a/src/hw/usb-msc.c b/src/hw/usb-msc.c index 8ee448f..7e2e440 100644 --- a/src/hw/usb-msc.c +++ b/src/hw/usb-msc.c @@ -4,7 +4,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // DTYPE_USB #include "blockcmd.h" // cdb_read #include "config.h" // CONFIG_USB_MSC @@ -51,13 +51,13 @@ struct csw_s { } PACKED;
static int -usb_msc_send(struct usbdrive_s *udrive_g, int dir, void *buf, u32 bytes) +usb_msc_send(struct usbdrive_s *udrive_gf, int dir, void *buf, u32 bytes) { struct usb_pipe *pipe; if (dir == USB_DIR_OUT) - pipe = GET_GLOBAL(udrive_g->bulkout); + pipe = GET_GLOBALFLAT(udrive_gf->bulkout); else - pipe = GET_GLOBAL(udrive_g->bulkin); + pipe = GET_GLOBALFLAT(udrive_gf->bulkin); return usb_send_bulk(pipe, dir, buf, bytes); }
@@ -69,9 +69,9 @@ usb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) return 0;
dprintf(16, "usb_cmd_data id=%p write=%d count=%d bs=%d buf=%p\n" - , op->drive_g, 0, op->count, blocksize, op->buf_fl); - struct usbdrive_s *udrive_g = container_of( - op->drive_g, struct usbdrive_s, drive); + , op->drive_gf, 0, op->count, blocksize, op->buf_fl); + struct usbdrive_s *udrive_gf = container_of( + op->drive_gf, struct usbdrive_s, drive);
// Setup command block wrapper. u32 bytes = blocksize * op->count; @@ -82,26 +82,26 @@ usb_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) cbw.dCBWTag = 999; // XXX cbw.dCBWDataTransferLength = bytes; cbw.bmCBWFlags = cdb_is_read(cdbcmd, blocksize) ? USB_DIR_IN : USB_DIR_OUT; - cbw.bCBWLUN = GET_GLOBAL(udrive_g->lun); + cbw.bCBWLUN = GET_GLOBALFLAT(udrive_gf->lun); cbw.bCBWCBLength = USB_CDB_SIZE;
// Transfer cbw to device. - int ret = usb_msc_send(udrive_g, USB_DIR_OUT + int ret = usb_msc_send(udrive_gf, USB_DIR_OUT , MAKE_FLATPTR(GET_SEG(SS), &cbw), sizeof(cbw)); if (ret) goto fail;
// Transfer data to/from device. if (bytes) { - ret = usb_msc_send(udrive_g, cbw.bmCBWFlags, op->buf_fl, bytes); + ret = usb_msc_send(udrive_gf, cbw.bmCBWFlags, op->buf_fl, bytes); if (ret) goto fail; }
// Transfer csw info. struct csw_s csw; - ret = usb_msc_send(udrive_g, USB_DIR_IN - , MAKE_FLATPTR(GET_SEG(SS), &csw), sizeof(csw)); + ret = usb_msc_send(udrive_gf, USB_DIR_IN + , MAKE_FLATPTR(GET_SEG(SS), &csw), sizeof(csw)); if (ret) goto fail;
@@ -142,22 +142,22 @@ usb_msc_lun_setup(struct usb_pipe *inpipe, struct usb_pipe *outpipe, struct usbdevice_s *usbdev, int lun) { // Allocate drive structure. - struct usbdrive_s *udrive_g = malloc_fseg(sizeof(*udrive_g)); - if (!udrive_g) { + struct usbdrive_s *drive = malloc_fseg(sizeof(*drive)); + if (!drive) { warn_noalloc(); return -1; } - memset(udrive_g, 0, sizeof(*udrive_g)); - udrive_g->drive.type = DTYPE_USB; - udrive_g->bulkin = inpipe; - udrive_g->bulkout = outpipe; - udrive_g->lun = lun; + memset(drive, 0, sizeof(*drive)); + drive->drive.type = DTYPE_USB; + drive->bulkin = inpipe; + drive->bulkout = outpipe; + drive->lun = lun;
int prio = bootprio_find_usb(usbdev, lun); - int ret = scsi_drive_setup(&udrive_g->drive, "USB MSC", prio); + int ret = scsi_drive_setup(&drive->drive, "USB MSC", prio); if (ret) { dprintf(1, "Unable to configure USB MSC drive.\n"); - free(udrive_g); + free(drive); return -1; } return 0; diff --git a/src/hw/usb-uas.c b/src/hw/usb-uas.c index 62b9675..33657ac 100644 --- a/src/hw/usb-uas.c +++ b/src/hw/usb-uas.c @@ -14,7 +14,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // DTYPE_USB #include "blockcmd.h" // cdb_read #include "config.h" // CONFIG_USB_UAS @@ -96,16 +96,16 @@ uas_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) if (!CONFIG_USB_UAS) return DISK_RET_EBADTRACK;
- struct uasdrive_s *drive = container_of( - op->drive_g, struct uasdrive_s, drive); + struct uasdrive_s *drive_gf = container_of( + op->drive_gf, struct uasdrive_s, drive);
uas_ui ui; memset(&ui, 0, sizeof(ui)); ui.hdr.id = UAS_UI_COMMAND; ui.hdr.tag = 0xdead; - ui.command.lun[1] = drive->lun; + ui.command.lun[1] = GET_GLOBALFLAT(drive_gf->lun); memcpy(ui.command.cdb, cdbcmd, sizeof(ui.command.cdb)); - int ret = usb_send_bulk(GET_GLOBAL(drive->command), + int ret = usb_send_bulk(GET_GLOBALFLAT(drive_gf->command), USB_DIR_OUT, MAKE_FLATPTR(GET_SEG(SS), &ui), sizeof(ui.hdr) + sizeof(ui.command)); if (ret) { @@ -114,7 +114,7 @@ uas_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) }
memset(&ui, 0xff, sizeof(ui)); - ret = usb_send_bulk(GET_GLOBAL(drive->status), + ret = usb_send_bulk(GET_GLOBALFLAT(drive_gf->status), USB_DIR_IN, MAKE_FLATPTR(GET_SEG(SS), &ui), sizeof(ui)); if (ret) { dprintf(1, "uas: status recv fail"); @@ -125,7 +125,7 @@ uas_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) case UAS_UI_SENSE: goto have_sense; case UAS_UI_READ_READY: - ret = usb_send_bulk(GET_GLOBAL(drive->data_in), + ret = usb_send_bulk(GET_GLOBALFLAT(drive_gf->data_in), USB_DIR_IN, op->buf_fl, op->count * blocksize); if (ret) { dprintf(1, "uas: data read fail"); @@ -133,7 +133,7 @@ uas_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) } break; case UAS_UI_WRITE_READY: - ret = usb_send_bulk(GET_GLOBAL(drive->data_out), + ret = usb_send_bulk(GET_GLOBALFLAT(drive_gf->data_out), USB_DIR_OUT, op->buf_fl, op->count * blocksize); if (ret) { dprintf(1, "uas: data write fail"); @@ -146,7 +146,7 @@ uas_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) }
memset(&ui, 0xff, sizeof(ui)); - ret = usb_send_bulk(GET_GLOBAL(drive->status), + ret = usb_send_bulk(GET_GLOBALFLAT(drive_gf->status), USB_DIR_IN, MAKE_FLATPTR(GET_SEG(SS), &ui), sizeof(ui)); if (ret) { dprintf(1, "uas: status recv fail"); diff --git a/src/hw/virtio-blk.c b/src/hw/virtio-blk.c index 2b8e17c..0290d67 100644 --- a/src/hw/virtio-blk.c +++ b/src/hw/virtio-blk.c @@ -7,7 +7,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "config.h" // CONFIG_* #include "block.h" // struct drive_s #include "malloc.h" // free @@ -31,9 +31,9 @@ struct virtiodrive_s { static int virtio_blk_op(struct disk_op_s *op, int write) { - struct virtiodrive_s *vdrive_g = - container_of(op->drive_g, struct virtiodrive_s, drive); - struct vring_virtqueue *vq = GET_GLOBAL(vdrive_g->vq); + struct virtiodrive_s *vdrive_gf = + container_of(op->drive_gf, struct virtiodrive_s, drive); + struct vring_virtqueue *vq = GET_GLOBALFLAT(vdrive_gf->vq); struct virtio_blk_outhdr hdr = { .type = write ? VIRTIO_BLK_T_OUT : VIRTIO_BLK_T_IN, .ioprio = 0, @@ -47,7 +47,7 @@ virtio_blk_op(struct disk_op_s *op, int write) }, { .addr = op->buf_fl, - .length = GET_GLOBAL(vdrive_g->drive.blksize) * op->count, + .length = GET_GLOBALFLAT(vdrive_gf->drive.blksize) * op->count, }, { .addr = MAKE_FLATPTR(GET_SEG(SS), &status), @@ -60,7 +60,7 @@ virtio_blk_op(struct disk_op_s *op, int write) vring_add_buf(vq, sg, 2, 1, 0, 0); else vring_add_buf(vq, sg, 1, 2, 0, 0); - vring_kick(GET_GLOBAL(vdrive_g->ioaddr), vq, 1); + vring_kick(GET_GLOBALFLAT(vdrive_gf->ioaddr), vq, 1);
/* Wait for reply */ while (!vring_more_used(vq)) @@ -72,7 +72,7 @@ virtio_blk_op(struct disk_op_s *op, int write) /* Clear interrupt status register. Avoid leaving interrupts stuck if * VRING_AVAIL_F_NO_INTERRUPT was ignored and interrupts were raised. */ - vp_get_isr(GET_GLOBAL(vdrive_g->ioaddr)); + vp_get_isr(GET_GLOBALFLAT(vdrive_gf->ioaddr));
return status == VIRTIO_BLK_S_OK ? DISK_RET_SUCCESS : DISK_RET_EBADTRACK; } @@ -105,18 +105,18 @@ init_virtio_blk(struct pci_device *pci) u16 bdf = pci->bdf; dprintf(1, "found virtio-blk at %x:%x\n", pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf)); - struct virtiodrive_s *vdrive_g = malloc_fseg(sizeof(*vdrive_g)); - if (!vdrive_g) { + struct virtiodrive_s *vdrive = malloc_fseg(sizeof(*vdrive)); + if (!vdrive) { warn_noalloc(); return; } - memset(vdrive_g, 0, sizeof(*vdrive_g)); - vdrive_g->drive.type = DTYPE_VIRTIO_BLK; - vdrive_g->drive.cntl_id = bdf; + memset(vdrive, 0, sizeof(*vdrive)); + vdrive->drive.type = DTYPE_VIRTIO_BLK; + vdrive->drive.cntl_id = bdf;
u16 ioaddr = vp_init_simple(bdf); - vdrive_g->ioaddr = ioaddr; - if (vp_find_vq(ioaddr, 0, &vdrive_g->vq) < 0 ) { + vdrive->ioaddr = ioaddr; + if (vp_find_vq(ioaddr, 0, &vdrive->vq) < 0 ) { dprintf(1, "fail to find vq for virtio-blk %x:%x\n", pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf)); goto fail; @@ -126,36 +126,36 @@ init_virtio_blk(struct pci_device *pci) vp_get(ioaddr, 0, &cfg, sizeof(cfg));
u32 f = vp_get_features(ioaddr); - vdrive_g->drive.blksize = (f & (1 << VIRTIO_BLK_F_BLK_SIZE)) ? + vdrive->drive.blksize = (f & (1 << VIRTIO_BLK_F_BLK_SIZE)) ? cfg.blk_size : DISK_SECTOR_SIZE;
- vdrive_g->drive.sectors = cfg.capacity; + vdrive->drive.sectors = cfg.capacity; dprintf(3, "virtio-blk %x:%x blksize=%d sectors=%u\n", pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf), - vdrive_g->drive.blksize, (u32)vdrive_g->drive.sectors); + vdrive->drive.blksize, (u32)vdrive->drive.sectors);
- if (vdrive_g->drive.blksize != DISK_SECTOR_SIZE) { + if (vdrive->drive.blksize != DISK_SECTOR_SIZE) { dprintf(1, "virtio-blk %x:%x block size %d is unsupported\n", pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf), - vdrive_g->drive.blksize); + vdrive->drive.blksize); goto fail; }
- vdrive_g->drive.pchs.cylinder = cfg.cylinders; - vdrive_g->drive.pchs.head = cfg.heads; - vdrive_g->drive.pchs.sector = cfg.sectors; + vdrive->drive.pchs.cylinder = cfg.cylinders; + vdrive->drive.pchs.head = cfg.heads; + vdrive->drive.pchs.sector = cfg.sectors; char *desc = znprintf(MAXDESCSIZE, "Virtio disk PCI:%x:%x", pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf));
- boot_add_hd(&vdrive_g->drive, desc, bootprio_find_pci_device(pci)); + boot_add_hd(&vdrive->drive, desc, bootprio_find_pci_device(pci));
vp_set_status(ioaddr, VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK); return;
fail: - free(vdrive_g->vq); - free(vdrive_g); + free(vdrive->vq); + free(vdrive); }
void diff --git a/src/hw/virtio-scsi.c b/src/hw/virtio-scsi.c index 7cde3bc..4b4ec7b 100644 --- a/src/hw/virtio-scsi.c +++ b/src/hw/virtio-scsi.c @@ -7,7 +7,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license.
-#include "biosvar.h" // GET_GLOBAL +#include "biosvar.h" // GET_GLOBALFLAT #include "block.h" // struct drive_s #include "blockcmd.h" // scsi_drive_setup #include "config.h" // CONFIG_* @@ -89,12 +89,13 @@ virtio_scsi_cmd(u16 ioaddr, struct vring_virtqueue *vq, struct disk_op_s *op, int virtio_scsi_cmd_data(struct disk_op_s *op, void *cdbcmd, u16 blocksize) { - struct virtio_lun_s *vlun = - container_of(op->drive_g, struct virtio_lun_s, drive); + struct virtio_lun_s *vlun_gf = + container_of(op->drive_gf, struct virtio_lun_s, drive);
- return virtio_scsi_cmd(GET_GLOBAL(vlun->ioaddr), - GET_GLOBAL(vlun->vq), op, cdbcmd, - GET_GLOBAL(vlun->target), GET_GLOBAL(vlun->lun), + return virtio_scsi_cmd(GET_GLOBALFLAT(vlun_gf->ioaddr), + GET_GLOBALFLAT(vlun_gf->vq), op, cdbcmd, + GET_GLOBALFLAT(vlun_gf->target), + GET_GLOBALFLAT(vlun_gf->lun), blocksize); }
On Sat, Oct 26, 2013 at 11:59:39AM -0400, Kevin O'Connor wrote:
The "drive" structure is always malloc'ed and therefore always starts off described as a 32-bit "flat" pointer. Instead of switching to/from 16bit pointers, make all the code use the 32bit pointer. This eliminates the confusing 16/32 bit pointer switches.
FYI, I pushed this patch (along with the other two patches sent at the same time).
-Kevin