fixed bug in boot2.s: when booting from floppy, the motor would keep
[bootcensus] / src / boot / boot2.s
index 7067a8f..5aeebaa 100644 (file)
@@ -230,7 +230,7 @@ ldloop:
        # just in case we were loaded from floppy, turn all floppy motors off
        mov $0x3f2, %dx
        in %dx, %al
-       and $0xf0, %al
+       and $0xf, %al
        out %al, %dx
 
        mov $10, %ax
@@ -766,6 +766,7 @@ saved_ebp: .long 0
 saved_eax: .long 0
 saved_es: .word 0
 saved_ds: .word 0
+saved_flags: .word 0
 
        # drop back to unreal mode to call 16bit interrupt
        .global int86
@@ -778,7 +779,7 @@ int86:
        sidt (saved_idtr)
        lidt (rmidt)
 
-       # modify the int instruction do this here before the
+       # modify the int instruction. do this here before the
        # cs-load jumps, to let them flush the instruction cache
        mov $int_op, %ebx
        movb 8(%ebp), %al
@@ -802,6 +803,7 @@ int86:
        nop
 
        # load registers from the int86regs struct
+       # point esp to the regs struct to load registers with popa/popf
        mov %esp, saved_esp
        mov %ebp, saved_ebp
        mov 12(%ebp), %esp
@@ -818,12 +820,17 @@ int86:
 
        # call 16bit interrupt
 int_op:        int $0
+       # BIOS call might have enabled interrupts, cli for good measure
+       cli
 
        # save all registers that we'll clobber before having the
        # chance to populate the int86regs structure
        mov %eax, saved_eax
        mov %ds, saved_ds
        mov %es, saved_es
+       pushfw
+       pop %ax
+       mov %ax, saved_flags
 
        # re-enable protection
        mov %cr0, %eax
@@ -840,6 +847,7 @@ int_op:     int $0
        mov %ax, %ss
        nop
 
+       # point the esp to our regs struct, to fill it with pusha/pushf
        mov saved_ebp, %ebp
        mov 12(%ebp), %esp
        add $38, %esp
@@ -847,7 +855,8 @@ int_op:     int $0
        pushw %ax
        mov saved_es, %ax
        pushw %ax
-       pushfw
+       mov saved_flags, %ax
+       pushw %ax
        mov saved_eax, %eax
        pushal
        mov saved_esp, %esp