register interrupts 0x08 - 0x0f

This commit is contained in:
Benji Dial 2024-01-14 12:29:35 -05:00
parent e9898e829b
commit 7c6a18d77a
3 changed files with 19 additions and 5 deletions

View file

@ -22,5 +22,9 @@ int main(int, char **) {
} }
mercury::syscall::draw_framebuffer(); mercury::syscall::draw_framebuffer();
return 1 / 0; //*(int *)0x12345678 = 0;
//fb_width = *(uint32_t *)0xffffffffc0000000;
//return 100 / (uint8_t)(uint64_t)fb;
return 0;
} }

View file

@ -64,6 +64,8 @@ exception_info:
resq 1 resq 1
.r15: .r15:
resq 1 resq 1
.cr2:
resq 1
.cr3: .cr3:
resq 1 resq 1
.rip: .rip:
@ -181,6 +183,8 @@ exception_common:
pop rax pop rax
mov qword [exception_info.rsp], rax mov qword [exception_info.rsp], rax
mov rax, cr2
mov qword [exception_info.cr2], rax
mov rax, cr3 mov rax, cr3
mov qword [exception_info.cr3], rax mov qword [exception_info.cr3], rax
@ -200,7 +204,7 @@ set_isr:
shr rdx, 16 shr rdx, 16
mov dword [rdi + 8], edx mov dword [rdi + 8], edx
or sil, 0xef or sil, 0x8e
mov byte [rdi + 5], sil mov byte [rdi + 5], sil
mov word [rdi + 2], 0x28 mov word [rdi + 2], 0x28
mov byte [rdi + 4], 1 mov byte [rdi + 4], 1
@ -225,13 +229,13 @@ section .text
load_gdt_and_idt: load_gdt_and_idt:
mov rcx, 8 mov rcx, 16
.loop: .loop:
mov rdi, rcx mov rdi, rcx
dec rdi dec rdi
mov sil, 1 mov sil, 0
mov rdx, qword [exception_isrs + rdi * 8] mov rdx, qword [exception_isrs + rdi * 8]
call set_isr call set_isr

View file

@ -21,6 +21,7 @@ struct [[gnu::packed]] exception_info_t {
uint64_t r14; uint64_t r14;
uint64_t r15; uint64_t r15;
uint64_t cr2;
uint64_t cr3; uint64_t cr3;
uint64_t rip; uint64_t rip;
uint64_t rflags; uint64_t rflags;
@ -103,7 +104,12 @@ extern "C" [[noreturn]] void print_exception() {
if (((exception_info.rflags >> i) & 1) == 1) if (((exception_info.rflags >> i) & 1) == 1)
terminal::put_string_sz(flag_names[i]); 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("rax", "rbx", exception_info.rax, exception_info.rbx);
print_line("rcx", "rdx", exception_info.rcx, exception_info.rdx); print_line("rcx", "rdx", exception_info.rcx, exception_info.rdx);
print_line("rdi", "rsi", exception_info.rdi, exception_info.rsi); print_line("rdi", "rsi", exception_info.rdi, exception_info.rsi);