From e1db3e675ae4ccbeea5de9f4b74a618e42eac1a3 Mon Sep 17 00:00:00 2001 From: Nick Bertrand Date: Tue, 31 Jul 2012 19:00:05 -0700 Subject: [PATCH] Save Dell BIOS chunk in PXELINUX 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. 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. Below is a patch against commit 0a0e0e41cad93cd16c323cf16f40264a21eedd6c of the git.kernel.org/pub/scm/boot/syslinux/syslinux.git repository. -- --- core/pxelinux.asm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/pxelinux.asm b/core/pxelinux.asm index e8818a6..b58ed2a 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 -- 2.5.0