X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=bootcensus;a=blobdiff_plain;f=src%2Fboot%2Fboot2.s;h=f782d7ef50aca782b0cb16a80bb692e89d3b02dd;hp=7067a8f308c3f4520f494962fe2ca4ca1e83ddbc;hb=6e5ec45bc9c248586ec797646158b4caa3aa9d68;hpb=28d44c4b65b11f37ffd69a2b0227f14ca5c4f137 diff --git a/src/boot/boot2.s b/src/boot/boot2.s index 7067a8f..f782d7e 100644 --- a/src/boot/boot2.s +++ b/src/boot/boot2.s @@ -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