diff options
author | Jon Santmyer <jon@jonsantmyer.com> | 2024-03-13 09:58:22 -0400 |
---|---|---|
committer | Jon Santmyer <jon@jonsantmyer.com> | 2024-03-13 09:58:22 -0400 |
commit | f46ab8ca2050ee77edf6e6b979875426bdaf29dc (patch) | |
tree | 1877f76c37adc4c7f7ea98a24f2cd1a61432ac63 /arch/x86_64/paging.c | |
parent | d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d (diff) | |
download | jove-kernel-f46ab8ca2050ee77edf6e6b979875426bdaf29dc.tar.gz jove-kernel-f46ab8ca2050ee77edf6e6b979875426bdaf29dc.tar.bz2 jove-kernel-f46ab8ca2050ee77edf6e6b979875426bdaf29dc.zip |
fix incorrect tss rsp assignment
Diffstat (limited to 'arch/x86_64/paging.c')
-rw-r--r-- | arch/x86_64/paging.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/arch/x86_64/paging.c b/arch/x86_64/paging.c index 76b5735..29c4863 100644 --- a/arch/x86_64/paging.c +++ b/arch/x86_64/paging.c @@ -1,4 +1,5 @@ #include "paging.h" +#include "interrupt.h" #include <stddef.h> #include "lib/jove.h" #include "io/log.h" @@ -129,9 +130,15 @@ mem_pd_ensure_range(struct PageDirectory *pd, uintptr_t from, uintptr_t to, uint } void +mem_ensure_range_for(void *pd, uintptr_t from, uintptr_t to, bool rw, bool user) +{ + mem_pd_ensure_range((struct PageDirectory*)pd, from, to, 1 | (rw << 1) | (user << 2)); +} + +void mem_ensure_range(uintptr_t from, uintptr_t to, bool rw, bool user) { - mem_pd_ensure_range(mem_current_pd, from, to, 1 | (rw << 1) | (user << 2)); + mem_ensure_range_for(mem_current_pd, from, to, rw, user); } void mem_pd_new(struct PageDirectory *pd) @@ -152,10 +159,33 @@ void mem_pd_clone(struct PageDirectory *pd, struct PageDirectory *parent) { mem_pd_new(pd); for(size_t i = 0; i < 256; i++) { - + //TODO: Impl pd cloning } } +struct Registers* +s_pagefault_handler(struct Registers *state) +{ + extern uint64_t __isr_err; + + uintptr_t fault_addr = 0; + __asm__ volatile("movq %%cr2, %0": "=r"(fault_addr)); + + bool present = __isr_err & 1; + bool write = __isr_err & 2; + bool user = __isr_err & 4; + bool fetch = __isr_err & 16; + + klogf("Page fault at %016X\n", fault_addr); + klogf("%s %s from a %s address\n", + user ? "user" : "kernel", + write ? "wrote" : "read", + present ? "present" : "non-present"); + + kpanic("Unhandled page fault at %016X\n", state->ip); + return state; +} + void mem_paging_setup(void) { @@ -198,5 +228,6 @@ mem_paging_setup(void) s_kernel_initial_pml1[0][i] = (i * PAGESIZE) + boot_kernel_physical_address | 3; } + int_set_handler(14, s_pagefault_handler); __asm__ volatile("mov %0, %%cr3":: "r"(s_kernel_initial_pd.pml4_paddr)); } |