[pxe] Fill in UNDIROMID pointer in !PXE structure
authorMichael Brown <mcb30@etherboot.org>
Wed, 27 Aug 2008 22:45:59 +0000 (23:45 +0100)
committerMichael Brown <mcb30@etherboot.org>
Wed, 27 Aug 2008 23:11:45 +0000 (00:11 +0100)
IBM's iSCSI Firmware Initiator checks the UNDIROMID pointer in the
!PXE structure that gets created by the UNDI loader.  We didn't
previously fill this value in.

src/arch/i386/interface/pxe/pxe_call.c
src/arch/i386/interface/pxe/pxe_entry.S
src/arch/i386/prefix/romprefix.S
src/arch/i386/scripts/i386.lds

index 3a5f4c7..3ccb7fb 100644 (file)
@@ -347,6 +347,9 @@ __cdecl void pxe_loader_call ( struct i386_all_regs *ix86 ) {
        /* Copy parameter block from caller */
        copy_from_user ( &params, uparams, 0, sizeof ( params ) );
 
+       /* Fill in ROM segment address */
+       ppxe.UNDIROMID.segment = ix86->segs.ds;
+
        /* Set default status in case child routine fails to do so */
        params.Status = PXENV_STATUS_FAILURE;
 
index 204894e..c55e581 100644 (file)
@@ -35,7 +35,7 @@ ppxe:
        .byte 0                         /* StructCksum */
        .byte 0                         /* StructRev */
        .byte 0                         /* reserved_1 */
-       .word 0, 0                      /* UNDIROMID */
+       .word undiheader, 0             /* UNDIROMID */
        .word 0, 0                      /* BaseROMID */
        .word pxe_entry_sp, 0           /* EntryPointSP */
        .word pxe_entry_esp, 0          /* EntryPointESP */
@@ -55,6 +55,11 @@ pxe_segments:
        .equ    pxe_length, . - ppxe
        .size   ppxe, . - ppxe
 
+       /* Define undiheader=0 as a weak symbol for non-ROM builds */
+       .section ".weak"
+       .weak   undiheader
+undiheader:
+
 /****************************************************************************
  * PXENV+ structure
  ****************************************************************************
index 90ddd10..f9b9e16 100644 (file)
@@ -112,7 +112,8 @@ prodstr_separator:
 prodstr_pci_id:
        .asciz  "xx:xx.x)"              /* Filled in by init code */
        .size prodstr, . - prodstr
-       
+
+       .globl  undiheader      
 undiheader:
        .ascii  "UNDI"                  /* Signature */
        .byte   undiheader_len          /* Length of structure */
@@ -524,18 +525,22 @@ undiloader:
        /* Save registers */
        pushl   %esi
        pushl   %edi
+       pushw   %ds
        pushw   %es
        pushw   %bx
+       /* ROM segment address to %ds */
+       pushw   %cs
+       popw    %ds
        /* UNDI loader parameter structure address into %es:%di */
        movw    %sp, %bx
-       movw    %ss:16(%bx), %di
-       movw    %ss:18(%bx), %es
+       movw    %ss:18(%bx), %di
+       movw    %ss:20(%bx), %es
        /* Install to specified real-mode addresses */
        pushw   %di
        movw    %es:12(%di), %bx
        movw    %es:14(%di), %ax
-       movl    %cs:image_source, %esi
-       movl    %cs:decompress_to, %edi
+       movl    image_source, %esi
+       movl    decompress_to, %edi
        call    install_prealloc
        popw    %di
        /* Call UNDI loader C code */
@@ -550,6 +555,7 @@ undiloader:
        /* Restore registers and return */
        popw    %bx
        popw    %es
+       popw    %ds
        popl    %edi
        popl    %esi
        lret
index a5a0105..7d63dae 100644 (file)
@@ -30,6 +30,16 @@ SECTIONS {
      *
      */
 
+    /*
+     * Weak symbols that need zero values if not otherwise defined
+     */
+
+    . = 0;
+    .weak : AT ( 0 ) {
+       *(.weak)
+    }
+    _assert = ASSERT ( ( . == 0 ), ".weak is non-zero length" );
+
     /*
      * The prefix
      */