diff --git a/rust_experiments/src/long_mode_init.asm b/rust_experiments/src/long_mode_init.asm index 339e35b..3b30740 100644 --- a/rust_experiments/src/long_mode_init.asm +++ b/rust_experiments/src/long_mode_init.asm @@ -145,32 +145,27 @@ handle_timer: pop rax iretq +;expects name of label, offset in table +%macro load_IDT_entry 2 +%define IDT_SIZE 16 + mov rax, %1 + mov [idt64 + %2*IDT_SIZE], ax + mov word [idt64 + %2*IDT_SIZE + 2], cs + mov word [idt64 + %2*IDT_SIZE + 4], 0x8e00 + shr rax, 16 + mov [idt64 + %2*IDT_SIZE + 6], ax + shr rax, 16 + mov [idt64 + %2*IDT_SIZE + 8], eax +%endmacro + setup_IDT: lidt [idt64.pointer] - %define timer_int 8 - mov rax, handle_timer - mov [idt64 + timer_int*16], ax - mov word [idt64 + timer_int*16 + 2], cs - mov word [idt64 + timer_int*16 + 4], 0x8e00 - shr rax, 16 - mov [idt64 + timer_int*16 + 6], ax - shr rax, 16 - mov [idt64 + timer_int*16 + 8], eax - - %define int_num 9 - mov rax, handle_keyboard - 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 + int_num*16 + 6], ax - shr rax, 16 - mov [idt64 + int_num*16 + 8], eax + load_IDT_entry handle_timer, 8 + load_IDT_entry handle_keyboard, 9 ret - ;setup_PIC: ; mov al, 0xfc ;timer and keyboard, no more ; out byte 0x21, al