@@ -26,7 +26,6 @@ struct CompartmentInfo {
2626
2727 static int unwindIfAtBoundary (R ®isters) {
2828#ifdef _LIBUNWIND_HAS_CHERI_LIB_C18N
29- #ifdef _LIBUNWIND_TARGET_AARCH64
3029 struct dl_c18n_compart_state state;
3130 pint_t pc = registers.getIP ();
3231 pint_t tf = registers.getTrustedStack ();
@@ -51,13 +50,23 @@ struct CompartmentInfo {
5150 CHERI_DBG (" C18N: SET IP: %#p\n " , state.pc );
5251
5352 for (size_t i = 0 ; i < sizeof (state.regs ) / sizeof (*state.regs ); ++i) {
54- registers.setCapabilityRegister (UNW_ARM64_C19 + i, (pint_t )state.regs [i]);
55- CHERI_DBG (" C18N: SET REGISTER: %lu (%s): %#p\n " ,
56- UNW_ARM64_C19 + i,
57- registers.getRegisterName (UNW_ARM64_C19 + i),
53+ int reg_num;
54+ #ifdef _LIBUNWIND_TARGET_AARCH64
55+ reg_num = UNW_ARM64_C19 + i;
56+ #elif defined(_LIBUNWIND_TARGET_RISCV)
57+ static constexpr int callee_saved[] = {
58+ UNW_RISCV_X9, UNW_RISCV_X18, UNW_RISCV_X19, UNW_RISCV_X20, UNW_RISCV_X21,
59+ UNW_RISCV_X22, UNW_RISCV_X23, UNW_RISCV_X24, UNW_RISCV_X25, UNW_RISCV_X26,
60+ UNW_RISCV_X27
61+ };
62+ reg_num = callee_saved[i];
63+ #endif
64+ registers.setCapabilityRegister (reg_num, (pint_t )state.regs [i]);
65+ CHERI_DBG (" C18N: SET REGISTER: %d (%s): %#p\n " ,
66+ reg_num,
67+ registers.getRegisterName (reg_num),
5868 state.regs [i]);
5969 }
60- #endif
6170#endif // _LIBUNWIND_HAS_CHERI_LIB_C18N
6271 return UNW_STEP_SUCCESS;
6372 }
0 commit comments