diff options
author | H. Peter Anvin <hpa@zytor.com> | 2009-09-11 16:03:30 -0700 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2011-04-12 14:40:52 -0700 |
commit | 0c1dff8db43c78e8538b04abadb80e27c0d008f7 (patch) | |
tree | d2e8d3d437a2bbbad520169b71931a75a11460a0 /core/pxelinux.asm | |
parent | c3ea33593e32cb7ebc76f2eec93c87da284bed9d (diff) | |
download | syslinux-0c1dff8db43c78e8538b04abadb80e27c0d008f7.tar.gz |
core: pxe: don't switch to the PXE stack if we're on it...
Don't switch to the PXE stack if we are already on it. This can
happen if we take an interrupt inside the stack switch code.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'core/pxelinux.asm')
-rw-r--r-- | core/pxelinux.asm | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/core/pxelinux.asm b/core/pxelinux.asm index ab8526ae..be304be2 100644 --- a/core/pxelinux.asm +++ b/core/pxelinux.asm @@ -375,9 +375,15 @@ pxenv: call timer_cleanup .store_stack: + pushf + cli + inc word [cs:PXEStackLock] + jnz .skip1 mov [cs:PXEStack],sp mov [cs:PXEStack+2],ss lss sp,[cs:InitStack] +.skip1: + popf ; Pre-clear the Status field mov word [es:di],cs @@ -392,7 +398,13 @@ pxenv: add sp,6 mov [cs:PXEStatus],ax + pushf + cli + dec word [cs:PXEStackLock] + jns .skip2 lss sp,[cs:PXEStack] +.skip2: + popf mov bp,sp and ax,ax @@ -419,6 +431,16 @@ pxenv: global PXEEntry PXEEntry equ pxenv.jump+1 +; +; The PXEStackLock keeps us from switching stacks if we take an interrupt +; (which ends up calling pxenv) while we are already on the PXE stack. +; It will be -1 normally, 0 inside a PXE call, and a positive value +; inside a *nested* PXE call. +; + section .data16 + alignb 2 +PXEStackLock dw -1 + section .bss16 alignb 2 PXEStatus resb 2 |