diff options
Diffstat (limited to 'arch/x86/mm/fault.c')
| -rw-r--r-- | arch/x86/mm/fault.c | 12 | 
1 files changed, 8 insertions, 4 deletions
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 73bd8c95ac71..9a84a0d08727 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -209,6 +209,7 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address,  	unsigned lsb = 0;  	siginfo_t info; +	clear_siginfo(&info);  	info.si_signo	= si_signo;  	info.si_errno	= 0;  	info.si_code	= si_code; @@ -439,7 +440,7 @@ static noinline int vmalloc_fault(unsigned long address)  	if (pgd_none(*pgd_k))  		return -1; -	if (pgtable_l5_enabled) { +	if (pgtable_l5_enabled()) {  		if (pgd_none(*pgd)) {  			set_pgd(pgd, *pgd_k);  			arch_flush_lazy_mmu_mode(); @@ -454,7 +455,7 @@ static noinline int vmalloc_fault(unsigned long address)  	if (p4d_none(*p4d_k))  		return -1; -	if (p4d_none(*p4d) && !pgtable_l5_enabled) { +	if (p4d_none(*p4d) && !pgtable_l5_enabled()) {  		set_p4d(p4d, *p4d_k);  		arch_flush_lazy_mmu_mode();  	} else { @@ -828,6 +829,8 @@ static inline void  show_signal_msg(struct pt_regs *regs, unsigned long error_code,  		unsigned long address, struct task_struct *tsk)  { +	const char *loglvl = task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG; +  	if (!unhandled_signal(tsk, SIGSEGV))  		return; @@ -835,13 +838,14 @@ show_signal_msg(struct pt_regs *regs, unsigned long error_code,  		return;  	printk("%s%s[%d]: segfault at %lx ip %px sp %px error %lx", -		task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG, -		tsk->comm, task_pid_nr(tsk), address, +		loglvl, tsk->comm, task_pid_nr(tsk), address,  		(void *)regs->ip, (void *)regs->sp, error_code);  	print_vma_addr(KERN_CONT " in ", regs->ip);  	printk(KERN_CONT "\n"); + +	show_opcodes((u8 *)regs->ip, loglvl);  }  static void  | 
