From f46ab8ca2050ee77edf6e6b979875426bdaf29dc Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Wed, 13 Mar 2024 09:58:22 -0400 Subject: fix incorrect tss rsp assignment --- arch/x86_64/paging.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'arch/x86_64/paging.c') 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 #include "lib/jove.h" #include "io/log.h" @@ -128,10 +129,16 @@ mem_pd_ensure_range(struct PageDirectory *pd, uintptr_t from, uintptr_t to, uint mem_pd_ensure_4k(pd, from, flg); } +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)); } -- cgit v1.2.1