@@ -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 ();
@@ -41,23 +40,40 @@ struct CompartmentInfo {
4140 registers.setTrustedStack (tf);
4241 CHERI_DBG (" C18N: SET TRUSTED STACK %#p\n " , (void *)tf);
4342
43+ #ifdef _LIBUNWIND_TARGET_AARCH64
4444 registers.setFP ((pint_t )state.fp );
4545 CHERI_DBG (" C18N: SET FP %#p\n " , state.fp );
46+ #endif
4647
4748 registers.setSP ((pint_t )state.sp );
4849 CHERI_DBG (" C18N: SET SP: %#p\n " , state.sp );
4950
5051 registers.setIP ((pint_t )state.pc );
5152 CHERI_DBG (" C18N: SET IP: %#p\n " , state.pc );
5253
54+ #ifdef _LIBUNWIND_TARGET_AARCH64
55+ static constexpr int callee_saved[] = {
56+ UNW_ARM64_C19, UNW_ARM64_C20, UNW_ARM64_C21, UNW_ARM64_C22, UNW_ARM64_C23,
57+ UNW_ARM64_C24, UNW_ARM64_C26, UNW_ARM64_C27, UNW_ARM64_C28, UNW_ARM64_C29
58+ };
59+ #elif defined(_LIBUNWIND_TARGET_RISCV)
60+ static constexpr int callee_saved[] = {
61+ UNW_RISCV_X9, UNW_RISCV_X18, UNW_RISCV_X19, UNW_RISCV_X20, UNW_RISCV_X21,
62+ UNW_RISCV_X22, UNW_RISCV_X23, UNW_RISCV_X24, UNW_RISCV_X25, UNW_RISCV_X26,
63+ UNW_RISCV_X27, UNW_RISCV_X8
64+ };
65+ #endif
66+ static_assert (sizeof (callee_saved) / sizeof (*callee_saved) ==
67+ sizeof (state.regs ) / sizeof (*state.regs ),
68+ " unexpected number of saved registers" );
69+
5370 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 ),
71+ registers.setCapabilityRegister (callee_saved[i] , (pint_t )state.regs [i]);
72+ CHERI_DBG (" C18N: SET REGISTER: %d (%s): %#p\n " ,
73+ callee_saved[i] ,
74+ registers.getRegisterName (callee_saved[i] ),
5875 state.regs [i]);
5976 }
60- #endif
6177#endif // _LIBUNWIND_HAS_CHERI_LIB_C18N
6278 return UNW_STEP_SUCCESS;
6379 }
0 commit comments