Lines Matching refs:esr

48 	int	(*fn)(unsigned long far, unsigned int esr,
58 static inline const struct fault_info *esr_to_fault_info(unsigned int esr) in esr_to_fault_info() argument
60 return fault_info + (esr & ESR_ELx_FSC); in esr_to_fault_info()
63 static inline const struct fault_info *esr_to_debug_fault_info(unsigned int esr) in esr_to_debug_fault_info() argument
65 return debug_fault_info + DBG_ESR_EVT(esr); in esr_to_debug_fault_info()
68 static void data_abort_decode(unsigned int esr) in data_abort_decode() argument
72 if (esr & ESR_ELx_ISV) { in data_abort_decode()
74 1U << ((esr & ESR_ELx_SAS) >> ESR_ELx_SAS_SHIFT)); in data_abort_decode()
76 (esr & ESR_ELx_SSE) >> ESR_ELx_SSE_SHIFT, in data_abort_decode()
77 (esr & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT); in data_abort_decode()
79 (esr & ESR_ELx_SF) >> ESR_ELx_SF_SHIFT, in data_abort_decode()
80 (esr & ESR_ELx_AR) >> ESR_ELx_AR_SHIFT); in data_abort_decode()
82 pr_alert(" ISV = 0, ISS = 0x%08lx\n", esr & ESR_ELx_ISS_MASK); in data_abort_decode()
86 (esr & ESR_ELx_CM) >> ESR_ELx_CM_SHIFT, in data_abort_decode()
87 (esr & ESR_ELx_WNR) >> ESR_ELx_WNR_SHIFT); in data_abort_decode()
90 static void mem_abort_decode(unsigned int esr) in mem_abort_decode() argument
94 pr_alert(" ESR = 0x%08x\n", esr); in mem_abort_decode()
96 ESR_ELx_EC(esr), esr_get_class_string(esr), in mem_abort_decode()
97 (esr & ESR_ELx_IL) ? 32 : 16); in mem_abort_decode()
99 (esr & ESR_ELx_SET_MASK) >> ESR_ELx_SET_SHIFT, in mem_abort_decode()
100 (esr & ESR_ELx_FnV) >> ESR_ELx_FnV_SHIFT); in mem_abort_decode()
102 (esr & ESR_ELx_EA) >> ESR_ELx_EA_SHIFT, in mem_abort_decode()
103 (esr & ESR_ELx_S1PTW) >> ESR_ELx_S1PTW_SHIFT); in mem_abort_decode()
105 if (esr_is_data_abort(esr)) in mem_abort_decode()
106 data_abort_decode(esr); in mem_abort_decode()
232 static bool is_el1_instruction_abort(unsigned int esr) in is_el1_instruction_abort() argument
234 return ESR_ELx_EC(esr) == ESR_ELx_EC_IABT_CUR; in is_el1_instruction_abort()
237 static inline bool is_el1_permission_fault(unsigned long addr, unsigned int esr, in is_el1_permission_fault() argument
240 unsigned int ec = ESR_ELx_EC(esr); in is_el1_permission_fault()
241 unsigned int fsc_type = esr & ESR_ELx_FSC_TYPE; in is_el1_permission_fault()
257 unsigned int esr, in is_spurious_el1_translation_fault() argument
263 if (ESR_ELx_EC(esr) != ESR_ELx_EC_DABT_CUR || in is_spurious_el1_translation_fault()
264 (esr & ESR_ELx_FSC_TYPE) != ESR_ELx_FSC_FAULT) in is_spurious_el1_translation_fault()
289 unsigned int esr, struct pt_regs *regs) in die_kernel_fault() argument
296 trace_android_rvh_die_kernel_fault(regs, esr, addr, msg); in die_kernel_fault()
297 mem_abort_decode(esr); in die_kernel_fault()
300 die("Oops", regs, esr); in die_kernel_fault()
306 static void report_tag_fault(unsigned long addr, unsigned int esr, in report_tag_fault() argument
326 is_write = !!(esr & ESR_ELx_WNR); in report_tag_fault()
331 static inline void report_tag_fault(unsigned long addr, unsigned int esr, in report_tag_fault() argument
335 static void do_tag_recovery(unsigned long addr, unsigned int esr, in do_tag_recovery() argument
339 report_tag_fault(addr, esr, regs); in do_tag_recovery()
350 static bool is_el1_mte_sync_tag_check_fault(unsigned int esr) in is_el1_mte_sync_tag_check_fault() argument
352 unsigned int ec = ESR_ELx_EC(esr); in is_el1_mte_sync_tag_check_fault()
353 unsigned int fsc = esr & ESR_ELx_FSC; in is_el1_mte_sync_tag_check_fault()
364 static void __do_kernel_fault(unsigned long addr, unsigned int esr, in __do_kernel_fault() argument
373 if (!is_el1_instruction_abort(esr) && fixup_exception(regs)) in __do_kernel_fault()
376 if (WARN_RATELIMIT(is_spurious_el1_translation_fault(addr, esr, regs), in __do_kernel_fault()
380 if (is_el1_mte_sync_tag_check_fault(esr)) { in __do_kernel_fault()
381 do_tag_recovery(addr, esr, regs); in __do_kernel_fault()
386 if (is_el1_permission_fault(addr, esr, regs)) { in __do_kernel_fault()
387 if (esr & ESR_ELx_WNR) in __do_kernel_fault()
389 else if (is_el1_instruction_abort(esr)) in __do_kernel_fault()
396 if (kfence_handle_page_fault(addr, esr & ESR_ELx_WNR, regs)) in __do_kernel_fault()
402 die_kernel_fault(msg, addr, esr, regs); in __do_kernel_fault()
405 static void set_thread_esr(unsigned long address, unsigned int esr) in set_thread_esr() argument
422 switch (ESR_ELx_EC(esr)) { in set_thread_esr()
433 esr &= ESR_ELx_EC_MASK | ESR_ELx_IL | in set_thread_esr()
435 esr |= ESR_ELx_FSC_FAULT; in set_thread_esr()
443 esr &= ESR_ELx_EC_MASK | ESR_ELx_IL; in set_thread_esr()
444 esr |= ESR_ELx_FSC_FAULT; in set_thread_esr()
453 WARN(1, "ESR 0x%x is not DABT or IABT from EL0\n", esr); in set_thread_esr()
454 esr = 0; in set_thread_esr()
459 current->thread.fault_code = esr; in set_thread_esr()
462 static void do_bad_area(unsigned long far, unsigned int esr, in do_bad_area() argument
472 const struct fault_info *inf = esr_to_fault_info(esr); in do_bad_area()
474 set_thread_esr(addr, esr); in do_bad_area()
477 __do_kernel_fault(addr, esr, regs); in do_bad_area()
512 static bool is_el0_instruction_abort(unsigned int esr) in is_el0_instruction_abort() argument
514 return ESR_ELx_EC(esr) == ESR_ELx_EC_IABT_LOW; in is_el0_instruction_abort()
521 static bool is_write_abort(unsigned int esr) in is_write_abort() argument
523 return (esr & ESR_ELx_WNR) && !(esr & ESR_ELx_CM); in is_write_abort()
526 static int __kprobes do_page_fault(unsigned long far, unsigned int esr, in do_page_fault() argument
537 if (kprobe_page_fault(regs, esr)) in do_page_fault()
550 if (is_el0_instruction_abort(esr)) { in do_page_fault()
553 } else if (is_write_abort(esr)) { in do_page_fault()
558 if (is_ttbr0_addr(addr) && is_el1_permission_fault(addr, esr, regs)) { in do_page_fault()
562 addr, esr, regs); in do_page_fault()
564 if (is_el1_instruction_abort(esr)) in do_page_fault()
566 addr, esr, regs); in do_page_fault()
570 addr, esr, regs); in do_page_fault()
659 inf = esr_to_fault_info(esr); in do_page_fault()
660 set_thread_esr(addr, esr); in do_page_fault()
688 __do_kernel_fault(addr, esr, regs); in do_page_fault()
693 unsigned int esr, in do_translation_fault() argument
699 return do_page_fault(far, esr, regs); in do_translation_fault()
701 do_bad_area(far, esr, regs); in do_translation_fault()
706 extern int alignment_fixup_helper(unsigned long addr, unsigned int esr,
709 static int do_alignment_fault(unsigned long far, unsigned int esr, in do_alignment_fault() argument
713 if (!alignment_fixup_helper(far, esr, regs)) in do_alignment_fault()
716 do_bad_area(far, esr, regs); in do_alignment_fault()
720 static int do_bad(unsigned long far, unsigned int esr, struct pt_regs *regs) in do_bad() argument
725 trace_android_vh_handle_tlb_conf(addr, esr, &ret); in do_bad()
729 static int do_sea(unsigned long far, unsigned int esr, struct pt_regs *regs) in do_sea() argument
734 inf = esr_to_fault_info(esr); in do_sea()
744 if (esr & ESR_ELx_FnV) { in do_sea()
754 trace_android_rvh_do_sea(regs, esr, siaddr, inf->name); in do_sea()
755 arm64_notify_die(inf->name, regs, inf->sig, inf->code, siaddr, esr); in do_sea()
760 static int do_tag_check_fault(unsigned long far, unsigned int esr, in do_tag_check_fault() argument
769 do_bad_area(far, esr, regs); in do_tag_check_fault()
840 void do_mem_abort(unsigned long far, unsigned int esr, struct pt_regs *regs) in do_mem_abort() argument
842 const struct fault_info *inf = esr_to_fault_info(esr); in do_mem_abort()
845 if (!inf->fn(far, esr, regs)) in do_mem_abort()
850 trace_android_rvh_do_mem_abort(regs, esr, addr, inf->name); in do_mem_abort()
851 mem_abort_decode(esr); in do_mem_abort()
860 arm64_notify_die(inf->name, regs, inf->sig, inf->code, addr, esr); in do_mem_abort()
871 void do_sp_pc_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs) in do_sp_pc_abort() argument
873 trace_android_rvh_do_sp_pc_abort(regs, esr, addr, user_mode(regs)); in do_sp_pc_abort()
876 addr, esr); in do_sp_pc_abort()
880 int __init early_brk64(unsigned long addr, unsigned int esr,
962 void do_debug_exception(unsigned long addr_if_watchpoint, unsigned int esr, in do_debug_exception() argument
965 const struct fault_info *inf = esr_to_debug_fault_info(esr); in do_debug_exception()
976 if (inf->fn(addr_if_watchpoint, esr, regs)) { in do_debug_exception()
977 arm64_notify_die(inf->name, regs, inf->sig, inf->code, pc, esr); in do_debug_exception()