BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / 08afe80d1ca157b9cddb31ee48ab0e6e1823f559 / memory / fault.c

// Related

Nucleus

Barry Object manager and heap in kernel library 08afe80 (3 years, 2 months ago)
diff --git a/memory/fault.c b/memory/fault.c
index 80dc5e0..d8accb6 100644
--- a/memory/fault.c
+++ b/memory/fault.c
@@ -13,9 +13,10 @@
 #include <nucleus/lib.h>
 #include <nucleus/memory.h>
 #include <nucleus/task.h>
-#include "paging.h"
 #include "namespace.h"
 
+extern page_t zeroFrame;
+
 VMRegion *find_region(uintptr_t addr);
 void copy_page_frame(page_t src, page_t dest);
 
@@ -179,13 +180,15 @@ page_fault_handler(struct InterruptFrame *frame)
 	uint8_t write   = frame->err & (1 << 1);
 	uint8_t user    = frame->err & (1 << 2);
 
+	ASSERT(current && current->vm);
+
 	/* Iterate VM Regions */
 	VMRegion *region = find_region(addr);
 	/* Not in a region */
 	if (__builtin_expect(!region, 0)) {
 		page_t pg = get_page(addr);
-		panic("[CPU#%d] Page Fault [%d:%d] (%#.8x -> %#.8x [tbl:%d, pg:%d][%#.8x], %s, %s, %s)",
-		      cpu->id, current->tgid, current->tid, frame->eip,
+		panic("Page Fault [%d:%d] (%#.8x -> %#.8x [tbl:%d, pg:%d][%#.8x], %s, %s, %s)",
+		      current->tgid, current->tid, frame->eip,
 		      addr, (addr >> 12) / 1024, (addr >> 12) % 1024, pg,
 		      present ? "present" : "not present",
 		      write ? "write" : "read",
@@ -202,21 +205,3 @@ page_fault_handler(struct InterruptFrame *frame)
 	if (!present && !write)
 		return not_present_read(region, addr);
 }
-
-/* Early (pre-VFS/tasking) page fault handler */
-void
-early_page_fault_handler(struct InterruptFrame *frame)
-{
-	uintptr_t addr;
-	asm volatile("mov %%cr2, %0" : "=r" (addr));
-	uint8_t present = frame->err & (1 << 0);
-	uint8_t write   = frame->err & (1 << 1);
-	uint8_t user    = frame->err & (1 << 2);
-	if (!PAGE_ADDR(addr))
-		panic("Null dereference @ %#.8x -> %#.8x", frame->eip, addr);
-	ASSERT(!present);
-	kprintf("Allocating frame for %#.8x [%#.8x] CPU#%d",
-	        addr, frame->eip, cpu->id);
-	/* Allocate a page */
-	set_page(addr, alloc_frame() | PTE_PRESENT | PTE_WRITE | PTE_GLOBAL);
-}