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 #include "insn-constants.h"
00035
00036 # if defined (__SH5__)
00037 #define SH_DWARF_FRAME_GP0 0
00038 #define SH_DWARF_FRAME_FP0 (__SH5__ == 32 ? 245 : 77)
00039 #define SH_DWARF_FRAME_XD0 289
00040 #define SH_DWARF_FRAME_BT0 68
00041 #define SH_DWARF_FRAME_PR 241
00042 #define SH_DWARF_FRAME_PR_MEDIA 18
00043 #define SH_DWARF_FRAME_GBR 238
00044 #define SH_DWARF_FRAME_MACH 239
00045 #define SH_DWARF_FRAME_MACL 240
00046 #define SH_DWARF_FRAME_PC 64
00047 #define SH_DWARF_FRAME_SR 65
00048 #define SH_DWARF_FRAME_FPUL 244
00049 #define SH_DWARF_FRAME_FPSCR 243
00050 #else
00051 #define SH_DWARF_FRAME_GP0 0
00052 #define SH_DWARF_FRAME_FP0 25
00053 #define SH_DWARF_FRAME_XD0 87
00054 #define SH_DWARF_FRAME_PR 17
00055 #define SH_DWARF_FRAME_GBR 19
00056 #define SH_DWARF_FRAME_MACH 20
00057 #define SH_DWARF_FRAME_MACL 21
00058 #define SH_DWARF_FRAME_PC 16
00059 #define SH_DWARF_FRAME_SR 22
00060 #define SH_DWARF_FRAME_FPUL 23
00061 #define SH_DWARF_FRAME_FPSCR 24
00062 #endif
00063
00064 #if defined (__SH5__)
00065
00066 #else
00067
00068 #define MD_FALLBACK_FRAME_STATE_FOR sh_fallback_frame_state
00069
00070 static _Unwind_Reason_Code
00071 sh_fallback_frame_state (struct _Unwind_Context *context,
00072 _Unwind_FrameState *fs)
00073 {
00074 unsigned char *pc = context->ra;
00075 struct sigcontext *sc;
00076 long new_cfa;
00077 int i;
00078 #if defined (__SH3E__) || defined (__SH4__)
00079 int r;
00080 #endif
00081
00082
00083
00084
00085
00086
00087
00088
00089 if (((*(unsigned short *) (pc+0) == 0x9300)
00090 && (*(unsigned short *) (pc+2) == 0xc310)
00091 && (*(unsigned short *) (pc+4) == 0x0077))
00092 || (((*(unsigned short *) (pc+0) == 0x9305)
00093 && (*(unsigned short *) (pc+2) == 0xc310)
00094 && (*(unsigned short *) (pc+14) == 0x0077))))
00095 sc = context->cfa;
00096 else if (((*(unsigned short *) (pc+0) == 0x9300)
00097 && (*(unsigned short *) (pc+2) == 0xc310)
00098 && (*(unsigned short *) (pc+4) == 0x00ad))
00099 || (((*(unsigned short *) (pc+0) == 0x9305)
00100 && (*(unsigned short *) (pc+2) == 0xc310)
00101 && (*(unsigned short *) (pc+14) == 0x00ad))))
00102 {
00103 struct rt_sigframe {
00104 struct siginfo info;
00105 struct ucontext uc;
00106 } *rt_ = context->cfa;
00107 sc = (struct sigcontext *) &rt_->uc.uc_mcontext;
00108 }
00109 else
00110 return _URC_END_OF_STACK;
00111
00112 new_cfa = sc->sc_regs[15];
00113 fs->cfa_how = CFA_REG_OFFSET;
00114 fs->cfa_reg = 15;
00115 fs->cfa_offset = new_cfa - (long) context->cfa;
00116
00117 for (i = 0; i < 15; i++)
00118 {
00119 fs->regs.reg[i].how = REG_SAVED_OFFSET;
00120 fs->regs.reg[i].loc.offset
00121 = (long)&(sc->sc_regs[i]) - new_cfa;
00122 }
00123
00124 fs->regs.reg[SH_DWARF_FRAME_PR].how = REG_SAVED_OFFSET;
00125 fs->regs.reg[SH_DWARF_FRAME_PR].loc.offset
00126 = (long)&(sc->sc_pr) - new_cfa;
00127 fs->regs.reg[SH_DWARF_FRAME_SR].how = REG_SAVED_OFFSET;
00128 fs->regs.reg[SH_DWARF_FRAME_SR].loc.offset
00129 = (long)&(sc->sc_sr) - new_cfa;
00130 fs->regs.reg[SH_DWARF_FRAME_GBR].how = REG_SAVED_OFFSET;
00131 fs->regs.reg[SH_DWARF_FRAME_GBR].loc.offset
00132 = (long)&(sc->sc_gbr) - new_cfa;
00133 fs->regs.reg[SH_DWARF_FRAME_MACH].how = REG_SAVED_OFFSET;
00134 fs->regs.reg[SH_DWARF_FRAME_MACH].loc.offset
00135 = (long)&(sc->sc_mach) - new_cfa;
00136 fs->regs.reg[SH_DWARF_FRAME_MACL].how = REG_SAVED_OFFSET;
00137 fs->regs.reg[SH_DWARF_FRAME_MACL].loc.offset
00138 = (long)&(sc->sc_macl) - new_cfa;
00139
00140 #if defined (__SH3E__) || defined (__SH4__)
00141 r = SH_DWARF_FRAME_FP0;
00142 for (i = 0; i < 16; i++)
00143 {
00144 fs->regs.reg[r+i].how = REG_SAVED_OFFSET;
00145 fs->regs.reg[r+i].loc.offset
00146 = (long)&(sc->sc_fpregs[i]) - new_cfa;
00147 }
00148
00149 r = SH_DWARF_FRAME_XD0;
00150 for (i = 0; i < 8; i++)
00151 {
00152 fs->regs.reg[i].how = REG_SAVED_OFFSET;
00153 fs->regs.reg[i].loc.offset
00154 = (long)&(sc->sc_xfpregs[2*i]) - new_cfa;
00155 }
00156
00157 fs->regs.reg[SH_DWARF_FRAME_FPUL].how = REG_SAVED_OFFSET;
00158 fs->regs.reg[SH_DWARF_FRAME_FPUL].loc.offset
00159 = (long)&(sc->sc_fpul) - new_cfa;
00160 fs->regs.reg[SH_DWARF_FRAME_FPSCR].how = REG_SAVED_OFFSET;
00161 fs->regs.reg[SH_DWARF_FRAME_FPSCR].loc.offset
00162 = (long)&(sc->sc_fpscr) - new_cfa;
00163 #endif
00164
00165 fs->regs.reg[SH_DWARF_FRAME_PC].how = REG_SAVED_OFFSET;
00166 fs->regs.reg[SH_DWARF_FRAME_PC].loc.offset
00167 = (long)&(sc->sc_pc) - new_cfa;
00168 fs->retaddr_column = SH_DWARF_FRAME_PC;
00169 return _URC_NO_REASON;
00170 }
00171 #endif