From c2b35d55f7c75640f4f04bd18e7fd66cabd3a1d8 Mon Sep 17 00:00:00 2001 From: Vincent Donnefort Date: Thu, 23 Feb 2023 15:42:02 +0000 Subject: [PATCH] ANDROID: KVM: arm64: Fix nVHE enter/exit events Some entry and exit points were not covered. This hopefully won't miss anything: each SMC call is exiting EL2 and when a CPU is being turned on, it goes directly through kvm_host_psci_cpu_entry(). Bug: 249050813 Change-Id: Ie88d36df249cb6f0f8e8a49df20654b0628d43d5 Signed-off-by: Vincent Donnefort --- arch/arm64/kvm/hyp/include/nvhe/arm-smccc.h | 13 +++++++++++++ arch/arm64/kvm/hyp/nvhe/ffa.c | 2 +- arch/arm64/kvm/hyp/nvhe/pkvm.c | 1 + arch/arm64/kvm/hyp/nvhe/psci-relay.c | 7 ++++--- arch/arm64/kvm/hyp/nvhe/switch.c | 1 - 5 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 arch/arm64/kvm/hyp/include/nvhe/arm-smccc.h diff --git a/arch/arm64/kvm/hyp/include/nvhe/arm-smccc.h b/arch/arm64/kvm/hyp/include/nvhe/arm-smccc.h new file mode 100644 index 000000000000..4b69d33e4f2d --- /dev/null +++ b/arch/arm64/kvm/hyp/include/nvhe/arm-smccc.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include + +#include + +#undef arm_smccc_1_1_smc +#define arm_smccc_1_1_smc(...) \ + do { \ + trace_hyp_exit(); \ + __arm_smccc_1_1(SMCCC_SMC_INST, __VA_ARGS__); \ + trace_hyp_enter(); \ + } while (0) diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c index 4d1c3c85b47d..6b8e6b97d3a8 100644 --- a/arch/arm64/kvm/hyp/nvhe/ffa.c +++ b/arch/arm64/kvm/hyp/nvhe/ffa.c @@ -26,10 +26,10 @@ * the duration and are therefore serialised. */ -#include #include #include +#include #include #include #include diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index 4c649db27ddf..040467669c6b 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -12,6 +12,7 @@ #include +#include #include #include #include diff --git a/arch/arm64/kvm/hyp/nvhe/psci-relay.c b/arch/arm64/kvm/hyp/nvhe/psci-relay.c index f48321fa6af9..d4825b6140ba 100644 --- a/arch/arm64/kvm/hyp/nvhe/psci-relay.c +++ b/arch/arm64/kvm/hyp/nvhe/psci-relay.c @@ -8,10 +8,10 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -186,7 +186,6 @@ static int psci_cpu_suspend(u64 func_id, struct kvm_cpu_context *host_ctxt) boot_args->r0 = r0; pkvm_psci_notify(PKVM_PSCI_CPU_SUSPEND, host_ctxt); - trace_hyp_exit(); /* * Will either return if shallow sleep state, or wake up into the entry * point if it is a deep sleep state. @@ -194,7 +193,6 @@ static int psci_cpu_suspend(u64 func_id, struct kvm_cpu_context *host_ctxt) ret = psci_call(func_id, power_state, __hyp_pa(&kvm_hyp_cpu_resume), __hyp_pa(init_params)); - trace_hyp_enter(); return ret; } @@ -230,6 +228,8 @@ asmlinkage void __noreturn kvm_host_psci_cpu_entry(bool is_cpu_on) struct psci_boot_args *boot_args; struct kvm_cpu_context *host_ctxt; + trace_hyp_enter(); + host_ctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt; if (is_cpu_on) @@ -245,6 +245,7 @@ asmlinkage void __noreturn kvm_host_psci_cpu_entry(bool is_cpu_on) pkvm_psci_notify(PKVM_PSCI_CPU_ENTRY, host_ctxt); + trace_hyp_exit(); __host_enter(host_ctxt); } diff --git a/arch/arm64/kvm/hyp/nvhe/switch.c b/arch/arm64/kvm/hyp/nvhe/switch.c index 01694d36e9df..aab17bcc3b6e 100644 --- a/arch/arm64/kvm/hyp/nvhe/switch.c +++ b/arch/arm64/kvm/hyp/nvhe/switch.c @@ -7,7 +7,6 @@ #include #include -#include #include #include #include