diff options
Diffstat (limited to 'arch/arm64/mm/fault.c')
| -rw-r--r-- | arch/arm64/mm/fault.c | 17 | 
1 files changed, 7 insertions, 10 deletions
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 9ae24e3b72be..77341b160aca 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -297,12 +297,14 @@ static void die_kernel_fault(const char *msg, unsigned long addr,  	pr_alert("Unable to handle kernel %s at virtual address %016lx\n", msg,  		 addr); +	kasan_non_canonical_hook(addr); +  	mem_abort_decode(esr);  	show_pte(addr);  	die("Oops", regs, esr);  	bust_spinlocks(0); -	do_exit(SIGKILL); +	make_task_dead(SIGKILL);  }  #ifdef CONFIG_KASAN_HW_TAGS @@ -606,10 +608,8 @@ retry:  	}  	if (fault & VM_FAULT_RETRY) { -		if (mm_flags & FAULT_FLAG_ALLOW_RETRY) { -			mm_flags |= FAULT_FLAG_TRIED; -			goto retry; -		} +		mm_flags |= FAULT_FLAG_TRIED; +		goto retry;  	}  	mmap_read_unlock(mm); @@ -813,11 +813,8 @@ void do_mem_abort(unsigned long far, unsigned int esr, struct pt_regs *regs)  	if (!inf->fn(far, esr, regs))  		return; -	if (!user_mode(regs)) { -		pr_alert("Unhandled fault at 0x%016lx\n", addr); -		mem_abort_decode(esr); -		show_pte(addr); -	} +	if (!user_mode(regs)) +		die_kernel_fault(inf->name, addr, esr, regs);  	/*  	 * At this point we have an unrecognized fault type whose tag bits may  |