aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64/kvm/stacktrace.c
diff options
context:
space:
mode:
authorMarc Zyngier <maz@kernel.org>2022-07-27 15:29:04 +0100
committerMarc Zyngier <maz@kernel.org>2022-07-27 18:18:03 +0100
commit0e773da1e688a1425ef7deae58fa11c5c7e09533 (patch)
tree954e7438412e6d442157c97e195dcd3dde8c5a19 /arch/arm64/kvm/stacktrace.c
parentKVM: arm64: Make unwind()/on_accessible_stack() per-unwinder functions (diff)
downloadlinux-dev-0e773da1e688a1425ef7deae58fa11c5c7e09533.tar.xz
linux-dev-0e773da1e688a1425ef7deae58fa11c5c7e09533.zip
KVM: arm64: Move nVHE-only helpers into kvm/stacktrace.c
kvm_nvhe_stack_kern_va() only makes sense as part of the nVHE unwinder, so simply move it there. Signed-off-by: Marc Zyngier <maz@kernel.org> Reviewed-by: Kalesh Singh <kaleshsingh@google.com> Tested-by: Kalesh Singh <kaleshsingh@google.com> Reviewed-by: Oliver Upton <oliver.upton@linux.dev> Link: https://lore.kernel.org/r/20220727142906.1856759-5-maz@kernel.org
Diffstat (limited to '')
-rw-r--r--arch/arm64/kvm/stacktrace.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/arm64/kvm/stacktrace.c b/arch/arm64/kvm/stacktrace.c
index 4d5fec3175ff..417665854f86 100644
--- a/arch/arm64/kvm/stacktrace.c
+++ b/arch/arm64/kvm/stacktrace.c
@@ -21,6 +21,47 @@
#include <asm/stacktrace/nvhe.h>
+/*
+ * kvm_nvhe_stack_kern_va - Convert KVM nVHE HYP stack addresses to a kernel VAs
+ *
+ * The nVHE hypervisor stack is mapped in the flexible 'private' VA range, to
+ * allow for guard pages below the stack. Consequently, the fixed offset address
+ * translation macros won't work here.
+ *
+ * The kernel VA is calculated as an offset from the kernel VA of the hypervisor
+ * stack base.
+ *
+ * Returns true on success and updates @addr to its corresponding kernel VA;
+ * otherwise returns false.
+ */
+static bool kvm_nvhe_stack_kern_va(unsigned long *addr,
+ enum stack_type type)
+{
+ struct kvm_nvhe_stacktrace_info *stacktrace_info;
+ unsigned long hyp_base, kern_base, hyp_offset;
+
+ stacktrace_info = this_cpu_ptr_nvhe_sym(kvm_stacktrace_info);
+
+ switch (type) {
+ case STACK_TYPE_HYP:
+ kern_base = (unsigned long)*this_cpu_ptr(&kvm_arm_hyp_stack_page);
+ hyp_base = (unsigned long)stacktrace_info->stack_base;
+ break;
+ case STACK_TYPE_OVERFLOW:
+ kern_base = (unsigned long)this_cpu_ptr_nvhe_sym(overflow_stack);
+ hyp_base = (unsigned long)stacktrace_info->overflow_stack_base;
+ break;
+ default:
+ return false;
+ }
+
+ hyp_offset = *addr - hyp_base;
+
+ *addr = kern_base + hyp_offset;
+
+ return true;
+}
+
static bool on_overflow_stack(unsigned long sp, unsigned long size,
struct stack_info *info)
{