diff --git a/reactos/boot/freeldr/freeldr/arch/i386/arch.S b/reactos/boot/freeldr/freeldr/arch/i386/arch.S index 71db4299397..66e9f5c6b17 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/arch.S +++ b/reactos/boot/freeldr/freeldr/arch/i386/arch.S @@ -219,8 +219,11 @@ inrmode: 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 /* diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index ff3d33d52f3..a7c8a894abb 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -987,7 +987,7 @@ DetectSerialMouse(ULONG Port) { CHAR Buffer[4]; ULONG i; - ULONG TimeOut = 200; + ULONG TimeOut; UCHAR LineControl; /* Shutdown mouse or something like that */ @@ -995,9 +995,19 @@ DetectSerialMouse(ULONG Port) 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 @@ DetectSerialMouse(ULONG Port) 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))