| .. | .. |
|---|
| 299 | 299 | show_pte(addr); |
|---|
| 300 | 300 | die("Oops", regs, esr); |
|---|
| 301 | 301 | bust_spinlocks(0); |
|---|
| 302 | | - do_exit(SIGKILL); |
|---|
| 302 | + make_task_dead(SIGKILL); |
|---|
| 303 | 303 | } |
|---|
| 304 | 304 | |
|---|
| 305 | 305 | #ifdef CONFIG_KASAN_HW_TAGS |
|---|
| .. | .. |
|---|
| 361 | 361 | return false; |
|---|
| 362 | 362 | } |
|---|
| 363 | 363 | |
|---|
| 364 | +static bool is_translation_fault(unsigned long esr) |
|---|
| 365 | +{ |
|---|
| 366 | + return (esr & ESR_ELx_FSC_TYPE) == ESR_ELx_FSC_FAULT; |
|---|
| 367 | +} |
|---|
| 368 | + |
|---|
| 364 | 369 | static void __do_kernel_fault(unsigned long addr, unsigned int esr, |
|---|
| 365 | 370 | struct pt_regs *regs) |
|---|
| 366 | 371 | { |
|---|
| .. | .. |
|---|
| 393 | 398 | } else if (addr < PAGE_SIZE) { |
|---|
| 394 | 399 | msg = "NULL pointer dereference"; |
|---|
| 395 | 400 | } else { |
|---|
| 396 | | - if (kfence_handle_page_fault(addr, esr & ESR_ELx_WNR, regs)) |
|---|
| 401 | + if (is_translation_fault(esr) && |
|---|
| 402 | + kfence_handle_page_fault(addr, esr & ESR_ELx_WNR, regs)) |
|---|
| 397 | 403 | return; |
|---|
| 398 | 404 | |
|---|
| 399 | 405 | msg = "paging request"; |
|---|
| .. | .. |
|---|
| 478 | 484 | } |
|---|
| 479 | 485 | } |
|---|
| 480 | 486 | |
|---|
| 481 | | -#define VM_FAULT_BADMAP 0x010000 |
|---|
| 482 | | -#define VM_FAULT_BADACCESS 0x020000 |
|---|
| 487 | +#define VM_FAULT_BADMAP ((__force vm_fault_t)0x010000) |
|---|
| 488 | +#define VM_FAULT_BADACCESS ((__force vm_fault_t)0x020000) |
|---|
| 483 | 489 | |
|---|
| 484 | 490 | static int __do_page_fault(struct vm_area_struct *vma, unsigned long addr, |
|---|
| 485 | 491 | unsigned int mm_flags, unsigned long vm_flags, |
|---|