mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andi Kleen <ak@suse.de>
To: "Jan Beulich" <jbeulich@novell.com>,
	linux-kernel@vger.kernel.org, patches@x86-64.org
Subject: [PATCH] [9/35] i386: adjustments to page table dump during oops (v4)
Date: Sat, 28 Apr 2007 19:52:33 +0200 (CEST)	[thread overview]
Message-ID: <20070428175233.6BA21151D1@wotan.suse.de> (raw)
In-Reply-To: <20070428752.712152000@suse.de>


From: "Jan Beulich" <jbeulich@novell.com>
- make the page table contents printing PAE capable
- make sure the address stored in current->thread.cr2 is unmodified
  from what was read from CR2
- don't call oops_may_print() multiple times, when one time suffices
- print pte even in highpte case, as long as the pte page isn't in
  actually in high memory (which is specifically the case for all page
  tables covering kernel space)

(Changes to v3: Use sizeof()*2 rather than the suggested sizeof()*4 for
printing width, use fixed 16-nibble width for PAE, and also apply the
max_low_pfn range check to the middle level lookup on PAE.)

Signed-off-by: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Andi Kleen <ak@suse.de>

---
 arch/i386/mm/fault.c |   55 ++++++++++++++++++++++++++++++++-------------------
 1 file changed, 35 insertions(+), 20 deletions(-)

Index: linux/arch/i386/mm/fault.c
===================================================================
--- linux.orig/arch/i386/mm/fault.c
+++ linux/arch/i386/mm/fault.c
@@ -20,6 +20,7 @@
 #include <linux/tty.h>
 #include <linux/vt_kern.h>		/* For unblank_screen() */
 #include <linux/highmem.h>
+#include <linux/bootmem.h>		/* for max_low_pfn */
 #include <linux/module.h>
 #include <linux/kprobes.h>
 #include <linux/uaccess.h>
@@ -301,7 +302,6 @@ fastcall void __kprobes do_page_fault(st
 	struct mm_struct *mm;
 	struct vm_area_struct * vma;
 	unsigned long address;
-	unsigned long page;
 	int write, si_code;
 
 	/* get the address */
@@ -510,7 +510,9 @@ no_context:
 	bust_spinlocks(1);
 
 	if (oops_may_print()) {
-	#ifdef CONFIG_X86_PAE
+		__typeof__(pte_val(__pte(0))) page;
+
+#ifdef CONFIG_X86_PAE
 		if (error_code & 16) {
 			pte_t *pte = lookup_address(address);
 
@@ -519,7 +521,7 @@ no_context:
 					"NX-protected page - exploit attempt? "
 					"(uid: %d)\n", current->uid);
 		}
-	#endif
+#endif
 		if (address < PAGE_SIZE)
 			printk(KERN_ALERT "BUG: unable to handle kernel NULL "
 					"pointer dereference");
@@ -529,25 +531,38 @@ no_context:
 		printk(" at virtual address %08lx\n",address);
 		printk(KERN_ALERT " printing eip:\n");
 		printk("%08lx\n", regs->eip);
-	}
-	page = read_cr3();
-	page = ((unsigned long *) __va(page))[address >> 22];
-	if (oops_may_print())
+
+		page = read_cr3();
+		page = ((__typeof__(page) *) __va(page))[address >> PGDIR_SHIFT];
+#ifdef CONFIG_X86_PAE
+		printk(KERN_ALERT "*pdpt = %016Lx\n", page);
+		if ((page >> PAGE_SHIFT) < max_low_pfn
+		    && page & _PAGE_PRESENT) {
+			page &= PAGE_MASK;
+			page = ((__typeof__(page) *) __va(page))[(address >> PMD_SHIFT)
+			                                         & (PTRS_PER_PMD - 1)];
+			printk(KERN_ALERT "*pde = %016Lx\n", page);
+			page &= ~_PAGE_NX;
+		}
+#else
 		printk(KERN_ALERT "*pde = %08lx\n", page);
-	/*
-	 * We must not directly access the pte in the highpte
-	 * case, the page table might be allocated in highmem.
-	 * And lets rather not kmap-atomic the pte, just in case
-	 * it's allocated already.
-	 */
-#ifndef CONFIG_HIGHPTE
-	if ((page & 1) && oops_may_print()) {
-		page &= PAGE_MASK;
-		address &= 0x003ff000;
-		page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT];
-		printk(KERN_ALERT "*pte = %08lx\n", page);
-	}
 #endif
+
+		/*
+		 * We must not directly access the pte in the highpte
+		 * case if the page table is located in highmem.
+		 * And let's rather not kmap-atomic the pte, just in case
+		 * it's allocated already.
+		 */
+		if ((page >> PAGE_SHIFT) < max_low_pfn
+		    && (page & _PAGE_PRESENT)) {
+			page &= PAGE_MASK;
+			page = ((__typeof__(page) *) __va(page))[(address >> PAGE_SHIFT)
+			                                         & (PTRS_PER_PTE - 1)];
+			printk(KERN_ALERT "*pte = %0*Lx\n", sizeof(page)*2, (u64)page);
+		}
+	}
+
 	tsk->thread.cr2 = address;
 	tsk->thread.trap_no = 14;
 	tsk->thread.error_code = error_code;

  parent reply	other threads:[~2007-04-28 18:17 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-28 17:52 [PATCH] [0/35] Some x86 2.6.22 candidate patches for review Andi Kleen
2007-04-28 17:52 ` [PATCH] [1/35] i386: revert i386-fix-the-verify_quirk_intel_irqbalance Andi Kleen
2007-04-28 17:52 ` [PATCH] [2/35] x86_64: revert x86_64-mm-add-genapic_force Andi Kleen
2007-04-28 17:52 ` [PATCH] [3/35] x86: revert x86_64-mm-fix-the-irqbalance-quirk-for-e7320-e7520-e7525 Andi Kleen
2007-04-28 17:52 ` [PATCH] [4/35] x86_64: optimize & fix APIC mode setup Andi Kleen
2007-04-28 17:52 ` [PATCH] [5/35] x86_64: always use physical delivery mode on > 8 CPUs Andi Kleen
2007-04-28 17:52 ` [PATCH] [6/35] x86_64: remove clustered APIC mode Andi Kleen
2007-04-28 17:52 ` [PATCH] [7/35] x86: default to physical mode on hotplug CPU kernels Andi Kleen
2007-04-28 17:52 ` [PATCH] [8/35] x86_64: a memcpy that tries to reduce cache pressure Andi Kleen
2007-04-30  7:26   ` [patches] [PATCH] [8/35] x86_64: a memcpy that tries to reducecache pressure Jan Beulich
2007-04-30  9:04     ` Andi Kleen
2007-04-30 16:14       ` Bryan O'Sullivan
2007-04-30 16:25         ` Andi Kleen
2007-04-28 17:52 ` Andi Kleen [this message]
2007-04-28 17:52 ` [PATCH] [10/35] x86: adjust inclusion of asm/fixmap.h Andi Kleen
2007-04-28 17:52 ` [PATCH] [11/35] x86_64: adjust inclusion of asm/vsyscall32.h Andi Kleen
2007-04-28 17:52 ` [PATCH] [12/35] x86: consolidate smp_send_stop() Andi Kleen
2007-04-28 17:52 ` [PATCH] [13/35] i386: No need to use -traditional for processing asm in i386/kernel/ Andi Kleen
2007-04-28 17:52 ` [PATCH] [14/35] i386: mtrr range check correction Andi Kleen
2007-04-28 17:52 ` [PATCH] [15/35] i386: pit_latch_buggy has no effect Andi Kleen
2007-04-28 17:52 ` [PATCH] [16/35] i386: Add an option for the VIA C7 which sets appropriate L1 cache Andi Kleen
2007-04-28 18:08   ` Jeff Garzik
2007-04-28 18:28     ` Dave Jones
2007-04-28 17:52 ` [PATCH] [17/35] i386: probe_roms() cleanup Andi Kleen
2007-04-28 17:52 ` [PATCH] [18/35] x86_64: a few missing entry.S annotations Andi Kleen
2007-04-28 17:52 ` [PATCH] [19/35] i386: Add dwarf2 annotations to *_user and checksum functions Andi Kleen
2007-04-28 17:52 ` [PATCH] [20/35] x86: Fix i386 and x86_64 fault information pollution Andi Kleen
2007-04-28 17:52 ` [PATCH] [21/35] x86_64: Some cleanup in time.c Andi Kleen
2007-04-28 17:52 ` [PATCH] [22/35] i386: i386 make NMI use PERFCTR1 for architectural perfmon (take 2) Andi Kleen
2007-04-28 17:52 ` [PATCH] [23/35] x86_64: x86_64 " Andi Kleen
2007-04-28 17:52 ` [PATCH] [24/35] i386: Add __init to probe_bigsmp Andi Kleen
2007-04-28 17:52 ` [PATCH] [25/35] i386: Change sysenter_setup to __cpuinit & improve __INIT, __INITDATA Andi Kleen
2007-04-28 17:52 ` [PATCH] [26/35] x86_64: Correct max number of CPUs in Kconfig Andi Kleen
2007-04-28 17:52 ` [PATCH] [27/35] i386: Support Oprofile for AMD Family 10 CPUs Andi Kleen
2007-04-28 17:52 ` [PATCH] [28/35] x86: Drop cc-options call for all options supported in gcc 3.2+ Andi Kleen
2007-04-28 17:52 ` [PATCH] [29/35] i386: Update __copy_to_user_inatomic linuxdoc description Andi Kleen
2007-04-28 17:52 ` [PATCH] [30/35] i386: clean up mach_reboot_fixups Andi Kleen
2007-04-28 17:52 ` [PATCH] [31/35] i386: Fix usage of -mtune when X86_GENERIC=y or CONFIG_MCORE2=y Andi Kleen
2007-04-28 17:52 ` [PATCH] [32/35] x86_64: Remove unused set_seg_base Andi Kleen
2007-04-28 17:52 ` [PATCH] [33/35] x86_64: Remove duplicated code for reading control registers Andi Kleen
2007-04-28 17:53 ` [PATCH] [34/35] x86_64: fix cpu MHz reporting on constant_tsc cpus Andi Kleen
2007-04-28 17:53 ` [PATCH] [35/35] i386: Simplify smp_call_function*() by using common implementation Andi Kleen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070428175233.6BA21151D1@wotan.suse.de \
    --to=ak@suse.de \
    --cc=jbeulich@novell.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=patches@x86-64.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®