|
From: <sv...@va...> - 2005-11-07 15:48:34
|
Author: sewardj
Date: 2005-11-07 15:48:31 +0000 (Mon, 07 Nov 2005)
New Revision: 5028
Log:
Handle sys_sigaction on ppc32-linux.
Modified:
trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c
trunk/coregrind/vki_unistd-ppc32-linux.h
trunk/include/vki-ppc32-linux.h
Modified: trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c 2005-11-07 15:24:38 U=
TC (rev 5027)
+++ trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c 2005-11-07 15:48:31 U=
TC (rev 5028)
@@ -604,6 +604,7 @@
DECL_TEMPLATE(ppc32_linux, sys_ipc);
DECL_TEMPLATE(ppc32_linux, sys_clone);
DECL_TEMPLATE(ppc32_linux, sys_sigreturn);
+DECL_TEMPLATE(ppc32_linux, sys_sigaction);
=20
PRE(sys_socketcall)
{
@@ -1564,83 +1565,77 @@
//.. }
=20
=20
-//.. // jrs 20050207: this is from the svn branch
-//.. //PRE(sys_sigaction, Special)
-//.. //{
-//.. // PRINT("sys_sigaction ( %d, %p, %p )", ARG1,ARG2,ARG3);
-//.. // PRE_REG_READ3(int, "sigaction",
-//.. // int, signum, const struct old_sigaction *, act,
-//.. // struct old_sigaction *, oldact)
-//.. // if (ARG2 !=3D 0)
-//.. // PRE_MEM_READ( "sigaction(act)", ARG2, sizeof(struct vki_old=
_sigaction));
-//.. // if (ARG3 !=3D 0)
-//.. // PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki=
_old_sigaction));
-//.. //
-//.. // VG_(do_sys_sigaction)(tid);
-//.. //}
+/* Convert from non-RT to RT sigset_t's */
+static=20
+void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *=
set)
+{
+ VG_(sigemptyset)(set);
+ set->sig[0] =3D *oldset;
+}
+PRE(sys_sigaction)
+{
+ struct vki_sigaction new, old;
+ struct vki_sigaction *newp, *oldp;
=20
-//.. /* Convert from non-RT to RT sigset_t's */
-//.. static void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vk=
i_sigset_t *set)
-//.. {
-//.. VG_(sigemptyset)(set);
-//.. set->sig[0] =3D *oldset;
-//.. }
-//.. PRE(sys_sigaction, Special)
-//.. {
-//.. struct vki_sigaction new, old;
-//.. struct vki_sigaction *newp, *oldp;
-//..=20
-//.. PRINT("sys_sigaction ( %d, %p, %p )", ARG1,ARG2,ARG3);
-//.. PRE_REG_READ3(int, "sigaction",
-//.. int, signum, const struct old_sigaction *, act,
-//.. struct old_sigaction *, oldact);
-//..=20
-//.. newp =3D oldp =3D NULL;
-//..=20
-//.. if (ARG2 !=3D 0)
-//.. PRE_MEM_READ( "sigaction(act)", ARG2, sizeof(struct vki_old_s=
igaction));
-//..=20
-//.. if (ARG3 !=3D 0) {
-//.. PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_o=
ld_sigaction));
-//.. oldp =3D &old;
-//.. }
-//..=20
-//.. //jrs 20050207: what?! how can this make any sense?
-//.. //if (VG_(is_kerror)(SYSRES))
-//.. // return;
-//..=20
-//.. if (ARG2 !=3D 0) {
-//.. struct vki_old_sigaction *oldnew =3D (struct vki_old_sigactio=
n *)ARG2;
-//..=20
-//.. new.ksa_handler =3D oldnew->ksa_handler;
-//.. new.sa_flags =3D oldnew->sa_flags;
-//.. new.sa_restorer =3D oldnew->sa_restorer;
-//.. convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask);
-//.. newp =3D &new;
-//.. }
-//..=20
-//.. SET_RESULT( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
-//..=20
-//.. if (ARG3 !=3D 0 && RES =3D=3D 0) {
-//.. struct vki_old_sigaction *oldold =3D (struct vki_old_sigactio=
n *)ARG3;
-//..=20
-//.. oldold->ksa_handler =3D oldp->ksa_handler;
-//.. oldold->sa_flags =3D oldp->sa_flags;
-//.. oldold->sa_restorer =3D oldp->sa_restorer;
-//.. oldold->sa_mask =3D oldp->sa_mask.sig[0];
-//.. }
-//.. }
+ PRINT("sys_sigaction ( %d, %p, %p )", ARG1,ARG2,ARG3);
+ PRE_REG_READ3(int, "sigaction",
+ int, signum, const struct old_sigaction *, act,
+ struct old_sigaction *, oldact);
=20
-//.. POST(sys_sigaction)
-//.. {
-//.. if (RES =3D=3D 0 && ARG3 !=3D 0)
-//.. POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
-//.. }
+ newp =3D oldp =3D NULL;
=20
+ if (ARG2 !=3D 0) {
+ struct vki_old_sigaction *sa =3D (struct vki_old_sigaction *)ARG2;
+ PRE_MEM_READ( "sigaction(act->sa_handler)", (Addr)&sa->ksa_handler=
, sizeof(sa->ksa_handler));
+ PRE_MEM_READ( "sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeo=
f(sa->sa_mask));
+ PRE_MEM_READ( "sigaction(act->sa_flags)", (Addr)&sa->sa_flags, siz=
eof(sa->sa_flags));
+ if (ML_(safe_to_deref)(sa,sizeof(sa))=20
+ && (sa->sa_flags & VKI_SA_RESTORER))
+ PRE_MEM_READ( "sigaction(act->sa_restorer)", (Addr)&sa->sa_rest=
orer, sizeof(sa->sa_restorer));
+ }
+
+ if (ARG3 !=3D 0) {
+ PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_si=
gaction));
+ oldp =3D &old;
+ }
+
+ //jrs 20050207: what?! how can this make any sense?
+ //if (VG_(is_kerror)(SYSRES))
+ // return;
+
+ if (ARG2 !=3D 0) {
+ struct vki_old_sigaction *oldnew =3D (struct vki_old_sigaction *)A=
RG2;
+
+ new.ksa_handler =3D oldnew->ksa_handler;
+ new.sa_flags =3D oldnew->sa_flags;
+ new.sa_restorer =3D oldnew->sa_restorer;
+ convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask);
+ newp =3D &new;
+ }
+
+ SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
+
+ if (ARG3 !=3D 0 && SUCCESS && RES =3D=3D 0) {
+ struct vki_old_sigaction *oldold =3D (struct vki_old_sigaction *)A=
RG3;
+
+ oldold->ksa_handler =3D oldp->ksa_handler;
+ oldold->sa_flags =3D oldp->sa_flags;
+ oldold->sa_restorer =3D oldp->sa_restorer;
+ oldold->sa_mask =3D oldp->sa_mask.sig[0];
+ }
+}
+
+POST(sys_sigaction)
+{
+ vg_assert(SUCCESS);
+ if (RES =3D=3D 0 && ARG3 !=3D 0)
+ POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
+}
+
+
#undef PRE
#undef POST
=20
-
/* ---------------------------------------------------------------------
The ppc32/Linux syscall table
------------------------------------------------------------------ */
@@ -1738,7 +1733,7 @@
=20
GENX_(__NR_getpgrp, sys_getpgrp), // 65
GENX_(__NR_setsid, sys_setsid), // 66
-//.. PLAXY(__NR_sigaction, sys_sigaction), // 67
+ PLAXY(__NR_sigaction, sys_sigaction), // 67
//.. // (__NR_sgetmask, sys_sgetmask), // 68 */* =
(ANSI C)
//.. // (__NR_ssetmask, sys_ssetmask), // 69 */* =
(ANSI C)
//..=20
Modified: trunk/coregrind/vki_unistd-ppc32-linux.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/vki_unistd-ppc32-linux.h 2005-11-07 15:24:38 UTC (rev=
5027)
+++ trunk/coregrind/vki_unistd-ppc32-linux.h 2005-11-07 15:48:31 UTC (rev=
5028)
@@ -96,7 +96,7 @@
#define __NR_getppid 64
#define __NR_getpgrp 65
#define __NR_setsid 66
-//#define __NR_sigaction 67
+#define __NR_sigaction 67
//#define __NR_sgetmask 68
//#define __NR_ssetmask 69
//#define __NR_setreuid 70
Modified: trunk/include/vki-ppc32-linux.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/include/vki-ppc32-linux.h 2005-11-07 15:24:38 UTC (rev 5027)
+++ trunk/include/vki-ppc32-linux.h 2005-11-07 15:48:31 UTC (rev 5028)
@@ -152,16 +152,16 @@
#define VKI_SS_ONSTACK 1
#define VKI_SS_DISABLE 2
=20
-//.. struct vki_old_sigaction {
-//.. // [[Nb: a 'k' prefix is added to "sa_handler" because
-//.. // bits/sigaction.h (which gets dragged in somehow via sign=
al.h)
-//.. // #defines it as something else. Since that is done for g=
libc's
-//.. // purposes, which we don't care about here, we use our own=
name.]]
-//.. __vki_sighandler_t ksa_handler;
-//.. vki_old_sigset_t sa_mask;
-//.. unsigned long sa_flags;
-//.. __vki_sigrestore_t sa_restorer;
-//.. };
+struct vki_old_sigaction {
+ // [[Nb: a 'k' prefix is added to "sa_handler" because
+ // bits/sigaction.h (which gets dragged in somehow via signal.h)
+ // #defines it as something else. Since that is done for glibc'=
s
+ // purposes, which we don't care about here, we use our own name=
.]]
+ __vki_sighandler_t ksa_handler;
+ vki_old_sigset_t sa_mask;
+ unsigned long sa_flags;
+ __vki_sigrestore_t sa_restorer;
+};
=20
struct vki_sigaction {
// [[See comment about extra 'k' above]]
|