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