Nick Bertrand
2012-Aug-01 02:00 UTC
[syslinux] Dell OptiPlex 790 PXELINUX localboot reboot loop
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
