|
56 | 56 | be important for Darwin. (be conservative) |
57 | 57 | */ |
58 | 58 |
|
| 59 | +const UInt MAGIC_PI = 0x31415927U; |
| 60 | + |
| 61 | +struct vg_sigframe { |
| 62 | + UInt magicPI; |
| 63 | + UInt sigNo_private; |
| 64 | + vki_sigset_t mask; |
| 65 | + VexGuestARM64State vex; |
| 66 | + VexGuestARM64State vex_shadow1; |
| 67 | + VexGuestARM64State vex_shadow2; |
| 68 | +}; |
| 69 | + |
59 | 70 | struct hacky_sigframe { |
60 | 71 | vki_siginfo_t info; |
61 | 72 | struct vki_ucontext uc; |
62 | | - |
63 | | - unsigned long retcode[2]; |
64 | | - |
65 | | - UInt magicPI; |
66 | | - UInt sigNo_private; |
67 | | - vki_sigset_t mask; |
68 | | - VexGuestARM64State vex; |
69 | | - VexGuestARM64State vex_shadow1; |
70 | | - VexGuestARM64State vex_shadow2; |
| 73 | + struct vg_sigframe vg; |
71 | 74 | }; |
72 | 75 |
|
73 | 76 |
|
@@ -150,16 +153,21 @@ void VG_(sigframe_create)( ThreadId tid, |
150 | 153 | if (! ML_(sf_maybe_extend_stack)(tst, sp, size, flags)) |
151 | 154 | return; // Give up. No idea if this is correct |
152 | 155 |
|
153 | | - frame = (struct hacky_sigframe *) sp; |
| 156 | + frame = (struct hacky_sigframe *) sp; |
| 157 | + |
| 158 | + VG_TRACK( pre_mem_write, Vg_CoreSignal, tst->tid, "signal handler internal frame", |
| 159 | + (Addr)frame, offsetof(struct hacky_sigframe, vg)); |
154 | 160 |
|
155 | 161 | /* save stuff in frame */ |
156 | | - // FIXME: track writes? |
157 | | - frame->magicPI = 0x31415927; |
158 | | - frame->sigNo_private = siginfo->si_signo; |
159 | | - frame->mask = tst->sig_mask; |
160 | | - frame->vex = tst->arch.vex; |
161 | | - frame->vex_shadow1 = tst->arch.vex_shadow1; |
162 | | - frame->vex_shadow2 = tst->arch.vex_shadow2; |
| 162 | + frame->vg.magicPI = MAGIC_PI; |
| 163 | + frame->vg.sigNo_private = siginfo->si_signo; |
| 164 | + frame->vg.mask = tst->sig_mask; |
| 165 | + frame->vg.vex = tst->arch.vex; |
| 166 | + frame->vg.vex_shadow1 = tst->arch.vex_shadow1; |
| 167 | + frame->vg.vex_shadow2 = tst->arch.vex_shadow2; |
| 168 | + |
| 169 | + VG_TRACK( post_mem_write, Vg_CoreSignal, tst->tid, |
| 170 | + (Addr)frame, offsetof(struct hacky_sigframe, vg)); |
163 | 171 |
|
164 | 172 | /* Fill in the siginfo and ucontext. */ |
165 | 173 | VG_TRACK( pre_mem_write, Vg_CoreSignal, tst->tid, "signal handler frame", |
@@ -237,19 +245,19 @@ void VG_(sigframe_destroy)( ThreadId tid, Bool isRT ) |
237 | 245 | sp = VG_(get_SP)(tid); |
238 | 246 |
|
239 | 247 | frame = (struct hacky_sigframe *)sp; |
240 | | - vg_assert(frame->magicPI == 0x31415927); |
| 248 | + vg_assert(frame->vg.magicPI == MAGIC_PI); |
241 | 249 |
|
242 | 250 | vg_assert(VG_IS_16_ALIGNED((Addr)frame)); |
243 | 251 |
|
244 | 252 | /* restore the entire guest state, and shadows, from the frame. */ |
245 | | - tst->arch.vex = frame->vex; |
246 | | - tst->arch.vex_shadow1 = frame->vex_shadow1; |
247 | | - tst->arch.vex_shadow2 = frame->vex_shadow2; |
| 253 | + tst->arch.vex = frame->vg.vex; |
| 254 | + tst->arch.vex_shadow1 = frame->vg.vex_shadow1; |
| 255 | + tst->arch.vex_shadow2 = frame->vg.vex_shadow2; |
248 | 256 | restore_from_ucontext(tst, &frame->uc); |
249 | 257 |
|
250 | | - tst->sig_mask = frame->mask; |
251 | | - tst->tmp_sig_mask = frame->mask; |
252 | | - sigNo = frame->sigNo_private; |
| 258 | + tst->sig_mask = frame->vg.mask; |
| 259 | + tst->tmp_sig_mask = frame->vg.mask; |
| 260 | + sigNo = frame->vg.sigNo_private; |
253 | 261 |
|
254 | 262 | if (VG_(clo_trace_signals)) |
255 | 263 | VG_(message)(Vg_DebugMsg, |
|
0 commit comments