[syslinux] Dell OptiPlex 790 PXELINUX localboot reboot loop

Nick Bertrand nick at physics.umn.edu
Tue Jul 31 19:00:05 PDT 2012


Our site has many Dell OptiPlex 790s, all of which are unable to use the 'localboot' PXELINUX option as they either hang at 'Booting from local disk...' or immediately reboot depending on which SYSLINUX version is used. Many people have suggested using chain.c32 to chain load the local disk as a workaround, but this causes problems with Windows 7 BitLocker as it detects the chain load and forces the user to enter the recovery key. While searching for another option I determined that the problem seems to stem from the BIOS storing some information in the memory range 0x47CC-0x47FF, which is overwritten when PXELINUX loads. I couldn't figure out a clean way to avoid that memory region as it falls in the middle of the 4.x bss16 region, so I decided to create a copy of it instead. By copying that information out of the way during PXELINUX initialization and copying it back before returning control via 'localboot 0', the computer successfully boots to the local disk. Below is a patch again
st commit 0a0e0e41cad93cd16c323cf16f40264a21eedd6c of the git.kernel.org/pub/scm/boot/syslinux/syslinux.git repository.


diff --git a/core/pxelinux.asm b/core/pxelinux.asm
index e8818a6..27dc595 100644
--- a/core/pxelinux.asm
+++ b/core/pxelinux.asm
@@ -132,6 +132,13 @@ _start1:
        mov ds,ax
        mov es,ax
 
+       ; Copy chunk of memory used by Dell BIOS on OptiPlex 790s
+       ; Allows control to return to PXE Boot Agent for localboot
+       mov esi,47cch
+       mov edi,DellBIOSChunk
+       mov ecx,13
+       rep movsd
+
 %if 0 ; debugging code only... not intended for production use
        ; Clobber the stack segment, to test for specific pathologies
        mov di,STACK_BASE
@@ -289,6 +296,14 @@ local_boot:
        ; Restore the environment we were called with
        pm_call reset_pxe
        call cleanup_hardware
+
+       ; Copy Dell BIOS chunk back into place
+       cld
+       mov esi,DellBIOSChunk
+       mov edi,47cch
+       mov ecx,13
+       rep movsd
+
        lss sp,[InitStack]
        pop gs
        pop fs
@@ -564,3 +579,6 @@ IPInfo:
 .ServerIP  resd 1
 .GatewayIP resd 1
 .Netmask   resd 1
+
+       section .earlybss
+DellBIOSChunk   resd 13     ; 52 bytes to store Dell BIOS chunk


Some additional info:

BIOS revision: A13
PXE versions: Intel Boot Agent GE v1.3.81, Intel Boot Agent PXE Base Code (PXE-2.1 build 089)
Versions of SYSLINUX affected: 3.83, 4.03, 4.04, 4.05, possibly others
Resulting symptom for localboot option vs SYSLINUX version:

      localboot 0  localboot -1
3.83  Reboot       Reboot
4.03  Reboot       Reboot
4.04  Hang         Reboot
4.05  Hang         Reboot

This patch does not fix the reboot issue when using 'localboot -1'. I believe this patch should also help those with OptiPlex 990s, but I don't have one to test with to confirm.

Thanks,

Nick Bertrand



More information about the Syslinux mailing list