--- qemu/roms/seabios/src/floppy.c 2018/04/24 17:36:48 1.1.1.1 +++ qemu/roms/seabios/src/floppy.c 2018/04/24 18:58:59 1.1.1.5 @@ -13,6 +13,9 @@ #include "cmos.h" // inb_cmos #include "pic.h" // eoi_pic1 #include "bregs.h" // struct bregs +#include "boot.h" // boot_add_floppy +#include "pci.h" // pci_to_bdf +#include "pci_ids.h" // PCI_CLASS_BRIDGE_ISA #define FLOPPY_SIZE_CODE 0x02 // 512 byte sectors #define FLOPPY_DATALEN 0xff // Not used - because size code is 0x02 @@ -89,37 +92,44 @@ struct floppyinfo_s FloppyInfo[] VAR16VI }; struct drive_s * -addFloppy(int floppyid, int ftype, int driver) +init_floppy(int floppyid, int ftype) { if (ftype <= 0 || ftype >= ARRAY_SIZE(FloppyInfo)) { dprintf(1, "Bad floppy type %d\n", ftype); return NULL; } - struct drive_s *drive_g = allocDrive(); - if (!drive_g) + struct drive_s *drive_g = malloc_fseg(sizeof(*drive_g)); + if (!drive_g) { + warn_noalloc(); return NULL; + } + memset(drive_g, 0, sizeof(*drive_g)); drive_g->cntl_id = floppyid; - drive_g->type = driver; + 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 , sizeof(FloppyInfo[ftype].chs)); - - map_floppy_drive(drive_g); return drive_g; } -void -describe_floppy(struct drive_s *drive_g) +static void +addFloppy(int floppyid, int ftype) { - printf("drive %c", 'A' + drive_g->cntl_id); + struct drive_s *drive_g = init_floppy(floppyid, ftype); + if (!drive_g) + return; + char *desc = znprintf(MAXDESCSIZE, "Floppy [drive %c]", 'A' + floppyid); + int bdf = pci_find_class(PCI_CLASS_BRIDGE_ISA); /* isa-to-pci bridge */ + int prio = bootprio_find_fdc_device(bdf, PORT_FD_BASE, floppyid); + boot_add_floppy(drive_g, desc, prio); } void -floppy_setup() +floppy_setup(void) { if (! CONFIG_FLOPPY) return; @@ -130,14 +140,14 @@ floppy_setup() } else { u8 type = inb_cmos(CMOS_FLOPPY_DRIVE_TYPE); if (type & 0xf0) - addFloppy(0, type >> 4, DTYPE_FLOPPY); + addFloppy(0, type >> 4); if (type & 0x0f) - addFloppy(1, type & 0x0f, DTYPE_FLOPPY); + addFloppy(1, type & 0x0f); } outb(0x02, PORT_DMA1_MASK_REG); - enable_hwirq(6, entry_0e); + enable_hwirq(6, FUNC16(entry_0e)); } // Find a floppy type that matches a given image size. @@ -159,7 +169,7 @@ find_floppy_type(u32 size) ****************************************************************/ static void -floppy_reset_controller() +floppy_reset_controller(void) { // Reset controller u8 val8 = inb(PORT_FD_DOR); @@ -172,7 +182,7 @@ floppy_reset_controller() } static int -wait_floppy_irq() +wait_floppy_irq(void) { ASSERT16(); u8 v; @@ -182,7 +192,9 @@ wait_floppy_irq() v = GET_BDA(floppy_recalibration_status); if (v & FRS_TIMEOUT) break; - wait_irq(); + // Could use wait_irq() here, but that causes issues on + // bochs, so use yield() instead. + yield(); } v &= ~FRS_TIMEOUT; @@ -570,7 +582,7 @@ process_floppy_op(struct disk_op_s *op) // INT 0Eh Diskette Hardware ISR Entry Point void VISIBLE16 -handle_0e() +handle_0e(void) { debug_isr(DEBUG_ISR_0e); if (! CONFIG_FLOPPY) @@ -593,7 +605,7 @@ done: // Called from int08 handler. void -floppy_tick() +floppy_tick(void) { if (! CONFIG_FLOPPY) return;