diff --git a/rust_experiments/src/lib.rs b/rust_experiments/src/lib.rs index 4376346..257d36e 100644 --- a/rust_experiments/src/lib.rs +++ b/rust_experiments/src/lib.rs @@ -14,6 +14,10 @@ extern { fn call_interrupt(); } +#[no_mangle] +pub extern fn rust_interrupt_handler() { + checkerboard(vga_buffer::Color::White); +} #[no_mangle] pub extern fn rust_main() { diff --git a/rust_experiments/src/long_mode_init.asm b/rust_experiments/src/long_mode_init.asm index 3f4c0a3..393458a 100644 --- a/rust_experiments/src/long_mode_init.asm +++ b/rust_experiments/src/long_mode_init.asm @@ -2,6 +2,7 @@ global long_mode_start global asm_printchar global get_rdtsc global call_interrupt +extern rust_interrupt_handler section .text bits 64 @@ -10,6 +11,7 @@ long_mode_start: ; print "OKAY" call setup_SSE call setup_IDT + call setup_PIC extern rust_main call rust_main ; rust main returned, print `OS returned!` @@ -69,24 +71,47 @@ get_rdtsc: ret call_interrupt: - int 49 + int 5 ret sample_handler: - mov word [0xb8000], 0x4f72 + ;mov word [0xb8000], 0x4f72 + push rax + push rcx + push rdx + push r8 + push r9 + push r10 + push r11 + + cld + call rust_interrupt_handler + + pop r11 + pop r10 + pop r9 + pop r8 + pop rdx + pop rcx + pop rax + call spin_loop_64 iretq +%define int_num 5 setup_IDT: lidt [idt64.pointer] mov rax, sample_handler - mov [idt64 + 49*16], ax - mov word [idt64 + 49*16 +2], cs - mov word [idt64 + 49*16 + 4], 0x8e00 + mov [idt64 + int_num*16], ax + mov word [idt64 + int_num*16 +2], cs + mov word [idt64 + int_num*16 + 4], 0x8e00 shr rax, 16 - mov [idt64 + 49*16 + 6], ax + mov [idt64 + int_num*16 + 6], ax shr rax, 16 - mov [idt64 + 49*16 + 8], ax + mov [idt64 + int_num*16 + 8], ax + ret + +setup_PIC: ret idt64: