Kevin O'Connor wrote:
On Sun, Jan 10, 2010 at 11:46:50PM +0100, Sebastian Herbszt wrote:
Kevin O'Connor wrote:
05264161428i[FDD ] controller reset in software 05445136148i[FDD ] controller reset in software 05625186768i[FDD ] controller reset in software 05803824012i[FDD ] controller reset in software 05985259728i[FDD ] controller reset in software
SeaBIOS makes a call to wait_irq() in the wait_floppy_irq() function in src/floppy.c. My guess is that the floppy irq was lost, and SeaBIOS went into recovery mode. It's just a guess, but maybe 0x00020f41 isn't populated because the floppy read failed (because of lost irq?).
It is indeed related to floppy. Booting FreeDOS from cd works.
Yeah - this patch also fixes the problem:
--- a/src/floppy.c +++ b/src/floppy.c @@ -182,7 +182,8 @@ wait_floppy_irq(void) v = GET_BDA(floppy_recalibration_status); if (v & FRS_TIMEOUT) break;
wait_irq();
//wait_irq();
yield();
}
v &= ~FRS_TIMEOUT;
I still don't think it should be necessary though. Maybe Bochs is dropping floppy irqs when halted?
The problem occurs on COMMAND: [e6] [04] [03] [01] [01] [02] [12] [00] [ff]
Debug output with Bochs BIOS
00131978879d[FDD ] read/write normal data 00131978879d[FDD ] BEFORE 00131978879d[FDD ] drive = 0 00131978879d[FDD ] head = 1 00131978879d[FDD ] cylinder = 3 00131978879d[FDD ] sector = 1 00131978879d[FDD ] eot = 18 00131978879d[FDD ] read! 00131978879d[FDD ] floppy_xfer: drive=0, offset=64512, bytes=512, direction=from floppy 00131978879d[FDD ] io_write: diskette controller data 00132201610d[FDD ] floppy_xfer: drive=0, offset=65024, bytes=512, direction=from floppy 00132424341d[FDD ] floppy_xfer: drive=0, offset=65536, bytes=512, direction=from floppy 00132647072d[FDD ] floppy_xfer: drive=0, offset=66048, bytes=512, direction=from floppy 00132869803d[FDD ] floppy_xfer: drive=0, offset=66560, bytes=512, direction=from floppy 00133092534d[FDD ] floppy_xfer: drive=0, offset=67072, bytes=512, direction=from floppy 00133315265d[FDD ] floppy_xfer: drive=0, offset=67584, bytes=512, direction=from floppy 00133537996d[FDD ] floppy_xfer: drive=0, offset=68096, bytes=512, direction=from floppy 00133760727d[FDD ] floppy_xfer: drive=0, offset=68608, bytes=512, direction=from floppy 00133983458d[FDD ] floppy_xfer: drive=0, offset=69120, bytes=512, direction=from floppy 00134206189d[FDD ] floppy_xfer: drive=0, offset=69632, bytes=512, direction=from floppy 00134428920d[FDD ] floppy_xfer: drive=0, offset=70144, bytes=512, direction=from floppy 00134651651d[FDD ] floppy_xfer: drive=0, offset=70656, bytes=512, direction=from floppy 00134874382d[FDD ] floppy_xfer: drive=0, offset=71168, bytes=512, direction=from floppy 00135097113d[FDD ] floppy_xfer: drive=0, offset=71680, bytes=512, direction=from floppy 00135319844d[FDD ] floppy_xfer: drive=0, offset=72192, bytes=512, direction=from floppy 00135542575d[FDD ] floppy_xfer: drive=0, offset=72704, bytes=512, direction=from floppy 00135765306d[FDD ] floppy_xfer: drive=0, offset=73216, bytes=512, direction=from floppy 00135988037d[FDD ] <<READ DONE>> 00135988037d[FDD ] AFTER 00135988037d[FDD ] drive = 0 00135988037d[FDD ] head = 0 00135988037d[FDD ] cylinder = 4 00135988037d[FDD ] sector = 1 00135988037d[FDD ] raise_interrupt 00135988037d[FDD ] RESULT: [00] [00] [00] [04] [00] [01] [02]
18 sectors read and INT raised
Debug output with SeaBIOS
01484895591d[FDD ] read/write normal data 01484895591d[FDD ] BEFORE 01484895591d[FDD ] drive = 0 01484895591d[FDD ] head = 1 01484895591d[FDD ] cylinder = 3 01484895591d[FDD ] sector = 1 01484895591d[FDD ] eot = 18 01484895591d[FDD ] read! 01484895591d[FDD ] floppy_xfer: drive=0, offset=64512, bytes=512, direction=from floppy 01484895591d[FDD ] io_write: diskette controller data 01484895738i[BIOS ] wait_floppy_irq 01484895804i[BIOS ] loop 01489702451i[BIOS ] loop 01494447511i[BIOS ] loop 01499057671i[BIOS ] loop 01499057689d[FDD ] floppy_xfer: drive=0, offset=65024, bytes=512, direction=from floppy 01502531391i[BIOS ] loop 01507211711i[BIOS ] loop 01512251591i[BIOS ] loop 01512251609d[FDD ] floppy_xfer: drive=0, offset=65536, bytes=512, direction=from floppy 01516144951i[BIOS ] loop 01520033811i[BIOS ] loop 01525074171i[BIOS ] loop 01525074189d[FDD ] floppy_xfer: drive=0, offset=66048, bytes=512, direction=from floppy 01529576831i[BIOS ] loop 01533488331i[BIOS ] loop 01537715651i[BIOS ] loop 01537715669d[FDD ] floppy_xfer: drive=0, offset=66560, bytes=512, direction=from floppy 01542568211i[BIOS ] loop 01546724771i[BIOS ] loop 01550561771i[BIOS ] loop 01550561789d[FDD ] floppy_xfer: drive=0, offset=67072, bytes=512, direction=from floppy 01555519611i[BIOS ] loop 01560268911i[BIOS ] loop 01563912291i[BIOS ] loop 01563912309d[FDD ] floppy_xfer: drive=0, offset=67584, bytes=512, direction=from floppy 01568386751i[BIOS ] loop 01573060051i[BIOS ] loop 01578036231i[BIOS ] loop 01578036249d[FDD ] floppy_xfer: drive=0, offset=68096, bytes=512, direction=from floppy 01580926271i[BIOS ] loop 01585943311i[BIOS ] loop 01590928071i[BIOS ] loop 01590928089d[FDD ] floppy_xfer: drive=0, offset=68608, bytes=512, direction=from floppy 01595412451i[BIOS ] loop 01598790831i[BIOS ] loop 01603770011i[BIOS ] loop 01603770029d[FDD ] floppy_xfer: drive=0, offset=69120, bytes=512, direction=from floppy 01608437351i[BIOS ] loop 01612548071i[BIOS ] loop 01616476651i[BIOS ] loop 01616476669d[FDD ] floppy_xfer: drive=0, offset=69632, bytes=512, direction=from floppy 01621418291i[BIOS ] loop 01626062131i[BIOS ] loop 01629802031i[BIOS ] loop 01629802049d[FDD ] floppy_xfer: drive=0, offset=70144, bytes=512, direction=from floppy 01634074311i[BIOS ] loop 01638668771i[BIOS ] loop 01643752491i[BIOS ] loop 01643752509d[FDD ] floppy_xfer: drive=0, offset=70656, bytes=512, direction=from floppy 01646422786d[FDD ] read(): during command 0xe6, port 0x03f2 returns 0x1c 01646422788d[FDD ] write access to port 0x03f2, value=0x0c 01646422788d[FDD ] io_write: digital output register 01646422788d[FDD ] motor on, drive1 = 0 01646422788d[FDD ] motor on, drive0 = 0 01646422788d[FDD ] dma_and_interrupt_enable=08 01646422788d[FDD ] normal_operation=04 01646422788d[FDD ] drive_select=00 01646422895i[BIOS ] loop 01646423091i[BIOS ] floppy_motor_counter 01646423116d[FDD ] read(): during command 0xe6, port 0x03f2 returns 0x0c 01646423120d[FDD ] write access to port 0x03f2, value=0x08 01646423120d[FDD ] io_write: digital output register 01646423120d[FDD ] motor on, drive1 = 0 01646423120d[FDD ] motor on, drive0 = 0 01646423120d[FDD ] dma_and_interrupt_enable=08 01646423120d[FDD ] normal_operation=00 01646423120d[FDD ] drive_select=00 01646423123d[FDD ] write access to port 0x03f2, value=0x0c 01646423123d[FDD ] io_write: digital output register 01646423123d[FDD ] motor on, drive1 = 0 01646423123d[FDD ] motor on, drive0 = 0 01646423123d[FDD ] dma_and_interrupt_enable=08 01646423123d[FDD ] normal_operation=04 01646423123d[FDD ] drive_select=00 01646423125d[FDD ] read(): during command 0xfe, port 0x03f4 returns 0x00
wait_floppy_irq() gets called, for () loop, 13 sectors read, wait_floppy_irq() returns with -1.
So we have
01616476651i[BIOS ] loop 01616476669d[FDD ] floppy_xfer: drive=0, offset=69632, bytes=512, direction=from floppy <- normal transfer 01621418291i[BIOS ] loop 01626062131i[BIOS ] loop 01629802031i[BIOS ] loop 01629802049d[FDD ] floppy_xfer: drive=0, offset=70144, bytes=512, direction=from floppy <- normal transfer 01634074311i[BIOS ] loop 01638668771i[BIOS ] loop 01643752491i[BIOS ] loop 01643752509d[FDD ] floppy_xfer: drive=0, offset=70656, bytes=512, direction=from floppy <- normal transfer 01646422786d[FDD ] read(): during command 0xe6, port 0x03f2 returns 0x1c <- INT 08h calls floppy_tick() 01646422788d[FDD ] write access to port 0x03f2, value=0x0c 01646422788d[FDD ] io_write: digital output register 01646422788d[FDD ] motor on, drive1 = 0 01646422788d[FDD ] motor on, drive0 = 0 01646422788d[FDD ] dma_and_interrupt_enable=08 01646422788d[FDD ] normal_operation=04 01646422788d[FDD ] drive_select=00 01646422895i[BIOS ] loop <- wait_floppy_irq() for() loop continues... 01646423091i[BIOS ] floppy_motor_counter <- ... and exits
- Sebastian