#include "unwind_i.h"
static inline void
establish_machine_state (struct cursor *c)
{
unw_addr_space_t as = c->dwarf.as;
void *arg = c->dwarf.as_arg;
unw_fpreg_t fpval;
unw_word_t val;
int reg;
Debug (8, "copying out cursor state\n");
for (reg = 0; reg <= UNW_AARCH64_RA_SIGN_STATE; ++reg)
{
Debug (16, "copying %s %d\n", unw_regname (reg), reg);
if (tdep_access_reg (c, reg, &val, 0) >= 0)
as->acc.access_reg (as, reg, &val, 1, arg);
}
for (reg = UNW_AARCH64_V0; reg <= UNW_AARCH64_V31; ++reg)
{
Debug (16, "copying %s %d\n", unw_regname (reg), reg);
if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0)
as->acc.access_fpreg (as, reg, &fpval, 1, arg);
}
}
int
unw_resume (unw_cursor_t *cursor)
{
struct cursor *c = (struct cursor *) cursor;
Debug (1, "(cursor=%p)\n", c);
if (!c->dwarf.ip)
{
Debug (1, "refusing to resume execution at address 0\n");
return -UNW_EINVAL;
}
Debug(1, "==smw> before establish_machine_state\n");
establish_machine_state (c);
Debug(1, "==smw> before acc.resume\n");
return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
c->dwarf.as_arg);
}