diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 7d522b037d9a..2f63b2a86c63 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -746,6 +746,11 @@ static int do_sea(unsigned long far, unsigned long esr, struct pt_regs *regs) { const struct fault_info *inf; unsigned long siaddr; + bool can_fixup = false; + + trace_android_vh_try_fixup_sea(far, esr, regs, &can_fixup); + if (can_fixup && fixup_exception(regs)) + return 0; inf = esr_to_fault_info(esr); diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 20b3b02b7db4..19f96411720a 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -244,6 +244,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_try_to_freeze_todo_unfrozen); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_die_kernel_fault); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_sea); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_sp_pc_abort); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_try_fixup_sea); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_undefinstr); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_el1_bti); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_el1_fpac); diff --git a/include/trace/hooks/fault.h b/include/trace/hooks/fault.h index d3e26ea66160..121a3404806e 100644 --- a/include/trace/hooks/fault.h +++ b/include/trace/hooks/fault.h @@ -21,6 +21,11 @@ DECLARE_RESTRICTED_HOOK(android_rvh_do_sp_pc_abort, TP_ARGS(addr, esr, regs), TP_CONDITION(!user_mode(regs))); +DECLARE_HOOK(android_vh_try_fixup_sea, + TP_PROTO(unsigned long addr, unsigned long esr, struct pt_regs *regs, + bool *can_fixup), + TP_ARGS(addr, esr, regs, can_fixup)); + #endif /* _TRACE_HOOK_FAULT_H */ /* This part must be outside protection */ #include