aboutsummaryrefslogtreecommitdiffstats
path: root/core/highmem.inc
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2009-05-21 10:25:43 -0700
committerH. Peter Anvin <hpa@zytor.com>2009-05-21 10:25:43 -0700
commit652070309f5d283efacaa8c5102368da20a92c4a (patch)
treefbd14207e9c3c4b92c19a177a9f52993a60c5603 /core/highmem.inc
parent55092109e53ae43ceefb5f7c6314aff103931c9a (diff)
downloadsyslinux-3.81-pre9.tar.gz
syslinux-3.81-pre9.tar.xz
syslinux-3.81-pre9.zip
idle: handle PXE stacks which improperly disable interruptssyslinux-3.81-pre9
At least Etherboot (and all-but-super-recent versions of gPXE) PXE ROMs improperly disable interrupts when calling an intercepted version of INT 15h and 1Ah; this is due to the old trick of using "ret 2" to return... this avoids resetting the flags for status, but it also doesn't restore the value of the interrupt flag. Needless to say, this causes serious issues. Work around it by adding explicit pushf/popf or STI in places known to have issues, but also add an STI in reset_idle, and add an error alert in do_idle if we ever get called with interrupts disabled. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'core/highmem.inc')
-rw-r--r--core/highmem.inc2
1 files changed, 2 insertions, 0 deletions
diff --git a/core/highmem.inc b/core/highmem.inc
index 5ae3abea..c7e602f8 100644
--- a/core/highmem.inc
+++ b/core/highmem.inc
@@ -25,6 +25,7 @@
;
highmemsize:
push es
+ pushfd
pushad
push cs
@@ -152,6 +153,7 @@ got_highmem:
%endif
mov [HighMemSize],eax
popad
+ popfd
pop es
ret ; Done!