From: Nicholas N. <nj...@ca...> - 2003-06-27 07:12:51
|
On Thu, 26 Jun 2003, Dan Kegel wrote: > OK, this is kind of lame, since it marks the entire siginfo_t as valid, > but at least it gets my program to run. Um, sigtimedwait is already in coregrind/vg_syscalls.c, having been added on June 3, viz: # if defined(__NR_rt_sigtimedwait) case __NR_rt_sigtimedwait: /* syscall 177 */ /* int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec timeout); */ if (arg2 != (UInt)NULL) SYSCALL_TRACK( pre_mem_write, tst, "sigtimedwait(info)", arg2, sizeof(siginfo_t) ); KERNEL_DO_SYSCALL(tid,res); if (!VG_(is_kerror)(res) && arg2 != (UInt)NULL) VG_TRACK( post_mem_write, arg2, sizeof(siginfo_t) ); break; # endif This is less comprehensive than your version; it doesn't have the pre_mem_read hooks. It also does the easy-but-inaccurate post_mem_write. Maybe it should use the vki_* types like yours does, I'm not sure. Julian wasn't sure if this would work so simply: > Um, sigtimedwait can't possibly be correct like that can it? > Since simply handing the call off to the kernel bypasses V's > signal simulation. But it seemed to work for Sascha Schumann <sa...@sc...> who submitted the original patch. HTH N > --- valgrind-1.9.6/coregrind/vg_syscalls.c.old Thu Jun 26 14:16:23 2003 > +++ valgrind-1.9.6/coregrind/vg_syscalls.c Thu Jun 26 15:37:07 2003 > @@ -1195,6 +1195,26 @@ > KERNEL_DO_SYSCALL(tid,res); > break; > > +# if defined(__NR_rt_sigtimedwait) > + > + case __NR_rt_sigtimedwait: /* syscall 177 */ > + /* int sigtimedwait(const sigset_t * set, siginfo_t * info, const struct timespec * timeout); */ > + MAYBE_PRINTF("sigtimedwait ( %d, %p, %p )\n",arg1,arg2,arg3); > + SYSCALL_TRACK( pre_mem_read, tst, "sigtimedwait(set)", > + arg1, sizeof(vki_ksigset_t)); > + if (arg2 != (UInt)NULL) > + SYSCALL_TRACK( pre_mem_write, tst, "sigtimedwait(info)", > + arg2, sizeof(vki_ksiginfo_t)); > + if (arg3 != (UInt)NULL) > + SYSCALL_TRACK( pre_mem_read, tst, "sigtimedwait(timeout)", > + arg3, sizeof(struct vki_timespec)); > + KERNEL_DO_SYSCALL(tid,res); > + /* FIXME: it only writes to little bitty bits of *info, but let's say it's all defined. :-( */ > + if (!VG_(is_kerror)(res) && arg2 != (Addr)NULL) > + VG_TRACK( post_mem_write, arg2, sizeof( vki_ksiginfo_t) ); > + break; > +# endif > + > # if defined(__NR_rt_sigsuspend) > /* Viewed with great suspicion by me, but, hey, let's do it > anyway ... */ > --- valgrind-1.9.6/coregrind/vg_kerneliface.h.old Thu Jun 26 14:43:27 2003 > +++ valgrind-1.9.6/coregrind/vg_kerneliface.h Thu Jun 26 14:56:01 2003 > @@ -130,6 +130,70 @@ > #define VKI_SIGTERM 15 > #define VKI_SIGUSR1 10 > > +/* The following is copied from > + /usr/src/linux-2.4.18/include/asm-i386/siginfo.h */ > + > +typedef union vki_sigval { > + int sival_int; > + void *sival_ptr; > +} vki_ksigval_t; > + > +#define SI_MAX_SIZE 128 > +#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 3) > + > +typedef int vki_kpid_t; > +typedef unsigned short vki_kuid_t; > +typedef long vki_kclock_t; > + > +typedef struct vki_ksiginfo { > + int si_signo; > + int si_errno; > + int si_code; > + > + union { > + int _pad[SI_PAD_SIZE]; > + > + /* kill() */ > + struct { > + vki_kpid_t _pid; /* sender's pid */ > + vki_kuid_t _uid; /* sender's uid */ > + } _kill; > + > + /* POSIX.1b timers */ > + struct { > + unsigned int _timer1; > + unsigned int _timer2; > + } _timer; > + > + /* POSIX.1b signals */ > + struct { > + vki_kpid_t _pid; /* sender's pid */ > + vki_kuid_t _uid; /* sender's uid */ > + vki_ksigval_t _sigval; > + } _rt; > + > + /* SIGCHLD */ > + struct { > + vki_kpid_t _pid; /* which child */ > + vki_kuid_t _uid; /* sender's uid */ > + int _status; /* exit code */ > + vki_kclock_t _utime; > + vki_kclock_t _stime; > + } _sigchld; > + > + /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ > + struct { > + void *_addr; /* faulting insn/memory ref. */ > + } _sigfault; > + > + /* SIGPOLL */ > + struct { > + int _band; /* POLL_IN, POLL_OUT, POLL_MSG */ > + int _fd; > + } _sigpoll; > + } _sifields; > +} vki_ksiginfo_t; > + > /* The following are copied from include/asm-i386/mman.h .*/ > > #define VKI_PROT_READ 0x1 /* Page can be read. */ > > > -- > Dan Kegel > http://www.kegel.com > http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=78045 > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: INetU > Attention Web Developers & Consultants: Become An INetU Hosting Partner. > Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission! > INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php > _______________________________________________ > Valgrind-users mailing list > Val...@li... > https://lists.sourceforge.net/lists/listinfo/valgrind-users > |