]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[romprefix] Attempt to gracefully handle semi-PnP IBM BIOSes
authorMichael Brown <mcb30@ipxe.org>
Wed, 4 May 2011 09:04:43 +0000 (10:04 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 4 May 2011 09:04:43 +0000 (10:04 +0100)
Some IBM BIOSes provide partial support for PnP: they will use the BEV
entry point but will not advertise PnP support.  This causes iPXE to
hook INT 19, which disrupts the boot process.

Attempt to improve this situation by detecting an IBM BIOS and
treating it as a PnP BIOS despite the absence of a PnP signature.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/prefix/romprefix.S

index dd602ddb7108fb6afa0805a312208dd830437bd1..49fd24b9a446a54cb5f6b32d6bd615574e34bb6a 100644 (file)
@@ -13,6 +13,7 @@ FILE_LICENCE ( GPL2_OR_LATER )
 #define PNP_SIGNATURE ( '$' + ( 'P' << 8 ) + ( 'n' << 16 ) + ( 'P' << 24 ) )
 #define PMM_SIGNATURE ( '$' + ( 'P' << 8 ) + ( 'M' << 16 ) + ( 'M' << 24 ) )
 #define PCI_SIGNATURE ( 'P' + ( 'C' << 8 ) + ( 'I' << 16 ) + ( ' ' << 24 ) )
+#define IBM_SIGNATURE ( ( 'I' << 24 ) + ( 'B' << 16 ) + ( 'M' << 8 ) + ' ' )
 #define STACK_MAGIC ( 'L' + ( 'R' << 8 ) + ( 'E' << 16 ) + ( 'T' << 24 ) )
 #define PMM_ALLOCATE 0x0000
 #define PMM_FIND 0x0001
@@ -172,6 +173,7 @@ undiheader:
 init:
        /* Preserve registers, clear direction flag, set %ds=%cs */
        pushaw
+       pushl   %ebx
        pushw   %ds
        pushw   %es
        pushw   %fs
@@ -180,15 +182,14 @@ init:
        pushw   %cs
        popw    %ds
 
-       /* Shuffle some registers around.  We need %di available for
-        * the print_xxx functions, and in a register that's
-        * addressable from %es, so shuffle as follows:
+       /* Shuffle some registers around.  We need to use %di for the
+        * print_xxx functions, so shuffle as follows:
         *
-        *    %di (pointer to PnP structure) => %bx
         *    %bx (runtime segment address, for PCI 3.0) => %gs
+        *    %edi (IBM signature) => %ebx
         */
        movw    %bx, %gs
-       movw    %di, %bx
+       movl    %edi, %ebx
 
        /* Store PCI bus:dev.fn address */
        movw    %ax, init_pci_busdevfn
@@ -263,7 +264,16 @@ no_pci3:
        popl    %edx
        popl    %ebx
 
-       /* Check for PnP BIOS.  Although %es:di should point to the
+       /* Check for IBM BIOS, which uses the PnP entry points but
+        * doesn't indicate PnP support.
+        */
+       cmpl    $IBM_SIGNATURE, %ebx
+       jne     no_ibm
+       movw    $init_message_ibm, %si
+       xorw    %di, %di
+       call    print_message
+       jmp     pnp_done
+no_ibm:        /* Check for PnP BIOS.  Although %es:di should point to the
         * PnP BIOS signature on entry, some BIOSes fail to do this.
         */
        movw    $( 0xf000 - 1 ), %bx
@@ -416,6 +426,7 @@ no_pmm:
        popw    %fs
        popw    %es
        popw    %ds
+       popl    %ebx
        popaw
 
        /* Indicate boot capability to PnP BIOS, if present */
@@ -530,6 +541,9 @@ init_message:
 init_message_pci:
        .asciz  " PCI"
        .size   init_message_pci, . - init_message_pci
+init_message_ibm:
+       .asciz  " IBM"
+       .size   init_message_ibm, . - init_message_ibm
 init_message_pnp:
        .asciz  " PnP"
        .size   init_message_pnp, . - init_message_pnp