Skip to content

Commit

Permalink
ldelf: Add TA stack trace for RISC-V architecture
Browse files Browse the repository at this point in the history
Implement ta_elf_stack_trace_riscv() to unwind the stack of TA. Also the
RISC-V architecture string of TA ELF is added into dump information.

Signed-off-by: Alvin Chang <[email protected]>
Acked-by: Jerome Forissier <[email protected]>
Tested-by: Marouene Boubakri <[email protected]>
Reviewed-by: Marouene Boubakri <[email protected]>
  • Loading branch information
gagachang authored and jforissier committed Jun 19, 2023
1 parent 9a54d48 commit ba2a6ad
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 1 deletion.
9 changes: 8 additions & 1 deletion ldelf/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,24 @@ static void __noreturn __maybe_unused dump_ta_state(struct dump_entry_arg *arg)

assert(elf && elf->is_main);
EMSG_RAW("Status of TA %pUl", (void *)&elf->uuid);
#if defined(ARM32) || defined(ARM64)
EMSG_RAW(" arch: %s", elf->is_32bit ? "arm" : "aarch64");

#elif defined(RV32) || defined(RV64)
EMSG_RAW(" arch: %s", elf->is_32bit ? "riscv32" : "riscv64");
#endif

ta_elf_print_mappings(NULL, print_to_console, &main_elf_queue,
arg->num_maps, arg->maps, mpool_base);

#if defined(ARM32) || defined(ARM64)
if (arg->is_32bit)
ta_elf_stack_trace_a32(arg->arm32.regs);
else
ta_elf_stack_trace_a64(arg->arm64.fp, arg->arm64.sp,
arg->arm64.pc);
#elif defined(RV32) || defined(RV64)
ta_elf_stack_trace_riscv(arg->rv.fp, arg->rv.pc);
#endif

sys_return_cleanup();
}
Expand Down
11 changes: 11 additions & 0 deletions ldelf/ta_elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -1538,6 +1538,8 @@ void ta_elf_print_mappings(void *pctx, print_func_t print_func,
}

#ifdef CFG_UNWIND

#if defined(ARM32) || defined(ARM64)
/* Called by libunw */
bool find_exidx(vaddr_t addr, vaddr_t *idx_start, vaddr_t *idx_end)
{
Expand Down Expand Up @@ -1578,8 +1580,17 @@ void ta_elf_stack_trace_a64(uint64_t fp, uint64_t sp, uint64_t pc)

print_stack_arm64(&state, ta_stack, ta_stack_size);
}
#elif defined(RV32) || defined(RV64)
void ta_elf_stack_trace_riscv(uint64_t fp, uint64_t pc)
{
struct unwind_state_riscv state = { .fp = fp, .pc = pc };

print_stack_riscv(&state, ta_stack, ta_stack_size);
}
#endif

#endif /* CFG_UNWIND */

TEE_Result ta_elf_add_library(const TEE_UUID *uuid)
{
TEE_Result res = TEE_ERROR_GENERIC;
Expand Down
3 changes: 3 additions & 0 deletions ldelf/ta_elf.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,14 @@ void ta_elf_print_mappings(void *pctx, print_func_t print_func,
#ifdef CFG_UNWIND
void ta_elf_stack_trace_a32(uint32_t regs[16]);
void ta_elf_stack_trace_a64(uint64_t fp, uint64_t sp, uint64_t pc);
void ta_elf_stack_trace_riscv(uint64_t fp, uint64_t pc);
#else
static inline void ta_elf_stack_trace_a32(uint32_t regs[16] __unused) { }
static inline void ta_elf_stack_trace_a64(uint64_t fp __unused,
uint64_t sp __unused,
uint64_t pc __unused) { }
static inline void ta_elf_stack_trace_riscv(uint64_t fp __unused,
uint64_t pc __unused) { }
#endif /*CFG_UNWIND*/

TEE_Result ta_elf_resolve_sym(const char *name, vaddr_t *val,
Expand Down

0 comments on commit ba2a6ad

Please sign in to comment.