VirtualBox

Changeset 62301 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jul 18, 2016 1:41:02 PM (9 years ago)
Author:
vboxsync
Message:

BIOS: Mark floppy media as unknown if operation fails.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/BIOS/floppy.c

    r59115 r62301  
    122122#endif /* !VBOX_WITH_FLOPPY_IRQ_POLLING */
    123123
    124 void floppy_reset_controller(void)
     124void floppy_reset_controller(uint16_t drive)
    125125{
    126126    uint8_t     val8;
     
    135135        val8 = inb(0x3f4);
    136136    } while ( (val8 & 0xc0) != 0x80 );
     137
     138    // Mark media in drive as unknown
     139    val8 = read_byte(0x0040, 0x0090 + drive);
     140    val8 &= ~0x10;
     141    write_byte(0x0040, 0x90 + drive, val8);
     142
    137143}
    138144
     
    523529        // see if drive exists
    524530        if (floppy_drive_exists(drive) == 0) {
     531            BX_DEBUG_INT13_FL("failed (not ready)\n");
    525532            SET_AH(0x80); // not responding
    526533            set_diskette_ret_status(0x80);
     
    533540        if (floppy_media_known(drive) == 0) {
    534541            if (floppy_media_sense(drive) == 0) {
     542                BX_DEBUG_INT13_FL("media not found\n");
    535543                SET_AH(0x0C); // Media type not found
    536544                set_diskette_ret_status(0x0C);
     
    584592            outb(0x0005, base_count>>8);
    585593            BX_DEBUG_INT13_FL("xfer buf %x bytes at %x:%x\n",
    586                               base_count, page, base_address);
     594                              base_count + 1, page, base_address);
    587595
    588596            // port 0b: DMA-1 Mode Register
     
    614622            outb(0x03f5, 0); // Gap length
    615623            outb(0x03f5, 0xff); // Gap length
     624            BX_DEBUG_INT13_FL("read initiated\n");
    616625
    617626#ifdef VBOX_WITH_FLOPPY_IRQ_POLLING
     
    623632                val8 = read_byte(0x0040, 0x0040);
    624633                if (val8 == 0) {
    625                     floppy_reset_controller();
     634                    BX_DEBUG_INT13_FL("failed (not ready)\n");
     635                    floppy_reset_controller(drive);
    626636                    SET_AH(0x80); // drive not ready (timeout)
    627637                    set_diskette_ret_status(0x80);
     
    645655            val8 = floppy_wait_for_interrupt_or_timeout();
    646656            if (val8 == 0) { /* Note! Interrupts enabled in this branch. */
    647                 floppy_reset_controller();
     657                BX_DEBUG_INT13_FL("failed (not ready)\n");
     658                floppy_reset_controller(drive);
    648659                SET_AH(0x80); // drive not ready (timeout)
    649660                set_diskette_ret_status(0x80);
     
    666677
    667678            if ( (return_status[0] & 0xc0) != 0 ) {
     679                BX_DEBUG_INT13_FL("failed (FDC failure)\n");
     680                floppy_reset_controller(drive);
    668681                SET_AH(0x20);
    669682                set_diskette_ret_status(0x20);
     
    676689            rep_movsw(ES :> BX, ES :> BX, num_sectors * 512 / 2);
    677690#endif
     691            BX_DEBUG_INT13_FL("success!\n");
    678692            // ??? should track be new val from return_status[3] ?
    679693            set_diskette_current_cyl(drive, track);
     
    760774                val8 = read_byte(0x0040, 0x0040);
    761775                if (val8 == 0) {
    762                     floppy_reset_controller();
     776                    floppy_reset_controller(drive);
    763777                    SET_AH(0x80); // drive not ready (timeout)
    764778                    set_diskette_ret_status(0x80);
     
    781795            val8 = floppy_wait_for_interrupt_or_timeout();
    782796            if (val8 == 0) { /* Note! Interrupts enabled in this branch. */
    783                 floppy_reset_controller();
     797                floppy_reset_controller(drive);
    784798                SET_AH(0x80); // drive not ready (timeout)
    785799                set_diskette_ret_status(0x80);
     
    927941            val8 = read_byte(0x0040, 0x0040);
    928942            if (val8 == 0) {
    929                 floppy_reset_controller();
     943                floppy_reset_controller(drive);
    930944                SET_AH(0x80); // drive not ready (timeout)
    931945                set_diskette_ret_status(0x80);
     
    947961        val8 = floppy_wait_for_interrupt_or_timeout();
    948962        if (val8 == 0) { /* Note! Interrupts enabled in this branch. */
    949             floppy_reset_controller();
     963            floppy_reset_controller(drive);
    950964            SET_AH(0x80); // drive not ready (timeout)
    951965            set_diskette_ret_status(0x80);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette