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