X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=bootcensus;a=blobdiff_plain;f=src%2Fboot%2Fboot2.s;h=5aeebaa66a0e54dd2c043bbec8620a808d5c8c32;hp=f2aab01add64eba0d83e22cf68043c1ae8b8eeab;hb=6ddbba6fc0185f6aaf64c661c303549eb088010f;hpb=24707f10f3ad0f26bc7144e3a2f3371ba9c377f3 diff --git a/src/boot/boot2.s b/src/boot/boot2.s index f2aab01..5aeebaa 100644 --- a/src/boot/boot2.s +++ b/src/boot/boot2.s @@ -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 @@ -763,6 +763,10 @@ rmidt: .short 0x3ff saved_esp: .long 0 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 @@ -775,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 @@ -799,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 @@ -809,17 +814,23 @@ int86: # ignore fs and gs for now, don't think I'm going to need them mov saved_esp, %esp + # move to the real-mode stack, accessible from ss=0 + # just in case the BIOS call screws up our unreal mode + mov $0x7be0, %esp + # call 16bit interrupt int_op: int $0 + # BIOS call might have enabled interrupts, cli for good measure + cli - mov saved_ebp, %ebp - mov 12(%ebp), %esp - add $38, %esp - push %ds - push %es + # 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 - pushal - mov saved_esp, %esp + pop %ax + mov %ax, saved_flags # re-enable protection mov %cr0, %eax @@ -836,6 +847,20 @@ 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 + mov saved_ds, %ax + pushw %ax + mov saved_es, %ax + pushw %ax + mov saved_flags, %ax + pushw %ax + mov saved_eax, %eax + pushal + mov saved_esp, %esp + # restore 32bit interrupt descriptor table lidt (saved_idtr) sti