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 Changvoid 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