Lines Matching defs:esr

37 #include <asm/esr.h>
47 int (*fn)(unsigned long far, unsigned long esr,
57 static inline const struct fault_info *esr_to_fault_info(unsigned long esr)
59 return fault_info + (esr & ESR_ELx_FSC);
62 static inline const struct fault_info *esr_to_debug_fault_info(unsigned long esr)
64 return debug_fault_info + DBG_ESR_EVT(esr);
67 static void data_abort_decode(unsigned long esr)
69 unsigned long iss2 = ESR_ELx_ISS2(esr);
73 if (esr & ESR_ELx_ISV) {
75 1U << ((esr & ESR_ELx_SAS) >> ESR_ELx_SAS_SHIFT));
77 (esr & ESR_ELx_SSE) >> ESR_ELx_SSE_SHIFT,
78 (esr & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT);
80 (esr & ESR_ELx_SF) >> ESR_ELx_SF_SHIFT,
81 (esr & ESR_ELx_AR) >> ESR_ELx_AR_SHIFT);
84 esr & ESR_ELx_ISS_MASK, iss2);
88 (esr & ESR_ELx_CM) >> ESR_ELx_CM_SHIFT,
89 (esr & ESR_ELx_WNR) >> ESR_ELx_WNR_SHIFT,
100 static void mem_abort_decode(unsigned long esr)
104 pr_alert(" ESR = 0x%016lx\n", esr);
106 ESR_ELx_EC(esr), esr_get_class_string(esr),
107 (esr & ESR_ELx_IL) ? 32 : 16);
109 (esr & ESR_ELx_SET_MASK) >> ESR_ELx_SET_SHIFT,
110 (esr & ESR_ELx_FnV) >> ESR_ELx_FnV_SHIFT);
112 (esr & ESR_ELx_EA) >> ESR_ELx_EA_SHIFT,
113 (esr & ESR_ELx_S1PTW) >> ESR_ELx_S1PTW_SHIFT);
114 pr_alert(" FSC = 0x%02lx: %s\n", (esr & ESR_ELx_FSC),
115 esr_to_fault_info(esr)->name);
117 if (esr_is_data_abort(esr))
118 data_abort_decode(esr);
247 static bool is_el1_instruction_abort(unsigned long esr)
249 return ESR_ELx_EC(esr) == ESR_ELx_EC_IABT_CUR;
252 static bool is_el1_data_abort(unsigned long esr)
254 return ESR_ELx_EC(esr) == ESR_ELx_EC_DABT_CUR;
257 static inline bool is_el1_permission_fault(unsigned long addr, unsigned long esr,
260 if (!is_el1_data_abort(esr) && !is_el1_instruction_abort(esr))
263 if (esr_fsc_is_permission_fault(esr))
267 return esr_fsc_is_translation_fault(esr) &&
274 unsigned long esr,
280 if (!is_el1_data_abort(esr) || !esr_fsc_is_translation_fault(esr))
305 unsigned long esr, struct pt_regs *regs)
314 mem_abort_decode(esr);
317 die("Oops", regs, esr);
323 static void report_tag_fault(unsigned long addr, unsigned long esr,
330 bool is_write = !!(esr & ESR_ELx_WNR);
335 static inline void report_tag_fault(unsigned long addr, unsigned long esr,
339 static void do_tag_recovery(unsigned long addr, unsigned long esr,
343 report_tag_fault(addr, esr, regs);
355 static bool is_el1_mte_sync_tag_check_fault(unsigned long esr)
357 unsigned long fsc = esr & ESR_ELx_FSC;
359 if (!is_el1_data_abort(esr))
368 static void __do_kernel_fault(unsigned long addr, unsigned long esr,
377 if (!is_el1_instruction_abort(esr) && fixup_exception(regs))
380 if (WARN_RATELIMIT(is_spurious_el1_translation_fault(addr, esr, regs),
384 if (is_el1_mte_sync_tag_check_fault(esr)) {
385 do_tag_recovery(addr, esr, regs);
390 if (is_el1_permission_fault(addr, esr, regs)) {
391 if (esr & ESR_ELx_WNR)
393 else if (is_el1_instruction_abort(esr))
400 if (esr_fsc_is_translation_fault(esr) &&
401 kfence_handle_page_fault(addr, esr & ESR_ELx_WNR, regs))
410 die_kernel_fault(msg, addr, esr, regs);
413 static void set_thread_esr(unsigned long address, unsigned long esr)
430 switch (ESR_ELx_EC(esr)) {
441 esr &= ESR_ELx_EC_MASK | ESR_ELx_IL |
443 esr |= ESR_ELx_FSC_FAULT;
451 esr &= ESR_ELx_EC_MASK | ESR_ELx_IL;
452 esr |= ESR_ELx_FSC_FAULT;
461 WARN(1, "ESR 0x%lx is not DABT or IABT from EL0\n", esr);
462 esr = 0;
467 current->thread.fault_code = esr;
470 static void do_bad_area(unsigned long far, unsigned long esr,
480 const struct fault_info *inf = esr_to_fault_info(esr);
482 set_thread_esr(addr, esr);
485 __do_kernel_fault(addr, esr, regs);
508 static bool is_el0_instruction_abort(unsigned long esr)
510 return ESR_ELx_EC(esr) == ESR_ELx_EC_IABT_LOW;
517 static bool is_write_abort(unsigned long esr)
519 return (esr & ESR_ELx_WNR) && !(esr & ESR_ELx_CM);
522 static int __kprobes do_page_fault(unsigned long far, unsigned long esr,
533 if (kprobe_page_fault(regs, esr))
552 if (is_el0_instruction_abort(esr)) {
556 } else if (is_write_abort(esr)) {
570 if (is_ttbr0_addr(addr) && is_el1_permission_fault(addr, esr, regs)) {
571 if (is_el1_instruction_abort(esr))
573 addr, esr, regs);
577 addr, esr, regs);
664 inf = esr_to_fault_info(esr);
665 set_thread_esr(addr, esr);
693 __do_kernel_fault(addr, esr, regs);
698 unsigned long esr,
704 return do_page_fault(far, esr, regs);
706 do_bad_area(far, esr, regs);
710 static int do_alignment_fault(unsigned long far, unsigned long esr,
716 do_bad_area(far, esr, regs);
720 static int do_bad(unsigned long far, unsigned long esr, struct pt_regs *regs)
725 static int do_sea(unsigned long far, unsigned long esr, struct pt_regs *regs)
730 inf = esr_to_fault_info(esr);
740 if (esr & ESR_ELx_FnV) {
750 arm64_notify_die(inf->name, regs, inf->sig, inf->code, siaddr, esr);
755 static int do_tag_check_fault(unsigned long far, unsigned long esr,
764 do_bad_area(far, esr, regs);
835 void do_mem_abort(unsigned long far, unsigned long esr, struct pt_regs *regs)
837 const struct fault_info *inf = esr_to_fault_info(esr);
840 if (!inf->fn(far, esr, regs))
844 die_kernel_fault(inf->name, addr, esr, regs);
851 arm64_notify_die(inf->name, regs, inf->sig, inf->code, addr, esr);
855 void do_sp_pc_abort(unsigned long addr, unsigned long esr, struct pt_regs *regs)
858 addr, esr);
912 void do_debug_exception(unsigned long addr_if_watchpoint, unsigned long esr,
915 const struct fault_info *inf = esr_to_debug_fault_info(esr);
923 if (inf->fn(addr_if_watchpoint, esr, regs)) {
924 arm64_notify_die(inf->name, regs, inf->sig, inf->code, pc, esr);