|
|
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 |
|