From 290c5ee779764d76ddded979b390008daa71aec9 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 4 Jan 2007 04:32:18 +0000 Subject: [PATCH] Don't automatically call gateA20_set() when returning from a real-mode call. --- src/arch/i386/transitions/librm.S | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/arch/i386/transitions/librm.S b/src/arch/i386/transitions/librm.S index 32faad4a..9edbd473 100644 --- a/src/arch/i386/transitions/librm.S +++ b/src/arch/i386/transitions/librm.S @@ -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