Lines 59-108
Link Here
|
59 |
/* Do code reading to identify a signal frame, and set the frame |
59 |
/* Do code reading to identify a signal frame, and set the frame |
60 |
state data appropriately. See unwind-dw2.c for the structs. */ |
60 |
state data appropriately. See unwind-dw2.c for the structs. */ |
61 |
|
61 |
|
62 |
#ifdef IN_LIBGCC2 |
|
|
63 |
#include <signal.h> |
64 |
#include <sys/ucontext.h> |
65 |
#endif |
66 |
|
67 |
#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \ |
68 |
do { \ |
69 |
unsigned int *pc_ = (CONTEXT)->ra; \ |
70 |
struct sigcontext *sc_; \ |
71 |
long new_cfa_, i_; \ |
72 |
\ |
73 |
if (pc_[0] != 0x47fe0410 /* mov $30,$16 */ \ |
74 |
|| pc_[2] != 0x00000083 /* callsys */) \ |
75 |
break; \ |
76 |
if (pc_[1] == 0x201f0067) /* lda $0,NR_sigreturn */ \ |
77 |
sc_ = (CONTEXT)->cfa; \ |
78 |
else if (pc_[1] == 0x201f015f) /* lda $0,NR_rt_sigreturn */ \ |
79 |
{ \ |
80 |
struct rt_sigframe { \ |
81 |
struct siginfo info; \ |
82 |
struct ucontext uc; \ |
83 |
} *rt_ = (CONTEXT)->cfa; \ |
84 |
sc_ = &rt_->uc.uc_mcontext; \ |
85 |
} \ |
86 |
else \ |
87 |
break; \ |
88 |
new_cfa_ = sc_->sc_regs[30]; \ |
89 |
(FS)->cfa_how = CFA_REG_OFFSET; \ |
90 |
(FS)->cfa_reg = 30; \ |
91 |
(FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa; \ |
92 |
for (i_ = 0; i_ < 30; ++i_) \ |
93 |
{ \ |
94 |
(FS)->regs.reg[i_].how = REG_SAVED_OFFSET; \ |
95 |
(FS)->regs.reg[i_].loc.offset \ |
96 |
= (long)&sc_->sc_regs[i_] - new_cfa_; \ |
97 |
} \ |
98 |
for (i_ = 0; i_ < 31; ++i_) \ |
99 |
{ \ |
100 |
(FS)->regs.reg[i_+32].how = REG_SAVED_OFFSET; \ |
101 |
(FS)->regs.reg[i_+32].loc.offset \ |
102 |
= (long)&sc_->sc_fpregs[i_] - new_cfa_; \ |
103 |
} \ |
104 |
(FS)->regs.reg[31].how = REG_SAVED_OFFSET; \ |
105 |
(FS)->regs.reg[31].loc.offset = (long)&sc_->sc_pc - new_cfa_; \ |
106 |
(FS)->retaddr_column = 31; \ |
107 |
goto SUCCESS; \ |
108 |
} while (0) |