]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[liba20] Preserve all non-segment registers when calling INT 15,2401
authorMichael Brown <mcb30@ipxe.org>
Tue, 25 Oct 2011 14:48:20 +0000 (15:48 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 25 Oct 2011 15:05:02 +0000 (16:05 +0100)
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 <mcb30@ipxe.org>
src/arch/i386/transitions/liba20.S

index 594d62010be04cd68d7258fc6086224fb9e32db5..a60f1a546d9dd9769e21e7b396e1512eb1401456 100644 (file)
@@ -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