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.
89 lines
2.9 KiB
89 lines
2.9 KiB
6 years ago
|
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
|
||
|
|
||
|
|