Lines Matching refs:esr

34 #include <asm/esr.h>
43 int (*fn)(unsigned long addr, unsigned int esr,
53 static inline const struct fault_info *esr_to_fault_info(unsigned int esr)
55 return fault_info + (esr & ESR_ELx_FSC);
58 static inline const struct fault_info *esr_to_debug_fault_info(unsigned int esr)
60 return debug_fault_info + DBG_ESR_EVT(esr);
63 static void data_abort_decode(unsigned int esr)
67 if (esr & ESR_ELx_ISV) {
69 1U << ((esr & ESR_ELx_SAS) >> ESR_ELx_SAS_SHIFT));
71 (esr & ESR_ELx_SSE) >> ESR_ELx_SSE_SHIFT,
72 (esr & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT);
74 (esr & ESR_ELx_SF) >> ESR_ELx_SF_SHIFT,
75 (esr & ESR_ELx_AR) >> ESR_ELx_AR_SHIFT);
77 pr_alert(" ISV = 0, ISS = 0x%08lx\n", esr & ESR_ELx_ISS_MASK);
81 (esr & ESR_ELx_CM) >> ESR_ELx_CM_SHIFT,
82 (esr & ESR_ELx_WNR) >> ESR_ELx_WNR_SHIFT);
85 static void mem_abort_decode(unsigned int esr)
89 pr_alert(" ESR = 0x%08x\n", esr);
91 ESR_ELx_EC(esr), esr_get_class_string(esr),
92 (esr & ESR_ELx_IL) ? 32 : 16);
94 (esr & ESR_ELx_SET_MASK) >> ESR_ELx_SET_SHIFT,
95 (esr & ESR_ELx_FnV) >> ESR_ELx_FnV_SHIFT);
97 (esr & ESR_ELx_EA) >> ESR_ELx_EA_SHIFT,
98 (esr & ESR_ELx_S1PTW) >> ESR_ELx_S1PTW_SHIFT);
100 if (esr_is_data_abort(esr))
101 data_abort_decode(esr);
227 static bool is_el1_instruction_abort(unsigned int esr)
229 return ESR_ELx_EC(esr) == ESR_ELx_EC_IABT_CUR;
232 static inline bool is_el1_permission_fault(unsigned long addr, unsigned int esr,
235 unsigned int ec = ESR_ELx_EC(esr);
236 unsigned int fsc_type = esr & ESR_ELx_FSC_TYPE;
252 unsigned int esr,
258 if (ESR_ELx_EC(esr) != ESR_ELx_EC_DABT_CUR ||
259 (esr & ESR_ELx_FSC_TYPE) != ESR_ELx_FSC_FAULT)
284 unsigned int esr, struct pt_regs *regs)
291 mem_abort_decode(esr);
294 die("Oops", regs, esr);
299 static void __do_kernel_fault(unsigned long addr, unsigned int esr,
308 if (!is_el1_instruction_abort(esr) && fixup_exception(regs))
311 if (WARN_RATELIMIT(is_spurious_el1_translation_fault(addr, esr, regs),
315 if (is_el1_permission_fault(addr, esr, regs)) {
316 if (esr & ESR_ELx_WNR)
318 else if (is_el1_instruction_abort(esr))
328 die_kernel_fault(msg, addr, esr, regs);
331 static void set_thread_esr(unsigned long address, unsigned int esr)
348 switch (ESR_ELx_EC(esr)) {
359 esr &= ESR_ELx_EC_MASK | ESR_ELx_IL |
361 esr |= ESR_ELx_FSC_FAULT;
369 esr &= ESR_ELx_EC_MASK | ESR_ELx_IL;
370 esr |= ESR_ELx_FSC_FAULT;
379 WARN(1, "ESR 0x%x is not DABT or IABT from EL0\n", esr);
380 esr = 0;
385 current->thread.fault_code = esr;
388 static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *regs)
395 const struct fault_info *inf = esr_to_fault_info(esr);
397 set_thread_esr(addr, esr);
401 __do_kernel_fault(addr, esr, regs);
437 static bool is_el0_instruction_abort(unsigned int esr)
439 return ESR_ELx_EC(esr) == ESR_ELx_EC_IABT_LOW;
446 static bool is_write_abort(unsigned int esr)
448 return (esr & ESR_ELx_WNR) && !(esr & ESR_ELx_CM);
451 static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
460 if (kprobe_page_fault(regs, esr))
473 if (is_el0_instruction_abort(esr)) {
476 } else if (is_write_abort(esr)) {
481 if (is_ttbr0_addr(addr) && is_el1_permission_fault(addr, esr, regs)) {
485 addr, esr, regs);
487 if (is_el1_instruction_abort(esr))
489 addr, esr, regs);
493 addr, esr, regs);
563 inf = esr_to_fault_info(esr);
564 set_thread_esr(addr, esr);
595 __do_kernel_fault(addr, esr, regs);
600 unsigned int esr,
604 return do_page_fault(addr, esr, regs);
606 do_bad_area(addr, esr, regs);
610 static int do_alignment_fault(unsigned long addr, unsigned int esr,
613 do_bad_area(addr, esr, regs);
617 static int do_bad(unsigned long addr, unsigned int esr, struct pt_regs *regs)
622 static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs)
627 inf = esr_to_fault_info(esr);
637 if (esr & ESR_ELx_FnV)
641 arm64_notify_die(inf->name, regs, inf->sig, inf->code, siaddr, esr);
646 static int do_tag_check_fault(unsigned long addr, unsigned int esr,
649 do_bad_area(addr, esr, regs);
720 void do_mem_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs)
722 const struct fault_info *inf = esr_to_fault_info(esr);
724 if (!inf->fn(addr, esr, regs))
729 mem_abort_decode(esr);
734 inf->sig, inf->code, (void __user *)addr, esr);
745 void do_sp_pc_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs)
748 SIGBUS, BUS_ADRALN, (void __user *)addr, esr);
752 int __init early_brk64(unsigned long addr, unsigned int esr,
834 void do_debug_exception(unsigned long addr_if_watchpoint, unsigned int esr,
837 const struct fault_info *inf = esr_to_debug_fault_info(esr);
848 if (inf->fn(addr_if_watchpoint, esr, regs)) {
850 inf->sig, inf->code, (void __user *)pc, esr);