mbr/*.S: if Ctrl is pressed, force the drive number to 0x80
authorH. Peter Anvin <hpa@linux.intel.com>
Tue, 31 Mar 2009 00:38:44 +0000 (17:38 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Tue, 31 Mar 2009 00:38:44 +0000 (17:38 -0700)
Impact: BIOS bug workaround, possible unexpected consequences?

Escape hatch for BIOSes which pass in garbage in DL: if the Ctrl key
is pressed during boot, force the drive number to 0x80.

Based on a patch by "TJ <ubuntu@tjworld.net>".

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
mbr/gptmbr.S
mbr/isohdpfx.S
mbr/mbr.S

index 385afe7..0a547b8 100644 (file)
@@ -1,6 +1,6 @@
 /* -----------------------------------------------------------------------
  *
- *   Copyright 2007-2008 H. Peter Anvin - All Rights Reserved
+ *   Copyright 2007-2009 H. Peter Anvin - All Rights Reserved
  *
  *   Permission is hereby granted, free of charge, to any person
  *   obtaining a copy of this software and associated documentation
@@ -61,7 +61,6 @@ _start:
        movw    %sp, %si
        pushw   %es             /* 4(%bp) es:di -> $PnP header */
        pushw   %di             /* 2(%bp) */
-       pushw   %dx             /* 0(%bp) = %dl -> drive number */
        movw    %ax, %es
        sti
        cld
@@ -72,8 +71,14 @@ _start:
        rep; movsw
 
        ljmpw   $0, $next
-
 next:
+       /* Escape for the user: if Ctrl is pressed, assume drive hd0 */
+       testb   $0x04, 0x417    /* keyboard control flags: Ctrl pressed */
+       jz      1f
+       movb    $0x80, %dl
+1:
+       pushw   %dx             /* 0(%bp) = %dl -> drive number */
+
        /* Check to see if we have EBIOS */
        pushw   %dx             /* drive number */
        movb    $0x41, %ah      /* %al == 0 already */
@@ -210,7 +215,7 @@ boot:
 
 missing_os:
        call    error
-       .ascii  "Operating system not bootable\r\n"
+       .ascii  "OS not bootable\r\n"
 
 saturate_stosl:
        pushl   %eax
index 9e9d55c..0e15b11 100644 (file)
@@ -1,6 +1,6 @@
 /* -----------------------------------------------------------------------
  *
- *   Copyright 2007-2008 H. Peter Anvin - All Rights Reserved
+ *   Copyright 2007-2009 H. Peter Anvin - All Rights Reserved
  *
  *   Permission is hereby granted, free of charge, to any person
  *   obtaining a copy of this software and associated documentation
@@ -69,7 +69,6 @@ _start:
        movw    %sp, %si
        pushw   %es             /* es:di -> $PnP header */
        pushw   %di
-       pushw   %dx             /* dl -> drive number */
        movw    %ax, %es
        sti
        cld
@@ -80,8 +79,15 @@ _start:
        rep; movsw
 
        ljmpw   $0, $next
-
 next:
+       
+       /* Escape for the user: if Ctrl is pressed, assume drive hd0 */
+       testb   $0x04, 0x417    /* keyboard control flags: Ctrl pressed */
+       jz      1f
+       movb    $0x80, %dl
+1:
+       pushw   %dx             /* dl -> drive number */
+
        /* Check to see if we have EBIOS */
        pushw   %dx             /* drive number */
        movb    $0x41, %ah      /* %al == 0 already */
index 722d90d..70572d5 100644 (file)
--- a/mbr/mbr.S
+++ b/mbr/mbr.S
@@ -1,6 +1,6 @@
 /* -----------------------------------------------------------------------
  *
- *   Copyright 2007-2008 H. Peter Anvin - All Rights Reserved
+ *   Copyright 2007-2009 H. Peter Anvin - All Rights Reserved
  *
  *   Permission is hereby granted, free of charge, to any person
  *   obtaining a copy of this software and associated documentation
@@ -53,7 +53,6 @@ _start:
        movw    %sp, %si
        pushw   %es             /* es:di -> $PnP header */
        pushw   %di
-       pushw   %dx             /* dl -> drive number */
        movw    %ax, %es
        sti
        cld
@@ -64,8 +63,15 @@ _start:
        rep; movsw
 
        ljmpw   $0, $next
-
 next:
+       
+       /* Escape for the user: if Ctrl is pressed, assume drive hd0 */
+       testb   $0x04, 0x417    /* keyboard control flags: Ctrl pressed */
+       jz      1f
+       movb    $0x80, %dl
+1:
+       pushw   %dx             /* dl -> drive number */
+
        /* Check to see if we have EBIOS */
        pushw   %dx             /* drive number */
        movb    $0x41, %ah      /* %al == 0 already */