diff --git a/src/kernel/idt.c b/src/kernel/idt.c index 9b133e0..b116d8a 100644 --- a/src/kernel/idt.c +++ b/src/kernel/idt.c @@ -19,8 +19,14 @@ __attribute__((interrupt)) void interrupt_20(struct interrupt_frame* frame) { outb(0x20, 0x20); } +__attribute__((interrupt)) void page_fault(struct interrupt_frame* frame, uint32_t err_code) { + uint32_t problem_address; + asm("mov %%cr2, %0" : "=a" (problem_address) :); + printf("Page Fault at %x\n", problem_address); +} + __attribute__((interrupt)) void ignore_interrupt(struct interrupt_frame* frame) { - // Do nothing + outb(0x20, 0x20); } void init_idt() { @@ -30,6 +36,7 @@ void init_idt() { set_entry(i, 0x08, &ignore_interrupt, 0x8E); set_entry(0x20, 0x08, &interrupt_20, 0x8E); + set_entry(0xE, 0x08, &page_fault, 0x8E); outb(0x20, 0x11); outb(0xA0, 0x11); diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index f59ea08..46483e7 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -72,6 +72,9 @@ int main() { load_file(filenamebuffer, filebuffer); printf(filebuffer); + } else if (strcmp(buffer, "pagefault", 9)) { + uint32_t* bad_addr = 0xdeadbeef; + uint32_t a = *bad_addr; } else { char filenamebuffer[12]; decode_filename(buffer, filenamebuffer);