aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGene Cumm <gene.cumm@gmail.com>2010-11-05 13:32:52 -0400
committerGene Cumm <gene.cumm@gmail.com>2010-11-05 13:32:52 -0400
commitd8402d0e3919ff5318c4bbad690be32bf715936e (patch)
tree9d5752427aaaa09f9e3538050f4542428181fbf9
parent778fcea7d4e3e2a595df0a18475d83d008216117 (diff)
downloadsyslinux-d8402d0e3919ff5318c4bbad690be32bf715936e.tar.gz
syslinux-d8402d0e3919ff5318c4bbad690be32bf715936e.tar.xz
syslinux-d8402d0e3919ff5318c4bbad690be32bf715936e.zip
PXELINUX: Fix timer bug
Certain calls to the PXE stack could potentially remove us from memory. Revert the INT 1Ch timer to its previous state.
-rw-r--r--core/pxelinux.asm19
1 files changed, 19 insertions, 0 deletions
diff --git a/core/pxelinux.asm b/core/pxelinux.asm
index a46b3da5..165472d3 100644
--- a/core/pxelinux.asm
+++ b/core/pxelinux.asm
@@ -365,6 +365,15 @@ pxenv:
pushfd
pushad
+ ; We may be removing ourselves from memory
+ cmp bx,0073h
+ jz .disable_timer
+ jmp .store_stack
+
+.disable_timer:
+ call timer_cleanup
+
+.store_stack:
mov [cs:PXEStack],sp
mov [cs:PXEStack+2],ss
lss sp,[cs:InitStack]
@@ -391,6 +400,16 @@ pxenv:
; This clobbers the AX return, but we already saved it into
; the PXEStatus variable.
popad
+
+ ; If the TFTP failed, it could return.
+ cmp bx,0073h
+ jz .enable_timer
+ jmp .pop_flags
+
+.enable_timer:
+ call timer_init
+
+.pop_flags:
popfd ; Restore flags (incl. IF, DF)
ret