00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <signal.h>
00033 #include <sys/ucontext.h>
00034
00035 #define MD_FALLBACK_FRAME_STATE_FOR alpha_fallback_frame_state
00036
00037 static _Unwind_Reason_Code
00038 alpha_fallback_frame_state (struct _Unwind_Context *context,
00039 _Unwind_FrameState *fs)
00040 {
00041 unsigned int *pc = context->ra;
00042 struct sigcontext *sc;
00043 long new_cfa, i;
00044
00045 if (pc[0] != 0x47fe0410
00046 || pc[2] != 0x00000083 )
00047 return _URC_END_OF_STACK;
00048 if (context->cfa == 0)
00049 return _URC_END_OF_STACK;
00050 if (pc[1] == 0x201f0067)
00051 sc = context->cfa;
00052 else if (pc[1] == 0x201f015f)
00053 {
00054 struct rt_sigframe {
00055 struct siginfo info;
00056 struct ucontext uc;
00057 } *rt_ = context->cfa;
00058 sc = &rt_->uc.uc_mcontext;
00059 }
00060 else
00061 return _URC_END_OF_STACK;
00062 new_cfa = sc->sc_regs[30];
00063 fs->cfa_how = CFA_REG_OFFSET;
00064 fs->cfa_reg = 30;
00065 fs->cfa_offset = new_cfa - (long) context->cfa;
00066 for (i = 0; i < 30; ++i)
00067 {
00068 fs->regs.reg[i].how = REG_SAVED_OFFSET;
00069 fs->regs.reg[i].loc.offset
00070 = (long)&sc->sc_regs[i] - new_cfa;
00071 }
00072 for (i = 0; i < 31; ++i)
00073 {
00074 fs->regs.reg[i+32].how = REG_SAVED_OFFSET;
00075 fs->regs.reg[i+32].loc.offset
00076 = (long)&sc->sc_fpregs[i] - new_cfa;
00077 }
00078 fs->regs.reg[64].how = REG_SAVED_OFFSET;
00079 fs->regs.reg[64].loc.offset = (long)&sc->sc_pc - new_cfa;
00080 fs->retaddr_column = 64;
00081 return _URC_NO_REASON;
00082 }