diff --git a/rust_experiments/src/lib.rs b/rust_experiments/src/lib.rs index 6f9e6e3..4376346 100644 --- a/rust_experiments/src/lib.rs +++ b/rust_experiments/src/lib.rs @@ -56,7 +56,7 @@ pub extern fn rust_main() { timer = 0; } - if count > 200 { + if count > 200 && count < 300 { unsafe { call_interrupt(); } diff --git a/rust_experiments/src/long_mode_init.asm b/rust_experiments/src/long_mode_init.asm index 0f2ce0b..6ce1a5d 100644 --- a/rust_experiments/src/long_mode_init.asm +++ b/rust_experiments/src/long_mode_init.asm @@ -22,6 +22,14 @@ long_mode_start: hlt +spin_loop_64: + mov rcx, 0xffff_ffff + .loop: + dec rcx + cmp rcx, 0 + jne spin_loop_64.loop + ret + error: mov rbx, 0x4f4f4f524f524f45 mov [0xb8000], rbx @@ -62,17 +70,29 @@ get_rdtsc: ret call_interrupt: - int 50 + int 49 ret +sample_handler: + mov word [0x8b000], 0x4f72 + call spin_loop_64 + iret + 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 + shr rax, 16 + mov [idt64 + 49*16 + 6], ax + shr rax, 16 + mov [idt64 + 49*16 + 8], ax ret -section .rodata - idt64: - resb 50*16 - .pointer: - dw .pointer - idt64 - dq idt64 +idt64: + resb 50*16 +.pointer: + dw .pointer - idt64 + dq idt64