create copys of appcode in thread constructor

This commit is contained in:
2026-02-28 18:01:15 +01:00
parent 1acc652446
commit 4976ea91be
9 changed files with 265 additions and 180 deletions

View File

@@ -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.