cow
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user