hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/arch/arm64/mm/fault.c
....@@ -264,11 +264,11 @@
264264 (esr & ESR_ELx_FSC_TYPE) != ESR_ELx_FSC_FAULT)
265265 return false;
266266
267
- local_irq_save(flags);
267
+ flags = hard_local_irq_save();
268268 asm volatile("at s1e1r, %0" :: "r" (addr));
269269 isb();
270270 par = read_sysreg_par();
271
- local_irq_restore(flags);
271
+ hard_local_irq_restore(flags);
272272
273273 /*
274274 * If we now have a valid translation, treat the translation fault as
....@@ -399,6 +399,12 @@
399399 msg = "paging request";
400400 }
401401
402
+ /*
403
+ * Dovetail: Don't bother restoring the in-band stage in the
404
+ * non-recoverable fault case, we got busted and a full stage
405
+ * switch is likely to make things even worse. Try at least to
406
+ * get some debug output before panicing.
407
+ */
402408 die_kernel_fault(msg, addr, esr, regs);
403409 }
404410
....@@ -471,8 +477,10 @@
471477 if (user_mode(regs)) {
472478 const struct fault_info *inf = esr_to_fault_info(esr);
473479
480
+ mark_trap_entry(ARM64_TRAP_ACCESS, regs);
474481 set_thread_esr(addr, esr);
475482 arm64_force_sig_fault(inf->sig, inf->code, far, inf->name);
483
+ mark_trap_exit(ARM64_TRAP_ACCESS, regs);
476484 } else {
477485 __do_kernel_fault(addr, esr, regs);
478486 }
....@@ -536,6 +544,8 @@
536544
537545 if (kprobe_page_fault(regs, esr))
538546 return 0;
547
+
548
+ mark_trap_entry(ARM64_TRAP_ACCESS, regs);
539549
540550 /*
541551 * If we're in an interrupt or have no user context, we must not take
....@@ -612,7 +622,7 @@
612622 if (fault_signal_pending(fault, regs)) {
613623 if (!user_mode(regs))
614624 goto no_context;
615
- return 0;
625
+ goto out;
616626 }
617627
618628 if (fault & VM_FAULT_RETRY) {
....@@ -637,7 +647,7 @@
637647 */
638648 if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP |
639649 VM_FAULT_BADACCESS))))
640
- return 0;
650
+ goto out;
641651
642652 /*
643653 * If we are in kernel mode at this point, we have no context to
....@@ -653,7 +663,7 @@
653663 * oom-killed).
654664 */
655665 pagefault_out_of_memory();
656
- return 0;
666
+ goto out;
657667 }
658668
659669 inf = esr_to_fault_info(esr);
....@@ -682,10 +692,12 @@
682692 far, inf->name);
683693 }
684694
685
- return 0;
695
+ goto out;
686696
687697 no_context:
688698 __do_kernel_fault(addr, esr, regs);
699
+out:
700
+ mark_trap_exit(ARM64_TRAP_ACCESS, regs);
689701 return 0;
690702 }
691703
....@@ -731,6 +743,8 @@
731743 const struct fault_info *inf;
732744 unsigned long siaddr;
733745
746
+ mark_trap_entry(ARM64_TRAP_SEA, regs);
747
+
734748 inf = esr_to_fault_info(esr);
735749
736750 if (user_mode(regs) && apei_claim_sea(regs) == 0) {
....@@ -738,7 +752,7 @@
738752 * APEI claimed this as a firmware-first notification.
739753 * Some processing deferred to task_work before ret_to_user().
740754 */
741
- return 0;
755
+ goto out;
742756 }
743757
744758 if (esr & ESR_ELx_FnV) {
....@@ -753,6 +767,8 @@
753767 }
754768 trace_android_rvh_do_sea(regs, esr, siaddr, inf->name);
755769 arm64_notify_die(inf->name, regs, inf->sig, inf->code, siaddr, esr);
770
+out:
771
+ mark_trap_exit(ARM64_TRAP_SEA, regs);
756772
757773 return 0;
758774 }
....@@ -845,6 +861,8 @@
845861 if (!inf->fn(far, esr, regs))
846862 return;
847863
864
+ mark_trap_entry(ARM64_TRAP_ACCESS, regs);
865
+
848866 if (!user_mode(regs)) {
849867 pr_alert("Unhandled fault at 0x%016lx\n", addr);
850868 trace_android_rvh_do_mem_abort(regs, esr, addr, inf->name);
....@@ -858,6 +876,7 @@
858876 * address to the signal handler.
859877 */
860878 arm64_notify_die(inf->name, regs, inf->sig, inf->code, addr, esr);
879
+ mark_trap_exit(ARM64_TRAP_ACCESS, regs);
861880 }
862881 NOKPROBE_SYMBOL(do_mem_abort);
863882
....@@ -871,9 +890,12 @@
871890 void do_sp_pc_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs)
872891 {
873892 trace_android_rvh_do_sp_pc_abort(regs, esr, addr, user_mode(regs));
893
+ mark_trap_entry(ARM64_TRAP_ALIGN, regs);
874894
875895 arm64_notify_die("SP/PC alignment exception", regs, SIGBUS, BUS_ADRALN,
876896 addr, esr);
897
+
898
+ mark_trap_exit(ARM64_TRAP_ALIGN, regs);
877899 }
878900 NOKPROBE_SYMBOL(do_sp_pc_abort);
879901
....@@ -968,6 +990,8 @@
968990 if (cortex_a76_erratum_1463225_debug_handler(regs))
969991 return;
970992
993
+ mark_trap_entry(ARM64_TRAP_DEBUG, regs);
994
+
971995 debug_exception_enter(regs);
972996
973997 if (user_mode(regs) && !is_ttbr0_addr(pc))
....@@ -978,6 +1002,8 @@
9781002 }
9791003
9801004 debug_exception_exit(regs);
1005
+
1006
+ mark_trap_exit(ARM64_TRAP_DEBUG, regs);
9811007 }
9821008 NOKPROBE_SYMBOL(do_debug_exception);
9831009