PERFORCE change 152379 for review
Peter Wemm
peter at FreeBSD.org
Sun Nov 2 13:33:55 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=152379
Change 152379 by peter at peter_overcee on 2008/11/02 21:33:04
Initial pass at getting signals delivered to userland and back again.
Affected files ...
.. //depot/projects/valgrind/coregrind/m_sigframe/sigframe-amd64-freebsd.c#4 edit
Differences ...
==== //depot/projects/valgrind/coregrind/m_sigframe/sigframe-amd64-freebsd.c#4 (text+ko) ====
@@ -114,10 +114,10 @@
/* Sig handler's return address */
Addr retaddr;
- Int sigNo;
+ Int sigNo;
Addr psigInfo; /* code or pointer to sigContext */
Addr puContext; /* points to uContext */
- Addr addr; /* secret 4th argument */
+ Addr addr; /* "secret" 4th argument */
Addr phandler; /* "action" or "handler" */
/* pointed to by puContext */
@@ -126,8 +126,6 @@
/* pointed to by psiginfo */
vki_siginfo_t sigInfo;
- /* AAA:QQQ: struct _vki_fpstate fpstate; */
-
struct vg_sigframe vg;
};
@@ -347,33 +345,35 @@
// FIXME: save_i387(&tst->arch, fpstate);
# define SC2(reg,REG) sc->reg = tst->arch.vex.guest_##REG
+ SC2(rdi,RDI);
+ SC2(rsi,RSI);
+ SC2(rdx,RDX);
+ SC2(rcx,RCX);
SC2(r8,R8);
SC2(r9,R9);
+ SC2(rax,RAX);
+ SC2(rbx,RBX);
+ SC2(rbp,RBP);
SC2(r10,R10);
SC2(r11,R11);
SC2(r12,R12);
SC2(r13,R13);
SC2(r14,R14);
SC2(r15,R15);
- SC2(rdi,RDI);
- SC2(rsi,RSI);
- SC2(rbp,RBP);
- SC2(rbx,RBX);
- SC2(rdx,RDX);
- SC2(rax,RAX);
- SC2(rcx,RCX);
- SC2(rsp,RSP);
-
+ /* XXX trapno */
+ sc->addr = (UWord)si->si_addr;
+ /* XXX flags */
+ /* XXX err */
SC2(rip,RIP);
+ // FIXME: SC2(cs,CS);
sc->rflags = LibVEX_GuestAMD64_get_rflags(&tst->arch.vex);
- // FIXME: SC2(cs,CS);
- // FIXME: SC2(gs,GS);
- // FIXME: SC2(fs,FS);
- /* XXX err */
- /* XXX trapno */
+ SC2(rsp,RSP);
+ /* XXX ss */
+ sc->len = sizeof(*sc);
+ sc->fpformat = VKI_FPFMT_NODEV;
+ sc->ownedfp = VKI_FPOWNED_NONE;
# undef SC2
- /* sc->cr2 = (UWord)si->_sifields._sigfault._addr; */
}
@@ -461,9 +461,10 @@
return rsp_top_of_frame;
/* retaddr, siginfo, uContext fields are to be written */
- VG_TRACK( pre_mem_write, Vg_CoreSignal, tst->tid, "rt signal handler frame",
+ VG_TRACK( pre_mem_write, Vg_CoreSignal, tst->tid, "signal handler frame",
rsp, offsetof(struct sigframe, vg) );
+ frame->sigNo = sigNo;
frame->retaddr = (Addr)&VG_(amd64_freebsd_SUBST_FOR_sigreturn);
if ((flags & VKI_SA_SIGINFO) == 0)
frame->psigInfo = (Addr)siginfo->si_code;
@@ -472,13 +473,15 @@
frame->puContext = (Addr)&frame->uContext;
VG_(memcpy)(&frame->sigInfo, siginfo, sizeof(vki_siginfo_t));
+#if 0 /* QQQ */
/* SIGILL defines addr to be the faulting address */
if (sigNo == VKI_SIGILL && siginfo->si_code > 0)
frame->sigInfo.si_addr = (void*)tst->arch.vex.guest_RIP;
+#endif
synth_ucontext(tst->tid, siginfo, mask, &frame->uContext /*, &frame->fpstate*/);
- frame->uContext.__spare__[0] = ((unsigned long)&frame->vg) >> 32;
+ frame->uContext.__spare__[0] = ((unsigned long)&frame->vg) >> 32ul;
frame->uContext.__spare__[1] = 0x31415926;
frame->uContext.__spare__[2] = (unsigned long)&frame->vg;
frame->uContext.__spare__[3] = 0x53589793;
@@ -611,7 +614,7 @@
return 0;
}
- addr = uc->__spare__[2] | (((unsigned long)uc->__spare__[0]) << 32);
+ addr = (unsigned long)uc->__spare__[2] | (((unsigned long)uc->__spare__[0]) << 32ul);
if (restore_vg_sigframe(tst, (struct vg_sigframe *)addr, sigNo))
restore_sigcontext(tst, uc /*, &frame->fpstate*/ );
@@ -626,8 +629,6 @@
SizeT size;
Int sigNo;
- vg_assert(isRT);
-
tst = VG_(get_ThreadState)(tid);
/* Correctly reestablish the frame base address. */
More information about the p4-projects
mailing list