Sophie

Sophie

distrib > Mandriva > current > x86_64 > by-pkgid > d41cc2729f5f0fbbd2607b14a49457f3 > files > 63

kernel-xen-2.6.32.11-2mdv2010.1.src.rpm

From: jbeulich@novell.com
Subject: dump the correct page tables for user mode faults
Patch-mainline: obsolete

--- head-2009-10-12.orig/arch/x86/mm/fault-xen.c	2009-10-13 13:40:11.000000000 +0200
+++ head-2009-10-12/arch/x86/mm/fault-xen.c	2009-10-13 17:28:26.000000000 +0200
@@ -328,6 +328,7 @@ static void dump_pagetable(unsigned long
 out:
 	printk(KERN_CONT "\n");
 }
+#define dump_pagetable(addr, krnl) dump_pagetable(addr)
 
 #else /* CONFIG_X86_64: */
 
@@ -452,7 +453,7 @@ static int bad_address(void *p)
 	return probe_kernel_address((unsigned long *)p, dummy);
 }
 
-static void dump_pagetable(unsigned long address)
+static void dump_pagetable(unsigned long address, bool kernel)
 {
 	pgd_t *base = __va(read_cr3() & PHYSICAL_PAGE_MASK);
 	pgd_t *pgd = base + pgd_index(address);
@@ -460,6 +461,9 @@ static void dump_pagetable(unsigned long
 	pmd_t *pmd;
 	pte_t *pte;
 
+	if (!kernel)
+		pgd = __user_pgd(base) + pgd_index(address);
+
 	if (bad_address(pgd))
 		goto bad;
 
@@ -598,7 +602,7 @@ show_fault_oops(struct pt_regs *regs, un
 	printk(KERN_ALERT "IP:");
 	printk_address(regs->ip, 1);
 
-	dump_pagetable(address);
+	dump_pagetable(address, !(error_code & PF_USER));
 }
 
 static noinline void
@@ -615,7 +619,7 @@ pgtable_bad(struct pt_regs *regs, unsign
 
 	printk(KERN_ALERT "%s: Corrupted page table at address %lx\n",
 	       tsk->comm, address);
-	dump_pagetable(address);
+	dump_pagetable(address, !(error_code & PF_USER));
 
 	tsk->thread.cr2		= address;
 	tsk->thread.trap_no	= 14;