From 1f178b99cc3189a580c7f665bb67effabd777e8f Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 18 Aug 2011 07:08:25 -0700 Subject: [PATCH] now, the page fault handler determines the PGT's address correctly --- arch/x86/mm/page.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/arch/x86/mm/page.c b/arch/x86/mm/page.c index 2cb7ff5f..ee9e5f83 100644 --- a/arch/x86/mm/page.c +++ b/arch/x86/mm/page.c @@ -623,20 +623,18 @@ static void pagefault_handler(struct state *s) put_page(phyaddr); } + + // does our SVM system need to handle this page fault? index1 = viraddr >> 22; index2 = (viraddr >> 12) & 0x3FF; - - kprintf("page fault: pgd 0x%p\n", pgd); - if (pgd) - pgt = (page_table_t*) (pgd->entries[index1] & 0xFFFFF000); - kprintf("page fault: pgt 0x%p\n", pgt); - if (!pgt) + if (!pgd || !(pgd->entries[index1] & 0xFFFFF000)) + goto default_handler; + pgt = (page_table_t*) ((KERNEL_SPACE - 1024*PAGE_SIZE + index1*PAGE_SIZE) & 0xFFFFF000); + if (!pgt || !(pgt->entries[index2])) goto default_handler; - if (pgt->entries[index2] & PG_SVM) if (!svm_access_request(viraddr)) return; - kprintf("pgt->entries[%d] = 0x%x\n", index2, pgt->entries[index2]); default_handler: kprintf("PAGE FAULT: Task %u got page fault at %p (irq %d, cs:eip 0x%x:0x%x)\n", task->id, viraddr, s->int_no, s->cs, s->eip);