|
From: Dan K. <da...@ke...> - 2003-06-26 23:31:49
|
OK, this is kind of lame, since it marks the entire siginfo_t as valid,
but at least it gets my program to run.
- Dan
--- 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
|
|
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
>
|
|
From: Dan K. <da...@ke...> - 2003-06-27 07:32:07
|
Nicholas Nethercote wrote: > Um, sigtimedwait is already in coregrind/vg_syscalls.c, having been > added on June 3 I probably would have noticed if cvs had been up :-) > 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. It didn't do the trick for me -- it got me past the immediate problem, but then signals didn't work :-( So I guess the thing to do is extend Vg's signal simulation. Or what I'll probably do instead is add support for sys_epoll in Valgrind. - Dan -- Dan Kegel http://www.kegel.com http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=78045 |