Author: mist Date: Mon Dec 4 18:00:11 2006 New Revision: 25062
URL: http://svn.reactos.org/svn/reactos?rev=25062&view=rev Log: ReactOS Intel Mac compatibility commits, part 1/2, by Michael Steil.
== A20 Gate and the Keyboard Controller == In order to turn on the A20 gate, the keyboard controller has to be emptied. This is done in freeldr by reading bytes until the keyboard controller signals it's empty. Intel Macs don't have PS/2 keyboard controller and the status register always reads back 0xFF, so the "there is data" bit will never be cleared. (The same problem has been in GRUB as well as in Darwin's BIOS loader.) Added code that doesn't bother to clear the keyboard buffer if the status port reads back 0xFF.
== Serial Port BIOS Bug == Insyde's BIOS reports that there is a COM1 serial port at 0x3F8 (as stored in 0040:0000 in memory), but there is none in Intel Macs, so freeldr spins infinitely while trying to empty the serial port's buffer. Added code that makes sure the loop only gets executed up to 200 times
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/arch.S trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/arch.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/i... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/arch/i386/arch.S (original) +++ trunk/reactos/boot/freeldr/freeldr/arch/i386/arch.S Mon Dec 4 18:00:11 2006 @@ -219,8 +219,11 @@ empty_8042: .word 0x00eb,0x00eb // jmp $+2, jmp $+2 inb $0x64,%al + cmp $0xff, %al // legacy-free machine without keyboard + jz empty_8042_ret // controllers on Intel Macs read back 0xFF testb $0x02,%al jnz empty_8042 +empty_8042_ret: ret
/*
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/i... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c (original) +++ trunk/reactos/boot/freeldr/freeldr/arch/i386/hardware.c Mon Dec 4 18:00:11 2006 @@ -987,7 +987,7 @@ { CHAR Buffer[4]; ULONG i; - ULONG TimeOut = 200; + ULONG TimeOut; UCHAR LineControl;
/* Shutdown mouse or something like that */ @@ -995,9 +995,19 @@ WRITE_PORT_UCHAR((PUCHAR)Port + 4, (LineControl & ~0x02) | 0x01); StallExecutionProcessor(100000);
- /* Clear buffer */ + /* + * Clear buffer + * Maybe there is no serial port although BIOS reported one (this + * is the case on Apple hardware), or the serial port is misbehaving, + * therefore we must give up after some time. + */ + TimeOut = 200; while (READ_PORT_UCHAR((PUCHAR)Port + 5) & 0x01) - READ_PORT_UCHAR((PUCHAR)Port); + { + if (--TimeOut == 0) + return MOUSE_TYPE_NONE; + READ_PORT_UCHAR((PUCHAR)Port); + }
/* * Send modem control with 'Data Terminal Ready', 'Request To Send' and @@ -1009,6 +1019,7 @@ StallExecutionProcessor(10000);
/* Read first four bytes, which contains Microsoft Mouse signs */ + TimeOut = 200; for (i = 0; i < 4; i++) { while (((READ_PORT_UCHAR((PUCHAR)Port + 5) & 1) == 0) && (TimeOut > 0))