Blame SOURCES/0005-Save-Dell-BIOS-chunk-in-PXELINUX.patch

af863e
From e1db3e675ae4ccbeea5de9f4b74a618e42eac1a3 Mon Sep 17 00:00:00 2001
af863e
From: Nick Bertrand <nick@physics.umn.edu>
af863e
Date: Tue, 31 Jul 2012 19:00:05 -0700
af863e
Subject: [PATCH] Save Dell BIOS chunk in PXELINUX
af863e
af863e
Our site has many Dell OptiPlex 790s, all of which are unable to use the
af863e
'localboot' PXELINUX option as they either hang at 'Booting from local disk...'
af863e
or immediately reboot depending on which SYSLINUX version is used. Many people
af863e
have suggested using chain.c32 to chain load the local disk as a workaround,
af863e
but this causes problems with Windows 7 BitLocker as it detects the chain load
af863e
and forces the user to enter the recovery key. While searching for another
af863e
option I determined that the problem seems to stem from the BIOS storing some
af863e
information in the memory range 0x47CC-0x47FF, which is overwritten when
af863e
PXELINUX loads. I couldn't figure out a clean way to avoid that memory region
af863e
as it falls in the middle of the 4.x bss16 region, so I decided to create a
af863e
copy of it instead. By copying that information out of the way during PXELINUX
af863e
initialization and copying it back before returning control via 'localboot 0',
af863e
the computer successfully boots to the local disk.
af863e
af863e
Some additional info:
af863e
af863e
BIOS revision: A13
af863e
PXE versions: Intel Boot Agent GE v1.3.81, Intel Boot Agent PXE Base Code (PXE-2.1 build 089)
af863e
Versions of SYSLINUX affected: 3.83, 4.03, 4.04, 4.05, possibly others
af863e
Resulting symptom for localboot option vs SYSLINUX version:
af863e
af863e
      localboot 0  localboot -1
af863e
3.83  Reboot       Reboot
af863e
4.03  Reboot       Reboot
af863e
4.04  Hang         Reboot
af863e
4.05  Hang         Reboot
af863e
af863e
This patch does not fix the reboot issue when using 'localboot -1'. I believe
af863e
this patch should also help those with OptiPlex 990s, but I don't have one to
af863e
test with to confirm.
af863e
af863e
Below is a patch against commit 0a0e0e41cad93cd16c323cf16f40264a21eedd6c of
af863e
the git.kernel.org/pub/scm/boot/syslinux/syslinux.git repository.
af863e
af863e
--
af863e
---
af863e
 core/pxelinux.asm | 18 ++++++++++++++++++
af863e
 1 file changed, 18 insertions(+)
af863e
af863e
diff --git a/core/pxelinux.asm b/core/pxelinux.asm
af863e
index e8818a6..b58ed2a 100644
af863e
--- a/core/pxelinux.asm
af863e
+++ b/core/pxelinux.asm
af863e
@@ -132,6 +132,13 @@ _start1:
af863e
 		mov ds,ax
af863e
 		mov es,ax
af863e
 
af863e
+		; Copy chunk of memory used by Dell BIOS on OptiPlex 790s
af863e
+		; Allows control to return to PXE Boot Agent for localboot
af863e
+		mov esi,47cch
af863e
+		mov edi,DellBIOSChunk
af863e
+		mov ecx,13
af863e
+		rep movsd
af863e
+
af863e
 %if 0 ; debugging code only... not intended for production use
af863e
 		; Clobber the stack segment, to test for specific pathologies
af863e
 		mov di,STACK_BASE
af863e
@@ -289,6 +296,14 @@ local_boot:
af863e
 		; Restore the environment we were called with
af863e
 		pm_call reset_pxe
af863e
 		call cleanup_hardware
af863e
+
af863e
+		; Copy Dell BIOS chunk back into place
af863e
+		cld
af863e
+		mov esi,DellBIOSChunk
af863e
+		mov edi,47cch
af863e
+		mov ecx,13
af863e
+		rep movsd
af863e
+
af863e
 		lss sp,[InitStack]
af863e
 		pop gs
af863e
 		pop fs
af863e
@@ -564,3 +579,6 @@ IPInfo:
af863e
 .ServerIP	resd 1
af863e
 .GatewayIP	resd 1
af863e
 .Netmask	resd 1
af863e
+
af863e
+		section .earlybss
af863e
+DellBIOSChunk   resd 13     ; 52 bytes to store Dell BIOS chunk
af863e
-- 
af863e
2.5.0
af863e
af863e