create copys of appcode in thread constructor
This commit is contained in:
@@ -51,39 +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;
|
||||
four_lvl_paging_t* paging_tree = Guard::enter().vault().scheduler.active()->paging_tree ;
|
||||
asm volatile("mov %%cr3, %0" : "=r"(paging_tree));
|
||||
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));
|
||||
|
||||
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 );
|
||||
//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, true);
|
||||
// if(PageFrameAllocator::PageFrames[pf_number].ref_count==1){
|
||||
// setMapping(virt, (void*) pf , paging_tree, true);
|
||||
|
||||
}else{
|
||||
// }else{
|
||||
|
||||
uintptr_t page = (uintptr_t) PageFrameAllocator::alloc(false);
|
||||
//Syscall::Skeleton::map(page, 4096);
|
||||
setMapping(virt, (void*) page , paging_tree, true);
|
||||
// uintptr_t page = (uintptr_t) PageFrameAllocator::alloc(false);
|
||||
// //Syscall::Skeleton::map(page, 4096);
|
||||
// setMapping(virt, (void*) page , paging_tree, true);
|
||||
|
||||
memcpy( (void*)page, (void*)virt, 4096);
|
||||
Syscall::Skeleton::invlpg(virt);
|
||||
}
|
||||
// memcpy( (void*)page, (void*)virt, 4096);
|
||||
// Syscall::Skeleton::invlpg(virt);
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
//}
|
||||
|
||||
//Syscall::Skeleton::exit(Guard::enter().vault());
|
||||
//kernelpanic("Page fault!");
|
||||
Syscall::Skeleton::exit(Guard::enter().vault());
|
||||
//kernelpanic("Page fault!");
|
||||
}
|
||||
|
||||
/*! \brief Assembly interrupt handler for the keyboard.
|
||||
|
||||
Reference in New Issue
Block a user