From: Michael Brown Date: Tue, 25 Oct 2011 14:48:20 +0000 (+0100) Subject: [liba20] Preserve all non-segment registers when calling INT 15,2401 X-Git-Tag: v1.20.1~2062 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c77aece36a0085f1d7da6ca2b9f6c1234ddceb3b;p=thirdparty%2Fipxe.git [liba20] Preserve all non-segment registers when calling INT 15,2401 Some BIOSes are reported to corrupt %ebx when using INT 15,2401 (see http://opensolaris.org/jive/thread.jspa?messageID=377026). Guard against this by preserving all (non-segment) registers. Signed-off-by: Michael Brown --- diff --git a/src/arch/i386/transitions/liba20.S b/src/arch/i386/transitions/liba20.S index 594d62010..a60f1a546 100644 --- a/src/arch/i386/transitions/liba20.S +++ b/src/arch/i386/transitions/liba20.S @@ -96,8 +96,11 @@ test_a20_long: .section ".text16.early", "awx", @progbits .code16 enable_a20_bios: - /* Preserve registers */ - pushw %ax + + /* Preserve registers. Be very paranoid, since some BIOSes + * are reported to clobber %ebx + */ + pushal /* Attempt INT 15,2401 */ movw $0x2401, %ax @@ -108,7 +111,7 @@ enable_a20_bios: call test_a20_short 99: /* Restore registers and return */ - popw %ax + popal ret .size enable_a20_bios, . - enable_a20_bios