xref: /optee_os/core/arch/riscv/kernel/unwind_rv.c (revision 2e5a3b0d63ddd51c4795a01a5bde2157dc0ddbf6)
1*2e5a3b0dSAlvin Chang // SPDX-License-Identifier: BSD-2-Clause
2*2e5a3b0dSAlvin Chang /*-
3*2e5a3b0dSAlvin Chang  * Copyright (c) 2023 Andes Technology Corporation
4*2e5a3b0dSAlvin Chang  * Copyright (c) 2015 Linaro Limited
5*2e5a3b0dSAlvin Chang  * Copyright (c) 2015 The FreeBSD Foundation
6*2e5a3b0dSAlvin Chang  */
7*2e5a3b0dSAlvin Chang 
8*2e5a3b0dSAlvin Chang #include <kernel/linker.h>
9*2e5a3b0dSAlvin Chang #include <kernel/thread.h>
10*2e5a3b0dSAlvin Chang #include <kernel/unwind.h>
11*2e5a3b0dSAlvin Chang #include <riscv.h>
12*2e5a3b0dSAlvin Chang #include <unw/unwind.h>
13*2e5a3b0dSAlvin Chang 
14*2e5a3b0dSAlvin Chang #if defined(CFG_UNWIND) && (TRACE_LEVEL > 0)
print_kernel_stack(void)15*2e5a3b0dSAlvin Chang void print_kernel_stack(void)
16*2e5a3b0dSAlvin Chang {
17*2e5a3b0dSAlvin Chang 	struct unwind_state_riscv state = { };
18*2e5a3b0dSAlvin Chang 	vaddr_t stack_start = 0;
19*2e5a3b0dSAlvin Chang 	vaddr_t stack_end = 0;
20*2e5a3b0dSAlvin Chang 
21*2e5a3b0dSAlvin Chang 	state.pc = read_pc();
22*2e5a3b0dSAlvin Chang 	state.fp = read_fp();
23*2e5a3b0dSAlvin Chang 
24*2e5a3b0dSAlvin Chang 	trace_printf_helper_raw(TRACE_ERROR, true,
25*2e5a3b0dSAlvin Chang 				"TEE load address @ %#"PRIxVA, VCORE_START_VA);
26*2e5a3b0dSAlvin Chang 	get_stack_hard_limits(&stack_start, &stack_end);
27*2e5a3b0dSAlvin Chang 	print_stack_riscv(&state, stack_start, stack_end - stack_start);
28*2e5a3b0dSAlvin Chang }
29*2e5a3b0dSAlvin Chang #endif
30