core: prevent buggy INT 13h from leaving IF=0
authorH. Peter Anvin <hpa@zytor.com>
Fri, 5 Jun 2009 00:24:58 +0000 (17:24 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Fri, 5 Jun 2009 00:24:58 +0000 (17:24 -0700)
If it can happen for CD-ROM BIOSes, it can probably happen elsewhere,
too; make sure we don't leave interrupts disabled after broken INT 13h
calls.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
core/diskstart.inc
core/extlinux.asm

index c3881ea..5322922 100644 (file)
@@ -503,6 +503,7 @@ ldlinux_ent:
 ;
                jmp 0:.next
 .next:
+               sti             ; In case of broken INT 13h BIOSes
 
 ;
 ; Tell the user we got this far
@@ -609,11 +610,16 @@ writestr_early:
                ret
 
 
+;
 ; getlinsecsr: save registers, call getlinsec, restore registers
+;             Save/restore the flags, too, especially IF.
 ;
-getlinsecsr:   pushad
+getlinsecsr:   
+               pushfd
+               pushad
                call getlinsec
                popad
+               popfd
                ret
 
 ;
index 46faac5..ac5fb6f 100644 (file)
@@ -116,7 +116,7 @@ Files               resb MAX_OPEN*open_file_t_size
                mov bx,SuperBlock
                mov eax,1024 >> SECTOR_SHIFT
                mov bp,ax
-               call getlinsec
+               call getlinsecsr
 
 ;
 ; Compute some values...
@@ -208,7 +208,7 @@ getonesec_ext:
 
 getlinsec_ext:
                cmp eax,[SecPerClust]
-               jae getlinsec                   ; Nothing fancy
+               jae getlinsecsr                 ; Nothing fancy
 
                ; If we get here, at least part of what we want is in the
                ; zero block.  Zero one sector at a time and loop.