This commit is contained in:
user
2026-02-25 15:20:06 +01:00
parent 8b271e2470
commit 23b453dac8
3 changed files with 37 additions and 10 deletions

View File

@@ -9,6 +9,8 @@
#include "../device/ps2controller.h"
#include "./epilogues.h"
#include "./guard.h"
#include "../memory/pagetable.h"
#include "../memory/pageframealloc.h"
static void printContext(const InterruptContext *context) {
DBG << "ip: " << hex << context->cs << ':' << context->ip
@@ -49,14 +51,39 @@ static void printContext(const InterruptContext *context) {
#include "syscall/skeleton.h"
[[gnu::interrupt]] static void handle_page_fault(InterruptContext *context,
uint64_t error) {
DBG << "Page fault encountered at linear address " << hex
<< Core::CR<2>::read() << endl
<< PageFaultError(error) << endl;
printContext(context);
uint64_t error) {
DBG << "Page fault encountered at linear address " << hex
<< Core::CR<2>::read() << endl
<< PageFaultError(error) << endl;
four_lvl_paging_t* paging_tree = Guard::enter().vault().scheduler.active()->paging_tree ;
asm volatile("mov %%cr3, %0" : "=r"(paging_tree));
Syscall::Skeleton::exit(Guard::enter().vault());
//kernelpanic("Page fault!");
uintptr_t virt = 0;
asm volatile("mov %%cr2, %0" : "=r"(virt));
if (PageFaultError(error).present && PageFaultError(error).write) {
uintptr_t pf =isMapped(virt, paging_tree);
uint64_t pf_number = uint64_t (pf >> 12 );
if(PageFrameAllocator::PageFrames[pf_number].ref_count==1){
setMapping(virt, (void*) pf , paging_tree, 1);
}else{
uintptr_t page = (uintptr_t) PageFrameAllocator::alloc(false);
//Syscall::Skeleton::map(page, 4096);
setMapping(virt, (void*) page , paging_tree, 1);
memcpy( (void*)page, (void*)virt, 4096);
Syscall::Skeleton::invlpg(virt);
}
}
Syscall::Skeleton::exit(Guard::enter().vault());
//kernelpanic("Page fault!");
}
/*! \brief Assembly interrupt handler for the keyboard.