Index: arch/ia32/src/interrupt.c
===================================================================
--- arch/ia32/src/interrupt.c	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
+++ arch/ia32/src/interrupt.c	(revision 0ee077eebd24dbac6378f54e3bd21d1724ef54f3)
@@ -55,5 +55,5 @@
 void (* eoi_function)(void) = NULL;
 
-static void PRINT_INFO_ERRCODE(istate_t *istate)
+void PRINT_INFO_ERRCODE(istate_t *istate)
 {
 	char *symbol = get_symtab_entry(istate->eip);
@@ -140,16 +140,4 @@
 }
 
-void page_fault(int n, istate_t *istate)
-{
-	__address page;
-
-	page = read_cr2();
-	if (as_page_fault(page, istate) == AS_PF_FAULT) {
-		PRINT_INFO_ERRCODE(istate);
-		printf("page fault address: %#x\n", page);
-		panic("page fault\n");
-	}
-}
-
 void syscall(int n, istate_t *istate)
 {
Index: arch/ia32/src/mm/page.c
===================================================================
--- arch/ia32/src/mm/page.c	(revision c1982e45cfd67b998329f3d32f3b52cbbc6caa5b)
+++ arch/ia32/src/mm/page.c	(revision 0ee077eebd24dbac6378f54e3bd21d1724ef54f3)
@@ -44,5 +44,4 @@
 #include <interrupt.h>
 
-
 void page_arch_init(void)
 {
@@ -88,2 +87,24 @@
 	return virtaddr;
 }
+
+void page_fault(int n, istate_t *istate)
+{
+        __address page;
+	pf_access_t access;
+	
+        page = read_cr2();
+		
+        if (istate->error_word & PFERR_CODE_RSVD)
+		panic("Reserved bit set in page directory.\n");
+
+	if (istate->error_word & PFERR_CODE_RW)
+		access = PF_ACCESS_WRITE;
+	else
+		access = PF_ACCESS_READ;
+
+        if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
+                PRINT_INFO_ERRCODE(istate);
+                printf("page fault address: %#x\n", page);
+                panic("page fault\n");
+        }
+}
