Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b3279c7f authored by Harvey Harrison's avatar Harvey Harrison Committed by Ingo Molnar
Browse files

x86: introduce show_fault_oops helper to fault_32|64.c



This will help when unifying the oops dumping code on 32/64
bit.  No functional changes.

Signed-off-by: default avatarHarvey Harrison <harvey.harrison@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 35f3266f
Loading
Loading
Loading
Loading
+30 −24
Original line number Diff line number Diff line
@@ -323,6 +323,35 @@ static int is_f00f_bug(struct pt_regs *regs, unsigned long address)
	return 0;
}

static void show_fault_oops(struct pt_regs *regs, unsigned long error_code,
			    unsigned long address)
{
	if (!oops_may_print())
		return;

#ifdef CONFIG_X86_PAE
	if (error_code & PF_INSTR) {
		int level;
		pte_t *pte = lookup_address(address, &level);

		if (pte && pte_present(*pte) && !pte_exec(*pte))
			printk(KERN_CRIT "kernel tried to execute "
				"NX-protected page - exploit attempt? "
				"(uid: %d)\n", current->uid);
	}
#endif
	if (address < PAGE_SIZE)
		printk(KERN_ALERT "BUG: unable to handle kernel NULL "
				"pointer dereference");
	else
		printk(KERN_ALERT "BUG: unable to handle kernel paging"
				" request");
	printk(" at virtual address %08lx\n", address);
	printk(KERN_ALERT "printing ip: %08lx ", regs->ip);

	dump_pagetable(address);
}

/*
 * Handle a fault on the vmalloc or module mapping area
 *
@@ -633,30 +662,7 @@ no_context:

	bust_spinlocks(1);

	if (oops_may_print()) {

#ifdef CONFIG_X86_PAE
		if (error_code & PF_INSTR) {
			int level;
			pte_t *pte = lookup_address(address, &level);

			if (pte && pte_present(*pte) && !pte_exec(*pte))
				printk(KERN_CRIT "kernel tried to execute "
					"NX-protected page - exploit attempt? "
					"(uid: %d)\n", current->uid);
		}
#endif
		if (address < PAGE_SIZE)
			printk(KERN_ALERT "BUG: unable to handle kernel NULL "
					"pointer dereference");
		else
			printk(KERN_ALERT "BUG: unable to handle kernel paging"
					" request");
		printk(" at virtual address %08lx\n", address);
		printk(KERN_ALERT "printing ip: %08lx ", regs->ip);

		dump_pagetable(address);
	}
	show_fault_oops(regs, error_code, address);

	tsk->thread.cr2 = address;
	tsk->thread.trap_no = 14;
+14 −7
Original line number Diff line number Diff line
@@ -293,6 +293,18 @@ static int is_f00f_bug(struct pt_regs *regs, unsigned long address)
	return 0;
}

static void show_fault_oops(struct pt_regs *regs, unsigned long error_code,
			    unsigned long address)
{
	if (address < PAGE_SIZE)
		printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
	else
		printk(KERN_ALERT "Unable to handle kernel paging request");
	printk(" at %016lx RIP: \n" KERN_ALERT, address);
	printk_address(regs->ip, 1);
	dump_pagetable(address);
}

static noinline void pgtable_bad(unsigned long address, struct pt_regs *regs,
				 unsigned long error_code)
{
@@ -636,13 +648,8 @@ no_context:

	flags = oops_begin();

	if (address < PAGE_SIZE)
		printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
	else
		printk(KERN_ALERT "Unable to handle kernel paging request");
	printk(" at %016lx RIP: \n" KERN_ALERT, address);
	printk_address(regs->ip, 1);
	dump_pagetable(address);
	show_fault_oops(regs, error_code, address);

	tsk->thread.cr2 = address;
	tsk->thread.trap_no = 14;
	tsk->thread.error_code = error_code;