# 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
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
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
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
# 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
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
pushw %ax
mov saved_es, %ax
pushw %ax
- pushfw
+ mov saved_flags, %ax
+ pushw %ax
mov saved_eax, %eax
pushal
mov saved_esp, %esp