61 uintptr_t &next_fp, uintptr_t &next_pc)
noexcept {
70 const uint32_t fp_reg = resolve_fp_register<AbiTraits>(reg_ctx);
71 typename AbiTraits::register_type raw_fp = 0;
72 if (!reg_ctx.read_raw(fp_reg, &raw_fp, AbiTraits::pointer_size)) {
76 uintptr_t current_fp =
static_cast<uintptr_t
>(raw_fp);
80 constexpr size_t ptr_size = AbiTraits::pointer_size;
82 if ((current_fp % ptr_size) != 0)
91 ptrdiff_t fp_slot_offset = 0;
92 ptrdiff_t ra_slot_offset = 0;
93 if (!resolve_frame_slot_offsets<AbiTraits>(reg_ctx, fp_slot_offset, ra_slot_offset))
96 typename AbiTraits::register_type saved_fp = 0;
97 typename AbiTraits::register_type saved_ra = 0;
99 uintptr_t fp_addr =
static_cast<uintptr_t
>(
static_cast<ptrdiff_t
>(current_fp) + fp_slot_offset);
100 uintptr_t ra_addr =
static_cast<uintptr_t
>(
static_cast<ptrdiff_t
>(current_fp) + ra_slot_offset);
102 if (!context->space.read_bytes(fp_addr, &saved_fp, ptr_size))
104 if (!context->space.read_bytes(ra_addr, &saved_ra, ptr_size))
107 if (saved_fp <= current_fp || saved_ra == 0) {
122 std::ignore = reg_ctx.write_raw(fp_reg, &saved_fp, ptr_size);
123 std::ignore = reg_ctx.write_raw(AbiTraits::ra_reg, &saved_ra, ptr_size);
125 next_fp =
static_cast<uintptr_t
>(saved_fp);
126 next_pc = AbiTraits::normalize_pc(
static_cast<uintptr_t
>(saved_ra));