diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index a070335cae20..058881de389e 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -728,6 +728,11 @@ static int do_sea(unsigned long far, unsigned int 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 04db2df1a662..8eaa9f02093e 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -219,6 +219,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_die_kernel_fault); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_sea); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_do_mem_abort); 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_iommu_setup_dma_ops); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_iommu_setup_dma_ops); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_iommu_alloc_iova); diff --git a/include/trace/hooks/fault.h b/include/trace/hooks/fault.h index de66a1ca33c7..0d99b07a3a66 100644 --- a/include/trace/hooks/fault.h +++ b/include/trace/hooks/fault.h @@ -40,6 +40,11 @@ DECLARE_HOOK(android_vh_handle_tlb_conf, /* macro versions of hooks are no longer required */ +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