7 #include <asm/kvm_asm.h>
8 #include <asm/kvm_hyp.h>
9 #include <asm/memory.h>
10 #include <asm/percpu.h>
12 DEFINE_PER_CPU(
unsigned long [OVERFLOW_STACK_SIZE/
sizeof(
long)], overflow_stack)
28 struct kvm_nvhe_stacktrace_info *stacktrace_info = this_cpu_ptr(&kvm_stacktrace_info);
29 struct kvm_nvhe_init_params *params = this_cpu_ptr(&kvm_init_params);
31 stacktrace_info->stack_base = (
unsigned long)(params->stack_hyp_va - PAGE_SIZE);
32 stacktrace_info->overflow_stack_base = (
unsigned long)this_cpu_ptr(overflow_stack);
33 stacktrace_info->fp = fp;
34 stacktrace_info->pc = pc;
37 #ifdef CONFIG_PROTECTED_NVHE_STACKTRACE
38 #include <asm/stacktrace/nvhe.h>
40 DEFINE_PER_CPU(
unsigned long [NVHE_STACKTRACE_SIZE/
sizeof(
long)], pkvm_stacktrace);
44 unsigned long low = (
unsigned long)this_cpu_ptr(overflow_stack);
45 unsigned long high = low + OVERFLOW_STACK_SIZE;
47 return (
struct stack_info) {
55 struct kvm_nvhe_init_params *params = this_cpu_ptr(&kvm_init_params);
56 unsigned long high = params->stack_hyp_va;
57 unsigned long low = high - PAGE_SIZE;
59 return (
struct stack_info) {
67 return unwind_next_frame_record(state);
70 static void notrace
unwind(
struct unwind_state *state,
71 stack_trace_consume_fn consume_entry,
77 if (!consume_entry(cookie, state->pc))
94 static bool pkvm_save_backtrace_entry(
void *arg,
unsigned long where)
96 unsigned long *stacktrace = this_cpu_ptr(pkvm_stacktrace);
97 int *idx = (
int *)arg;
103 if (*idx > ARRAY_SIZE(pkvm_stacktrace) - 2)
106 stacktrace[*idx] = where;
107 stacktrace[++*idx] = 0UL;
123 struct stack_info stacks[] = {
127 struct unwind_state state = {
129 .nr_stacks = ARRAY_SIZE(stacks),
133 kvm_nvhe_unwind_init(&state, fp, pc);
135 unwind(&state, pkvm_save_backtrace_entry, &idx);
154 if (is_protected_kvm_enabled())
DEFINE_PER_CPU(struct kvm_nvhe_stacktrace_info, kvm_stacktrace_info)
static void pkvm_save_backtrace(unsigned long fp, unsigned long pc)
void kvm_nvhe_prepare_backtrace(unsigned long fp, unsigned long pc)
static void hyp_prepare_backtrace(unsigned long fp, unsigned long pc)
static struct stack_info stackinfo_get_overflow(void)
static void unwind(struct unwind_state *state, stack_trace_consume_fn consume_entry, void *cookie)
static struct stack_info stackinfo_get_hyp(void)
static int unwind_next(struct unwind_state *state)