From 2f529f9b558ca1c1bd74be7437a84e4711743404 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 01 Nov 2024 02:11:33 +0000 Subject: [PATCH] add xenomai --- kernel/arch/arm64/mm/fault.c | 40 +++++++++++++++++++++++++++++++++------- 1 files changed, 33 insertions(+), 7 deletions(-) diff --git a/kernel/arch/arm64/mm/fault.c b/kernel/arch/arm64/mm/fault.c index 45e652d..d755cbb 100644 --- a/kernel/arch/arm64/mm/fault.c +++ b/kernel/arch/arm64/mm/fault.c @@ -264,11 +264,11 @@ (esr & ESR_ELx_FSC_TYPE) != ESR_ELx_FSC_FAULT) return false; - local_irq_save(flags); + flags = hard_local_irq_save(); asm volatile("at s1e1r, %0" :: "r" (addr)); isb(); par = read_sysreg_par(); - local_irq_restore(flags); + hard_local_irq_restore(flags); /* * If we now have a valid translation, treat the translation fault as @@ -399,6 +399,12 @@ msg = "paging request"; } + /* + * Dovetail: Don't bother restoring the in-band stage in the + * non-recoverable fault case, we got busted and a full stage + * switch is likely to make things even worse. Try at least to + * get some debug output before panicing. + */ die_kernel_fault(msg, addr, esr, regs); } @@ -471,8 +477,10 @@ if (user_mode(regs)) { const struct fault_info *inf = esr_to_fault_info(esr); + mark_trap_entry(ARM64_TRAP_ACCESS, regs); set_thread_esr(addr, esr); arm64_force_sig_fault(inf->sig, inf->code, far, inf->name); + mark_trap_exit(ARM64_TRAP_ACCESS, regs); } else { __do_kernel_fault(addr, esr, regs); } @@ -536,6 +544,8 @@ if (kprobe_page_fault(regs, esr)) return 0; + + mark_trap_entry(ARM64_TRAP_ACCESS, regs); /* * If we're in an interrupt or have no user context, we must not take @@ -612,7 +622,7 @@ if (fault_signal_pending(fault, regs)) { if (!user_mode(regs)) goto no_context; - return 0; + goto out; } if (fault & VM_FAULT_RETRY) { @@ -637,7 +647,7 @@ */ if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS)))) - return 0; + goto out; /* * If we are in kernel mode at this point, we have no context to @@ -653,7 +663,7 @@ * oom-killed). */ pagefault_out_of_memory(); - return 0; + goto out; } inf = esr_to_fault_info(esr); @@ -682,10 +692,12 @@ far, inf->name); } - return 0; + goto out; no_context: __do_kernel_fault(addr, esr, regs); +out: + mark_trap_exit(ARM64_TRAP_ACCESS, regs); return 0; } @@ -731,6 +743,8 @@ const struct fault_info *inf; unsigned long siaddr; + mark_trap_entry(ARM64_TRAP_SEA, regs); + inf = esr_to_fault_info(esr); if (user_mode(regs) && apei_claim_sea(regs) == 0) { @@ -738,7 +752,7 @@ * APEI claimed this as a firmware-first notification. * Some processing deferred to task_work before ret_to_user(). */ - return 0; + goto out; } if (esr & ESR_ELx_FnV) { @@ -753,6 +767,8 @@ } trace_android_rvh_do_sea(regs, esr, siaddr, inf->name); arm64_notify_die(inf->name, regs, inf->sig, inf->code, siaddr, esr); +out: + mark_trap_exit(ARM64_TRAP_SEA, regs); return 0; } @@ -845,6 +861,8 @@ if (!inf->fn(far, esr, regs)) return; + mark_trap_entry(ARM64_TRAP_ACCESS, regs); + if (!user_mode(regs)) { pr_alert("Unhandled fault at 0x%016lx\n", addr); trace_android_rvh_do_mem_abort(regs, esr, addr, inf->name); @@ -858,6 +876,7 @@ * address to the signal handler. */ arm64_notify_die(inf->name, regs, inf->sig, inf->code, addr, esr); + mark_trap_exit(ARM64_TRAP_ACCESS, regs); } NOKPROBE_SYMBOL(do_mem_abort); @@ -871,9 +890,12 @@ void do_sp_pc_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs) { trace_android_rvh_do_sp_pc_abort(regs, esr, addr, user_mode(regs)); + mark_trap_entry(ARM64_TRAP_ALIGN, regs); arm64_notify_die("SP/PC alignment exception", regs, SIGBUS, BUS_ADRALN, addr, esr); + + mark_trap_exit(ARM64_TRAP_ALIGN, regs); } NOKPROBE_SYMBOL(do_sp_pc_abort); @@ -968,6 +990,8 @@ if (cortex_a76_erratum_1463225_debug_handler(regs)) return; + mark_trap_entry(ARM64_TRAP_DEBUG, regs); + debug_exception_enter(regs); if (user_mode(regs) && !is_ttbr0_addr(pc)) @@ -978,6 +1002,8 @@ } debug_exception_exit(regs); + + mark_trap_exit(ARM64_TRAP_DEBUG, regs); } NOKPROBE_SYMBOL(do_debug_exception); -- Gitblit v1.6.2