You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.9 KiB
88 lines
2.9 KiB
From e1db3e675ae4ccbeea5de9f4b74a618e42eac1a3 Mon Sep 17 00:00:00 2001 |
|
From: Nick Bertrand <nick@physics.umn.edu> |
|
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 |
|
|
|
|
|
|