From owner-p4-projects@FreeBSD.ORG Sun Nov 2 21:33:54 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C055B106568F; Sun, 2 Nov 2008 21:33:54 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 84334106568C for ; Sun, 2 Nov 2008 21:33:54 +0000 (UTC) (envelope-from peter-gmail@wemm.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 727F88FC13 for ; Sun, 2 Nov 2008 21:33:54 +0000 (UTC) (envelope-from peter-gmail@wemm.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id mA2LXsnp039053 for ; Sun, 2 Nov 2008 21:33:54 GMT (envelope-from peter-gmail@wemm.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id mA2LXsKF039051 for perforce@freebsd.org; Sun, 2 Nov 2008 21:33:54 GMT (envelope-from peter-gmail@wemm.org) Date: Sun, 2 Nov 2008 21:33:54 GMT Message-Id: <200811022133.mA2LXsKF039051@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter-gmail@wemm.org using -f From: Peter Wemm To: Perforce Change Reviews Cc: Subject: PERFORCE change 152379 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 02 Nov 2008 21:33:55 -0000 http://perforce.freebsd.org/chv.cgi?CH=152379 Change 152379 by peter@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. */