PXELINUX: Fix timer bug
authorGene Cumm <gene.cumm@gmail.com>
Fri, 5 Nov 2010 17:32:52 +0000 (13:32 -0400)
committerGene Cumm <gene.cumm@gmail.com>
Fri, 5 Nov 2010 17:32:52 +0000 (13:32 -0400)
Certain calls to the PXE stack could potentially remove us from
memory.  Revert the INT 1Ch timer to its previous state.

core/pxelinux.asm

index a46b3da..165472d 100644 (file)
@@ -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