Don't automatically call gateA20_set() when returning from a real-mode
authorMichael Brown <mcb30@etherboot.org>
Thu, 4 Jan 2007 04:32:18 +0000 (04:32 +0000)
committerMichael Brown <mcb30@etherboot.org>
Thu, 4 Jan 2007 04:32:18 +0000 (04:32 +0000)
call.

src/arch/i386/transitions/librm.S

index 32faad4..9edbd47 100644 (file)
@@ -428,8 +428,13 @@ prot_call:
  * function will be passed back to the protected-mode caller.  A
  * result of this is that this routine cannot be called directly from
  * C code, since it clobbers registers that the C ABI expects the
- * callee to preserve.  Gate A20 will be re-enabled in case the
- * real-mode routine disabled it.
+ * callee to preserve.  Gate A20 will *not* be automatically
+ * re-enabled.  Since we always run from an even megabyte of memory,
+ * we are guaranteed to return successfully to the protected-mode
+ * code, which should then call gateA20_set() if it suspects that gate
+ * A20 may have been disabled.  Note that enabling gate A20 is a
+ * potentially slow operation that may also cause keyboard input to be
+ * lost; this is why it is not done automatically.
  *
  * librm.h defines a convenient macro REAL_CODE() for using real_call.
  * See librm.h and realmode.h for details and examples.
@@ -477,9 +482,6 @@ real_call:
        .section ".text"
        .code32
 1:
-       /* Set up environment expected by C code */
-       call    gateA20_set
-
        /* Restore registers and return */
        popal
        ret