#include <signal.h>
#include <sys/ucontext.h>
#define MD_FALLBACK_FRAME_STATE_FOR alpha_fallback_frame_state
static _Unwind_Reason_Code
alpha_fallback_frame_state (struct _Unwind_Context *context,
_Unwind_FrameState *fs)
{
unsigned int *pc = context->ra;
struct sigcontext *sc;
long new_cfa, i;
if (pc[0] != 0x47fe0410
|| pc[2] != 0x00000083 )
return _URC_END_OF_STACK;
if (context->cfa == 0)
return _URC_END_OF_STACK;
if (pc[1] == 0x201f0067)
sc = context->cfa;
else if (pc[1] == 0x201f015f)
{
struct rt_sigframe {
struct siginfo info;
struct ucontext uc;
} *rt_ = context->cfa;
sc = &rt_->uc.uc_mcontext;
}
else
return _URC_END_OF_STACK;
new_cfa = sc->sc_regs[30];
fs->cfa_how = CFA_REG_OFFSET;
fs->cfa_reg = 30;
fs->cfa_offset = new_cfa - (long) context->cfa;
for (i = 0; i < 30; ++i)
{
fs->regs.reg[i].how = REG_SAVED_OFFSET;
fs->regs.reg[i].loc.offset
= (long)&sc->sc_regs[i] - new_cfa;
}
for (i = 0; i < 31; ++i)
{
fs->regs.reg[i+32].how = REG_SAVED_OFFSET;
fs->regs.reg[i+32].loc.offset
= (long)&sc->sc_fpregs[i] - new_cfa;
}
fs->regs.reg[64].how = REG_SAVED_OFFSET;
fs->regs.reg[64].loc.offset = (long)&sc->sc_pc - new_cfa;
fs->retaddr_column = 64;
return _URC_NO_REASON;
}