From 62bb81afc5ee6ed27abaa35fa6f06078b628485f Mon Sep 17 00:00:00 2001 From: Naina Mehta Date: Fri, 4 Mar 2022 14:54:41 +0530 Subject: [PATCH] ANDROID: fault: Add vendor hook for TLB conflict Add android_vh_handle_tlb_conf vendor hook to gracefully handle TLB conflict. Leaf changes summary: 1 artifact changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 1 Added variable 1 Added variable: [A] 'tracepoint __tracepoint_android_vh_handle_tlb_conf' Bug: 222637802 Change-Id: I3d6814cd950e77e1a15ce444764078692724cd0a Signed-off-by: Naina Mehta Signed-off-by: Vamsi Krishna Lanka --- android/abi_gki_aarch64_qcom | 1 + arch/arm64/include/asm/esr.h | 1 + arch/arm64/mm/fault.c | 6 +++++- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/fault.h | 4 ++++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 3d03f20ecb4a..61eed598be60 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -2034,6 +2034,7 @@ __tracepoint_android_vh_ftrace_oops_exit __tracepoint_android_vh_ftrace_size_check __tracepoint_android_vh_gic_resume + __tracepoint_android_vh_handle_tlb_conf __tracepoint_android_vh_ipi_stop __tracepoint_android_vh_jiffies_update __tracepoint_android_vh_kswapd_per_node diff --git a/arch/arm64/include/asm/esr.h b/arch/arm64/include/asm/esr.h index 8f59bbeba7a7..f2b6a8f90d57 100644 --- a/arch/arm64/include/asm/esr.h +++ b/arch/arm64/include/asm/esr.h @@ -112,6 +112,7 @@ #define ESR_ELx_FSC_ACCESS (0x08) #define ESR_ELx_FSC_FAULT (0x04) #define ESR_ELx_FSC_PERM (0x0C) +#define ESR_ELx_FSC_TLBCONF (0x30) /* ISS field definitions for Data Aborts */ #define ESR_ELx_ISV_SHIFT (24) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index cce6e000e5aa..59b56083da95 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -779,7 +779,11 @@ static int do_alignment_fault(unsigned long far, unsigned int esr, static int do_bad(unsigned long far, unsigned int esr, struct pt_regs *regs) { - return 1; /* "fault" */ + unsigned long addr = untagged_addr(far); + int ret = 1; + + trace_android_vh_handle_tlb_conf(addr, esr, &ret); + return ret; } static int do_sea(unsigned long far, unsigned int esr, struct pt_regs *regs) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 1c5f0d15ae4a..e26800015d9a 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -334,3 +334,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_tcp_recvmsg_stat); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_partial_init); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_mmc_cache_card_properties); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_print_transaction_info); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_handle_tlb_conf); diff --git a/include/trace/hooks/fault.h b/include/trace/hooks/fault.h index 75ecc8808961..6efbdbb2a979 100644 --- a/include/trace/hooks/fault.h +++ b/include/trace/hooks/fault.h @@ -25,6 +25,10 @@ DECLARE_RESTRICTED_HOOK(android_rvh_do_sp_pc_abort, TP_ARGS(addr, esr, regs), TP_CONDITION(!user_mode(regs))); +DECLARE_HOOK(android_vh_handle_tlb_conf, + TP_PROTO(unsigned long addr, unsigned int esr, int *ret), + TP_ARGS(addr, esr, ret)); + #endif /* _TRACE_HOOK_FAULT_H */ /* This part must be outside protection */ #include