Avoid draining the keyboard buffer during gateA20_set(). It shouldn't
[people/xl0/gpxe.git] / src / arch / i386 / firmware / pcbios / gateA20.c
index bbee376..cdc8668 100644 (file)
@@ -27,16 +27,17 @@ enum { Disable_A20 = 0x2400, Enable_A20 = 0x2401, Query_A20_Status = 0x2402,
 #define CF ( 1 << 0 )
 
 #ifndef IBM_L40
 #define CF ( 1 << 0 )
 
 #ifndef IBM_L40
-static void empty_8042 ( void )
-{
+static void empty_8042 ( void ) {
        unsigned long time;
        unsigned long time;
-       char st;
 
        time = currticks() + TICKS_PER_SEC;     /* max wait of 1 second */
 
        time = currticks() + TICKS_PER_SEC;     /* max wait of 1 second */
-       while ((((st = inb(K_CMD)) & K_OBUF_FUL) ||
-              (st & K_IBUF_FUL)) &&
-              currticks() < time)
-               inb(K_RDWR);
+       while ( ( inb ( K_CMD ) & K_IBUF_FUL ) &&
+               currticks() < time ) {
+               /* Do nothing.  In particular, do *not* read from
+                * K_RDWR, because that will drain the keyboard buffer
+                * and lose keypresses.
+                */
+       }
 }
 #endif /* IBM_L40 */
 
 }
 #endif /* IBM_L40 */
 
@@ -50,26 +51,24 @@ static void empty_8042 ( void )
  */
 void gateA20_set ( void ) {
        static char reentry_guard = 0;
  */
 void gateA20_set ( void ) {
        static char reentry_guard = 0;
-       uint16_t flags, status;
+       unsigned int discard_a;
+       unsigned int flags;
 
        if ( reentry_guard )
                return;
        reentry_guard = 1;
 
 
        if ( reentry_guard )
                return;
        reentry_guard = 1;
 
-       REAL_EXEC ( rm_enableA20,
-                   "sti\n\t"
-                   "stc\n\t"
-                   "int $0x15\n\t"
-                   "pushfw\n\t"
-                   "popw %%bx\n\t"
-                   "cli\n\t",
-                   2,
-                   OUT_CONSTRAINTS ( "=a" ( status ), "=b" ( flags ) ),
-                   IN_CONSTRAINTS ( "a" ( Enable_A20 ) ),
-                   CLOBBER ( "ecx", "edx", "ebp", "esi", "edi" ) );
+       __asm__ __volatile__ ( REAL_CODE ( "sti\n\t"
+                                          "stc\n\t"
+                                          "int $0x15\n\t"
+                                          "pushfw\n\t"
+                                          "popw %w0\n\t"
+                                          "cli\n\t" )
+                              : "=r" ( flags ), "=a" ( discard_a )
+                              : "a" ( Enable_A20 ) );
+
 
 
-       if ( ( flags & CF ) ||
-            ( ( status >> 8 ) & 0xff ) ) {
+       if ( flags & CF ) {
                /* INT 15 method failed, try alternatives */
 #ifdef IBM_L40
                outb(0x2, 0x92);
                /* INT 15 method failed, try alternatives */
 #ifdef IBM_L40
                outb(0x2, 0x92);
@@ -81,7 +80,7 @@ void gateA20_set ( void ) {
                empty_8042();
 #endif /* IBM_L40 */
        }
                empty_8042();
 #endif /* IBM_L40 */
        }
-       
+
        reentry_guard = 0;
 }
 
        reentry_guard = 0;
 }