diff options
author | Benji Dial <benji@benjidial.net> | 2024-01-14 12:29:35 -0500 |
---|---|---|
committer | Benji Dial <benji@benjidial.net> | 2024-01-14 12:29:35 -0500 |
commit | 7c6a18d77a81f232ad2e1d3a311bb21ea8f1f5b4 (patch) | |
tree | cb7cce254e7ae2ec8691b93340ca125b8c6b4988 | |
parent | e9898e829b8df7c0b16faec1ce490369c53fd78e (diff) | |
download | hilbert-os-7c6a18d77a81f232ad2e1d3a311bb21ea8f1f5b4.tar.gz |
register interrupts 0x08 - 0x0f
-rw-r--r-- | applications/init/main.cpp | 6 | ||||
-rw-r--r-- | kernel/interrupts.asm | 10 | ||||
-rw-r--r-- | kernel/interrupts.cpp | 8 |
3 files changed, 19 insertions, 5 deletions
diff --git a/applications/init/main.cpp b/applications/init/main.cpp index a3f75e4..e0019b5 100644 --- a/applications/init/main.cpp +++ b/applications/init/main.cpp @@ -22,5 +22,9 @@ int main(int, char **) { } mercury::syscall::draw_framebuffer(); - return 1 / 0; + //*(int *)0x12345678 = 0; + //fb_width = *(uint32_t *)0xffffffffc0000000; + //return 100 / (uint8_t)(uint64_t)fb; + return 0; + } diff --git a/kernel/interrupts.asm b/kernel/interrupts.asm index c375ee4..4827cfd 100644 --- a/kernel/interrupts.asm +++ b/kernel/interrupts.asm @@ -64,6 +64,8 @@ exception_info: resq 1 .r15: resq 1 +.cr2: + resq 1 .cr3: resq 1 .rip: @@ -181,6 +183,8 @@ exception_common: pop rax mov qword [exception_info.rsp], rax + mov rax, cr2 + mov qword [exception_info.cr2], rax mov rax, cr3 mov qword [exception_info.cr3], rax @@ -200,7 +204,7 @@ set_isr: shr rdx, 16 mov dword [rdi + 8], edx - or sil, 0xef + or sil, 0x8e mov byte [rdi + 5], sil mov word [rdi + 2], 0x28 mov byte [rdi + 4], 1 @@ -225,13 +229,13 @@ section .text load_gdt_and_idt: - mov rcx, 8 + mov rcx, 16 .loop: mov rdi, rcx dec rdi - mov sil, 1 + mov sil, 0 mov rdx, qword [exception_isrs + rdi * 8] call set_isr diff --git a/kernel/interrupts.cpp b/kernel/interrupts.cpp index 65daf91..8ac986d 100644 --- a/kernel/interrupts.cpp +++ b/kernel/interrupts.cpp @@ -21,6 +21,7 @@ struct [[gnu::packed]] exception_info_t { uint64_t r14; uint64_t r15; + uint64_t cr2; uint64_t cr3; uint64_t rip; uint64_t rflags; @@ -103,7 +104,12 @@ extern "C" [[noreturn]] void print_exception() { if (((exception_info.rflags >> i) & 1) == 1) terminal::put_string_sz(flag_names[i]); - print_line("rip", "cr3", exception_info.rip, exception_info.cr3); + if (exception_info.exception_number == 0x0e) { + terminal::put_string_sz("\n cr2: 0x"); + terminal::put_int_hex(exception_info.cr2, 16); + } + + print_line("cr3", "rip", exception_info.cr3, exception_info.rip); print_line("rax", "rbx", exception_info.rax, exception_info.rbx); print_line("rcx", "rdx", exception_info.rcx, exception_info.rdx); print_line("rdi", "rsi", exception_info.rdi, exception_info.rsi); |