BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / d46e09a34ca8cd546f3a4312976cf3b6a5a55ccf / memory

// Related

Nucleus

Barry Improved context switching and interrupt handling d46e09a (3 years, 2 months ago)
diff --git a/memory/fault.c b/memory/fault.c
index e916368..5f94b55 100644
--- a/memory/fault.c
+++ b/memory/fault.c
@@ -44,9 +44,6 @@ copy_on_write(VMRegion *region, uintptr_t addr)
 		inode = back->inode;
 		page = find_page(inode->pages, offset);
 	}
-	if (!page) {
-		panic("no page! %#.8x = %#.8x", addr, get_page(addr));
-	}
 	ASSERT(page);
 
 	/* Determine what to do */
@@ -174,21 +171,21 @@ not_present_write(VMRegion *region, uintptr_t addr)
 
 /* Page fault handler */
 void
-page_fault_handler(struct InterruptFrame *frame, uint32_t err)
+page_fault_handler(struct InterruptFrame *frame)
 {
 	uintptr_t addr;
 	asm volatile("mov %%cr2, %0" : "=r" (addr));
-	uint8_t present = err & (1 << 0);
-	uint8_t write   = err & (1 << 1);
-	uint8_t user    = err & (1 << 2);
+	uint8_t present = frame->err & (1 << 0);
+	uint8_t write   = frame->err & (1 << 1);
+	uint8_t user    = frame->err & (1 << 2);
 
 	/* Iterate VM Regions */
 	VMRegion *region = find_region(addr);
 	/* Not in a region */
 	if (__builtin_expect(!region, 0)) {
 		page_t pg = get_page(addr);
-		panic("Page Fault [%d:%d] (%#.8x -> %#.8x [tbl:%d, pg:%d][%#.8x], %s, %s, %s)",
-		      current->tgid, current->tid, frame->eip,
+		panic("[CPU#%d] Page Fault [%d:%d] (%#.8x -> %#.8x [tbl:%d, pg:%d][%#.8x], %s, %s, %s)",
+		      CPUID, current->tgid, current->tid, frame->eip,
 		      addr, (addr >> 12) / 1024, (addr >> 12) % 1024, pg,
 		      present ? "present" : "not present",
 		      write ? "write" : "read",
@@ -208,13 +205,13 @@ page_fault_handler(struct InterruptFrame *frame, uint32_t err)
 
 /* Early (pre-VFS/tasking) page fault handler */
 void
-early_page_fault_handler(struct InterruptFrame *frame, uint32_t err)
+early_page_fault_handler(struct InterruptFrame *frame)
 {
 	uintptr_t addr;
 	asm volatile("mov %%cr2, %0" : "=r" (addr));
-	uint8_t present = err & (1 << 0);
-	uint8_t write   = err & (1 << 1);
-	uint8_t user    = err & (1 << 2);
+	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 (CPU#%d)", frame->eip, CPUID);
 	ASSERT(!present);
diff --git a/memory/paging.h b/memory/paging.h
index 284d0e3..eb7c75f 100644
--- a/memory/paging.h
+++ b/memory/paging.h
@@ -7,6 +7,6 @@
 
 extern page_t zeroFrame;
 
-void early_page_fault_handler(struct InterruptFrame *frame, uint32_t err);
+void early_page_fault_handler(struct InterruptFrame *frame);
 
 #endif