From 11db15bb0f0f3d23aa9b2966c2f65a0379246813 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Fri, 27 Apr 2018 16:56:33 +0300 Subject: [PATCH] generalizing the 16bit interrupt hack to an arbitray int86() call --- src/boot/boot2.s | 42 ++++++++++++++++++++++++++++++++---------- src/int86.h | 15 +++++++++++++++ src/kmain.c | 12 +++++++++++- 3 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 src/int86.h diff --git a/src/boot/boot2.s b/src/boot/boot2.s index 37f1026..e4088f4 100644 --- a/src/boot/boot2.s +++ b/src/boot/boot2.s @@ -554,10 +554,9 @@ kbc_wait_write: numbuf: .space 16 -# this is not boot loader code. It's called later on by the main -# kernel code in 32bit protected mode. It's placed here because -# it needs to be in base memory as it returns and runs in real mode. - +# this is not boot loader code. It's called later on by the main kernel +# code in 32bit protected mode. It's placed here because it needs to be +# located in base memory as it returns and runs in real mode. .code32 .align 4 # place to save the protected mode IDTR pseudo-descriptor @@ -571,9 +570,14 @@ idtaddr:.long 0 rmidt: .short 0x3ff .long 0 - # drop back to unreal mode to set video mode - .global set_mode13h -set_mode13h: +saved_esp: .long 0 +saved_ebp: .long 0 + + # drop back to unreal mode to call 16bit interrupt + .global int86 +int86: + push %ebp + mov %esp, %ebp pushal cli # save protected mode IDTR and replace it with the real mode vectors @@ -597,9 +601,26 @@ set_mode13h: mov %ax, %ss nop - # switch video mode by calling the video bios - mov $0x13, %ax - int $0x10 + # modify the int instruction + mov $int_op, %ebx + movb 4(%ebp), %al + movb %al, 1(%ebx) + + # load registers from the int86regs struct + mov %esp, saved_esp + mov %ebp, saved_ebp + mov 8(%ebp), %esp + popal + mov saved_esp, %esp + + # call 16bit interrupt +int_op: int $0 + + mov saved_ebp, %ebp + mov 8(%ebp), %esp + add $32, %esp + pushal + mov saved_esp, %esp # re-enable protection mov %cr0, %eax @@ -620,6 +641,7 @@ set_mode13h: lidt (saved_idtr) sti popal + pop %ebp ret diff --git a/src/int86.h b/src/int86.h new file mode 100644 index 0000000..fdae525 --- /dev/null +++ b/src/int86.h @@ -0,0 +1,15 @@ +#ifndef INT86_H_ +#define INT86_H_ + +#include + +struct int86regs { + uint32_t edi, esi, ebp, esp; + uint32_t ebx, edx, ecx, eax; + uint16_t flags; + uint16_t es, ds, fs, gs; +} __attribute__ ((packed)); + +void int86(int inum, struct int86regs *regs); + +#endif /* INT86_H_ */ diff --git a/src/kmain.c b/src/kmain.c index af7bc65..fab4e6f 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -16,14 +16,24 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include +#include #include #include "segm.h" #include "intr.h" #include "keyb.h" #include "timer.h" #include "contty.h" +#include "int86.h" + +static void set_mode13h(void) +{ + struct int86regs regs; + + memset(®s, 0, sizeof regs); + regs.eax = 0x13; + int86(0x10, ®s); +} -void set_mode13h(void); void logohack(void); void pcboot_main(void) -- 1.7.10.4