From: Julian Seward Date: Wed, 8 Jun 2005 23:38:32 +0000 (+0000) Subject: Clean up after m_syscalls changes: reinstate about half the syscalls X-Git-Tag: svn/VALGRIND_3_0_0~464 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=75bd6cc9447baee2619a54aa65155d8971f79b94;p=thirdparty%2Fvalgrind.git Clean up after m_syscalls changes: reinstate about half the syscalls needed to make memcheck/tests/x86/scalar work again. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3854 --- diff --git a/coregrind/m_syscalls/syscalls-generic.c b/coregrind/m_syscalls/syscalls-generic.c index 2132a21d0f..25658d8bc7 100644 --- a/coregrind/m_syscalls/syscalls-generic.c +++ b/coregrind/m_syscalls/syscalls-generic.c @@ -1684,12 +1684,12 @@ PRE(sys_ni_syscall) SET_STATUS_Failure( VKI_ENOSYS ); } -//zz PRE(sys_iopl, 0) -//zz { -//zz PRINT("sys_iopl ( %d )", ARG1); -//zz PRE_REG_READ1(long, "iopl", unsigned long, level); -//zz } -//zz +PRE(sys_iopl) +{ + PRINT("sys_iopl ( %d )", ARG1); + PRE_REG_READ1(long, "iopl", unsigned long, level); +} + //zz PRE(sys_setxattr, SfMayBlock) //zz { //zz PRINT("sys_setxattr ( %p, %p, %p, %llu, %d )", @@ -1842,16 +1842,16 @@ POST(sys_getxattr) //zz PRE_REG_READ2(long, "fremovexattr", int, fd, char *, name); //zz PRE_MEM_RASCIIZ( "fremovexattr(name)", ARG2 ); //zz } -//zz -//zz PRE(sys_quotactl, 0) -//zz { -//zz PRINT("sys_quotactl (0x%x, %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3, ARG4); -//zz PRE_REG_READ4(long, "quotactl", -//zz unsigned int, cmd, const char *, special, vki_qid_t, id, -//zz void *, addr); -//zz PRE_MEM_RASCIIZ( "quotactl(special)", ARG2 ); -//zz } -//zz + +PRE(sys_quotactl) +{ + PRINT("sys_quotactl (0x%x, %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3, ARG4); + PRE_REG_READ4(long, "quotactl", + unsigned int, cmd, const char *, special, vki_qid_t, id, + void *, addr); + PRE_MEM_RASCIIZ( "quotactl(special)", ARG2 ); +} + //zz // XXX: this wrapper is only suitable for 32-bit platforms //zz PRE(sys_lookup_dcookie, 0) //zz { @@ -1875,20 +1875,22 @@ PRE(sys_fsync) PRE_REG_READ1(long, "fsync", unsigned int, fd); } -//zz PRE(sys_fdatasync, SfMayBlock) -//zz { -//zz PRINT("sys_fdatasync ( %d )", ARG1); -//zz PRE_REG_READ1(long, "fdatasync", unsigned int, fd); -//zz } -//zz -//zz PRE(sys_msync, SfMayBlock) -//zz { -//zz PRINT("sys_msync ( %p, %llu, %d )", ARG1,(ULong)ARG2,ARG3); -//zz PRE_REG_READ3(long, "msync", -//zz unsigned long, start, vki_size_t, length, int, flags); -//zz PRE_MEM_READ( "msync(start)", ARG1, ARG2 ); -//zz } -//zz +PRE(sys_fdatasync) +{ + *flags |= SfMayBlock; + PRINT("sys_fdatasync ( %d )", ARG1); + PRE_REG_READ1(long, "fdatasync", unsigned int, fd); +} + +PRE(sys_msync) +{ + *flags |= SfMayBlock; + PRINT("sys_msync ( %p, %llu, %d )", ARG1,(ULong)ARG2,ARG3); + PRE_REG_READ3(long, "msync", + unsigned long, start, vki_size_t, length, int, flags); + PRE_MEM_READ( "msync(start)", ARG1, ARG2 ); +} + //zz // Nb: getpmsg() and putpmsg() are special additional syscalls used in early //zz // versions of LiS (Linux Streams). They are not part of the kernel. //zz // Therefore, we have to provide this type ourself, rather than getting it @@ -1951,46 +1953,46 @@ PRE(sys_fsync) //zz if (data && data->len > 0) //zz PRE_MEM_READ( "putpmsg(data)", (Addr)data->buf, data->len); //zz } -//zz -//zz PRE(sys_getitimer, 0) -//zz { -//zz PRINT("sys_getitimer ( %d, %p )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "getitimer", int, which, struct itimerval *, value); -//zz PRE_MEM_WRITE( "getitimer(value)", ARG2, sizeof(struct vki_itimerval) ); -//zz } -//zz -//zz POST(sys_getitimer) -//zz { -//zz if (ARG2 != (Addr)NULL) { -//zz POST_MEM_WRITE(ARG2, sizeof(struct vki_itimerval)); -//zz } -//zz } -//zz -//zz PRE(sys_setitimer, 0) -//zz { -//zz PRINT("sys_setitimer ( %d, %p, %p )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "setitimer", -//zz int, which, -//zz struct itimerval *, value, struct itimerval *, ovalue); -//zz if (ARG2 != (Addr)NULL) -//zz PRE_MEM_READ( "setitimer(value)", ARG2, sizeof(struct vki_itimerval) ); -//zz if (ARG3 != (Addr)NULL) -//zz PRE_MEM_WRITE( "setitimer(ovalue)", ARG3, sizeof(struct vki_itimerval)); -//zz } -//zz -//zz POST(sys_setitimer) -//zz { -//zz if (ARG3 != (Addr)NULL) { -//zz POST_MEM_WRITE(ARG3, sizeof(struct vki_itimerval)); -//zz } -//zz } -//zz -//zz PRE(sys_chroot, 0) -//zz { -//zz PRINT("sys_chroot ( %p )", ARG1); -//zz PRE_REG_READ1(long, "chroot", const char *, path); -//zz PRE_MEM_RASCIIZ( "chroot(path)", ARG1 ); -//zz } + +PRE(sys_getitimer) +{ + PRINT("sys_getitimer ( %d, %p )", ARG1, ARG2); + PRE_REG_READ2(long, "getitimer", int, which, struct itimerval *, value); + PRE_MEM_WRITE( "getitimer(value)", ARG2, sizeof(struct vki_itimerval) ); +} + +POST(sys_getitimer) +{ + if (ARG2 != (Addr)NULL) { + POST_MEM_WRITE(ARG2, sizeof(struct vki_itimerval)); + } +} + +PRE(sys_setitimer) +{ + PRINT("sys_setitimer ( %d, %p, %p )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "setitimer", + int, which, + struct itimerval *, value, struct itimerval *, ovalue); + if (ARG2 != (Addr)NULL) + PRE_MEM_READ( "setitimer(value)", ARG2, sizeof(struct vki_itimerval) ); + if (ARG3 != (Addr)NULL) + PRE_MEM_WRITE( "setitimer(ovalue)", ARG3, sizeof(struct vki_itimerval)); +} + +POST(sys_setitimer) +{ + if (ARG3 != (Addr)NULL) { + POST_MEM_WRITE(ARG3, sizeof(struct vki_itimerval)); + } +} + +PRE(sys_chroot) +{ + PRINT("sys_chroot ( %p )", ARG1); + PRE_REG_READ1(long, "chroot", const char *, path); + PRE_MEM_RASCIIZ( "chroot(path)", ARG1 ); +} PRE(sys_madvise) { @@ -2037,29 +2039,33 @@ PRE(sys_sched_setscheduler) ARG3, sizeof(struct vki_sched_param)); } -//zz PRE(sys_mlock, SfMayBlock) -//zz { -//zz PRINT("sys_mlock ( %p, %llu )", ARG1, (ULong)ARG2); -//zz PRE_REG_READ2(long, "mlock", unsigned long, addr, vki_size_t, len); -//zz } -//zz -//zz PRE(sys_munlock, SfMayBlock) -//zz { -//zz PRINT("sys_munlock ( %p, %llu )", ARG1, (ULong)ARG2); -//zz PRE_REG_READ2(long, "munlock", unsigned long, addr, vki_size_t, len); -//zz } -//zz -//zz PRE(sys_mlockall, SfMayBlock) -//zz { -//zz PRINT("sys_mlockall ( %x )", ARG1); -//zz PRE_REG_READ1(long, "mlockall", int, flags); -//zz } -//zz -//zz PRE(sys_munlockall, SfMayBlock) -//zz { -//zz PRINT("sys_munlockall ( )"); -//zz PRE_REG_READ0(long, "munlockall"); -//zz } +PRE(sys_mlock) +{ + *flags |= SfMayBlock; + PRINT("sys_mlock ( %p, %llu )", ARG1, (ULong)ARG2); + PRE_REG_READ2(long, "mlock", unsigned long, addr, vki_size_t, len); +} + +PRE(sys_munlock) +{ + *flags |= SfMayBlock; + PRINT("sys_munlock ( %p, %llu )", ARG1, (ULong)ARG2); + PRE_REG_READ2(long, "munlock", unsigned long, addr, vki_size_t, len); +} + +PRE(sys_mlockall) +{ + *flags |= SfMayBlock; + PRINT("sys_mlockall ( %x )", ARG1); + PRE_REG_READ1(long, "mlockall", int, flags); +} + +PRE(sys_munlockall) +{ + *flags |= SfMayBlock; + PRINT("sys_munlockall ( )"); + PRE_REG_READ0(long, "munlockall"); +} PRE(sys_sched_get_priority_max) { @@ -2073,24 +2079,24 @@ PRE(sys_sched_get_priority_min) PRE_REG_READ1(long, "sched_get_priority_min", int, policy); } -//zz PRE(sys_setpriority, 0) -//zz { -//zz PRINT("sys_setpriority ( %d, %d, %d )", ARG1, ARG2, ARG3); -//zz PRE_REG_READ3(long, "setpriority", int, which, int, who, int, prio); -//zz } -//zz -//zz PRE(sys_getpriority, 0) -//zz { -//zz PRINT("sys_getpriority ( %d, %d )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "getpriority", int, which, int, who); -//zz } -//zz -//zz PRE(sys_setregid16, 0) -//zz { -//zz PRINT("sys_setregid16 ( %d, %d )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "setregid16", vki_old_gid_t, rgid, vki_old_gid_t, egid); -//zz } -//zz +PRE(sys_setpriority) +{ + PRINT("sys_setpriority ( %d, %d, %d )", ARG1, ARG2, ARG3); + PRE_REG_READ3(long, "setpriority", int, which, int, who, int, prio); +} + +PRE(sys_getpriority) +{ + PRINT("sys_getpriority ( %d, %d )", ARG1, ARG2); + PRE_REG_READ2(long, "getpriority", int, which, int, who); +} + +PRE(sys_setregid16) +{ + PRINT("sys_setregid16 ( %d, %d )", ARG1, ARG2); + PRE_REG_READ2(long, "setregid16", vki_old_gid_t, rgid, vki_old_gid_t, egid); +} + //zz // XXX: only for 32-bit archs //zz PRE(sys_pwrite64, SfMayBlock) //zz { @@ -2109,19 +2115,19 @@ PRE(sys_sync) PRE_REG_READ0(long, "sync"); } -//zz PRE(sys_fstatfs, 0) -//zz { -//zz PRINT("sys_fstatfs ( %d, %p )",ARG1,ARG2); -//zz PRE_REG_READ2(long, "fstatfs", -//zz unsigned int, fd, struct statfs *, buf); -//zz PRE_MEM_WRITE( "fstatfs(buf)", ARG2, sizeof(struct vki_statfs) ); -//zz } -//zz -//zz POST(sys_fstatfs) -//zz { -//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs) ); -//zz } -//zz +PRE(sys_fstatfs) +{ + PRINT("sys_fstatfs ( %d, %p )",ARG1,ARG2); + PRE_REG_READ2(long, "fstatfs", + unsigned int, fd, struct statfs *, buf); + PRE_MEM_WRITE( "fstatfs(buf)", ARG2, sizeof(struct vki_statfs) ); +} + +POST(sys_fstatfs) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs) ); +} + //zz PRE(sys_fstatfs64, 0) //zz { //zz PRINT("sys_fstatfs64 ( %d, %llu, %p )",ARG1,(ULong)ARG2,ARG3); @@ -2134,13 +2140,13 @@ PRE(sys_sync) //zz { //zz POST_MEM_WRITE( ARG3, ARG2 ); //zz } -//zz -//zz PRE(sys_getsid, 0) -//zz { -//zz PRINT("sys_getsid ( %d )", ARG1); -//zz PRE_REG_READ1(long, "getsid", vki_pid_t, pid); -//zz } -//zz + +PRE(sys_getsid) +{ + PRINT("sys_getsid ( %d )", ARG1); + PRE_REG_READ1(long, "getsid", vki_pid_t, pid); +} + //zz // XXX: only for 32-bit archs //zz PRE(sys_pread64, SfMayBlock) //zz { @@ -2167,21 +2173,24 @@ PRE(sys_mknod) PRE_MEM_RASCIIZ( "mknod(pathname)", ARG1 ); } -//zz PRE(sys_flock, SfMayBlock) -//zz { -//zz PRINT("sys_flock ( %d, %d )", ARG1, ARG2 ); -//zz PRE_REG_READ2(long, "flock", unsigned int, fd, unsigned int, operation); -//zz } -//zz -//zz PRE(sys_init_module, SfMayBlock) -//zz { -//zz PRINT("sys_init_module ( %p, %llu, %p )", ARG1, (ULong)ARG2, ARG3 ); -//zz PRE_REG_READ3(long, "init_module", -//zz void *, umod, unsigned long, len, const char *, uargs); -//zz PRE_MEM_READ( "init_module(umod)", ARG1, ARG2 ); -//zz PRE_MEM_RASCIIZ( "init_module(uargs)", ARG3 ); -//zz } -//zz +PRE(sys_flock) +{ + *flags |= SfMayBlock; + PRINT("sys_flock ( %d, %d )", ARG1, ARG2 ); + PRE_REG_READ2(long, "flock", unsigned int, fd, unsigned int, operation); +} + +/* This surely isn't remotely generic -- move to linux-specifics? */ +PRE(sys_init_module) +{ + *flags |= SfMayBlock; + PRINT("sys_init_module ( %p, %llu, %p )", ARG1, (ULong)ARG2, ARG3 ); + PRE_REG_READ3(long, "init_module", + void *, umod, unsigned long, len, const char *, uargs); + PRE_MEM_READ( "init_module(umod)", ARG1, ARG2 ); + PRE_MEM_RASCIIZ( "init_module(uargs)", ARG3 ); +} + //zz PRE(sys_capget, 0) //zz { //zz PRINT("sys_capget ( %p, %p )", ARG1, ARG2 ); @@ -2514,91 +2523,92 @@ POST(sys_dup2) VG_(record_fd_open)(tid, RES, VG_(resolve_filename)(RES)); } -//zz PRE(sys_fchdir, 0) -//zz { -//zz PRINT("sys_fchdir ( %d )", ARG1); -//zz PRE_REG_READ1(long, "fchdir", unsigned int, fd); -//zz } -//zz -//zz PRE(sys_fchown16, 0) -//zz { -//zz PRINT("sys_fchown16 ( %d, %d, %d )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "fchown16", -//zz unsigned int, fd, vki_old_uid_t, owner, vki_old_gid_t, group); -//zz } -//zz +PRE(sys_fchdir) +{ + PRINT("sys_fchdir ( %d )", ARG1); + PRE_REG_READ1(long, "fchdir", unsigned int, fd); +} + +PRE(sys_fchown16) +{ + PRINT("sys_fchown16 ( %d, %d, %d )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "fchown16", + unsigned int, fd, vki_old_uid_t, owner, vki_old_gid_t, group); +} + //zz PRE(sys_fchown, 0) //zz { //zz PRINT("sys_fchown ( %d, %d, %d )", ARG1,ARG2,ARG3); //zz PRE_REG_READ3(long, "fchown", //zz unsigned int, fd, vki_uid_t, owner, vki_gid_t, group); //zz } -//zz -//zz PRE(sys_fchmod, 0) -//zz { -//zz PRINT("sys_fchmod ( %d, %d )", ARG1,ARG2); -//zz PRE_REG_READ2(long, "fchmod", unsigned int, fildes, vki_mode_t, mode); -//zz } -//zz -//zz PRE(sys_fcntl, 0) -//zz { -//zz switch (ARG2) { -//zz // These ones ignore ARG3. -//zz case VKI_F_GETFD: -//zz case VKI_F_GETFL: -//zz case VKI_F_GETOWN: -//zz case VKI_F_SETOWN: -//zz case VKI_F_GETSIG: -//zz case VKI_F_SETSIG: -//zz case VKI_F_GETLEASE: -//zz PRINT("sys_fcntl ( %d, %d )", ARG1,ARG2); -//zz PRE_REG_READ2(long, "fcntl", unsigned int, fd, unsigned int, cmd); -//zz break; -//zz -//zz // These ones use ARG3 as "arg". -//zz case VKI_F_DUPFD: -//zz case VKI_F_SETFD: -//zz case VKI_F_SETFL: -//zz case VKI_F_SETLEASE: -//zz case VKI_F_NOTIFY: -//zz PRINT("sys_fcntl[ARG3=='arg'] ( %d, %d, %d )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "fcntl", -//zz unsigned int, fd, unsigned int, cmd, unsigned long, arg); -//zz break; -//zz -//zz // These ones use ARG3 as "lock". -//zz case VKI_F_GETLK: -//zz case VKI_F_SETLK: -//zz case VKI_F_SETLKW: -//zz #ifndef __amd64__ -//zz case VKI_F_GETLK64: -//zz case VKI_F_SETLK64: -//zz case VKI_F_SETLKW64: -//zz #else -//zz #endif -//zz PRINT("sys_fcntl[ARG3=='lock'] ( %d, %d, %p )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "fcntl", -//zz unsigned int, fd, unsigned int, cmd, -//zz struct flock64 *, lock); -//zz break; -//zz } -//zz -//zz //if (ARG2 == VKI_F_SETLKW) -//zz // tst->sys_flags |= SfMayBlock; -//zz } -//zz -//zz POST(sys_fcntl) -//zz { -//zz if (ARG2 == VKI_F_DUPFD) { -//zz if (!VG_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) { -//zz VG_(close)(RES); -//zz SET_STATUS_( -VKI_EMFILE ); -//zz } else { -//zz if (VG_(clo_track_fds)) -//zz VG_(record_fd_open)(tid, RES, VG_(resolve_filename)(RES)); -//zz } -//zz } -//zz } + +PRE(sys_fchmod) +{ + PRINT("sys_fchmod ( %d, %d )", ARG1,ARG2); + PRE_REG_READ2(long, "fchmod", unsigned int, fildes, vki_mode_t, mode); +} + +PRE(sys_fcntl) +{ + switch (ARG2) { + // These ones ignore ARG3. + case VKI_F_GETFD: + case VKI_F_GETFL: + case VKI_F_GETOWN: + case VKI_F_SETOWN: + case VKI_F_GETSIG: + case VKI_F_SETSIG: + case VKI_F_GETLEASE: + PRINT("sys_fcntl ( %d, %d )", ARG1,ARG2); + PRE_REG_READ2(long, "fcntl", unsigned int, fd, unsigned int, cmd); + break; + + // These ones use ARG3 as "arg". + case VKI_F_DUPFD: + case VKI_F_SETFD: + case VKI_F_SETFL: + case VKI_F_SETLEASE: + case VKI_F_NOTIFY: + PRINT("sys_fcntl[ARG3=='arg'] ( %d, %d, %d )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "fcntl", + unsigned int, fd, unsigned int, cmd, unsigned long, arg); + break; + + // These ones use ARG3 as "lock". + case VKI_F_GETLK: + case VKI_F_SETLK: + case VKI_F_SETLKW: +# if defined(VGP_amd64_linux) + case VKI_F_GETLK64: + case VKI_F_SETLK64: + case VKI_F_SETLKW64: +# else +# endif + PRINT("sys_fcntl[ARG3=='lock'] ( %d, %d, %p )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "fcntl", + unsigned int, fd, unsigned int, cmd, + struct flock64 *, lock); + break; + } + + if (ARG2 == VKI_F_SETLKW) + *flags |= SfMayBlock; +} + +POST(sys_fcntl) +{ + vg_assert(SUCCESS); + if (ARG2 == VKI_F_DUPFD) { + if (!VG_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) { + VG_(close)(RES); + SET_STATUS_Failure( VKI_EMFILE ); + } else { + if (VG_(clo_track_fds)) + VG_(record_fd_open)(tid, RES, VG_(resolve_filename)(RES)); + } + } +} // XXX: wrapper only suitable for 32-bit systems PRE(sys_fcntl64) @@ -2667,17 +2677,17 @@ POST(sys_fcntl64) } } -//zz PRE(sys_newfstat, 0) -//zz { -//zz PRINT("sys_newfstat ( %d, %p )", ARG1,ARG2); -//zz PRE_REG_READ2(long, "fstat", unsigned int, fd, struct stat *, buf); -//zz PRE_MEM_WRITE( "fstat(buf)", ARG2, sizeof(struct vki_stat) ); -//zz } -//zz -//zz POST(sys_newfstat) -//zz { -//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) ); -//zz } +PRE(sys_newfstat) +{ + PRINT("sys_newfstat ( %d, %p )", ARG1,ARG2); + PRE_REG_READ2(long, "fstat", unsigned int, fd, struct stat *, buf); + PRE_MEM_WRITE( "fstat(buf)", ARG2, sizeof(struct vki_stat) ); +} + +POST(sys_newfstat) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) ); +} static vki_sigset_t fork_saved_mask; @@ -2723,14 +2733,15 @@ PRE(sys_ftruncate) PRE_REG_READ2(long, "ftruncate", unsigned int, fd, unsigned long, length); } -//zz PRE(sys_truncate, SfMayBlock) -//zz { -//zz PRINT("sys_truncate ( %p(%s), %d )", ARG1,ARG1,ARG2); -//zz PRE_REG_READ2(long, "truncate", -//zz const char *, path, unsigned long, length); -//zz PRE_MEM_RASCIIZ( "truncate(path)", ARG1 ); -//zz } -//zz +PRE(sys_truncate) +{ + *flags |= SfMayBlock; + PRINT("sys_truncate ( %p(%s), %d )", ARG1,ARG1,ARG2); + PRE_REG_READ2(long, "truncate", + const char *, path, unsigned long, length); + PRE_MEM_RASCIIZ( "truncate(path)", ARG1 ); +} + //zz // XXX: this wrapper is only suitable for 32-bit platforms //zz PRE(sys_ftruncate64, SfMayBlock) //zz { @@ -2785,19 +2796,20 @@ POST(sys_getdents64) POST_MEM_WRITE( ARG2, RES ); } -//zz PRE(sys_getgroups16, 0) -//zz { -//zz PRINT("sys_getgroups16 ( %d, %p )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "getgroups16", int, size, vki_old_gid_t *, list); -//zz if (ARG1 > 0) -//zz PRE_MEM_WRITE( "getgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) ); -//zz } -//zz -//zz POST(sys_getgroups16) -//zz { -//zz if (ARG1 > 0 && RES > 0) -//zz POST_MEM_WRITE( ARG2, RES * sizeof(vki_old_gid_t) ); -//zz } +PRE(sys_getgroups16) +{ + PRINT("sys_getgroups16 ( %d, %p )", ARG1, ARG2); + PRE_REG_READ2(long, "getgroups16", int, size, vki_old_gid_t *, list); + if (ARG1 > 0) + PRE_MEM_WRITE( "getgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) ); +} + +POST(sys_getgroups16) +{ + vg_assert(SUCCESS); + if (ARG1 > 0 && RES > 0) + POST_MEM_WRITE( ARG2, RES * sizeof(vki_old_gid_t) ); +} PRE(sys_getgroups) { @@ -2842,11 +2854,11 @@ PRE(sys_geteuid) PRE_REG_READ0(long, "geteuid"); } -//zz PRE(sys_getegid16, 0) -//zz { -//zz PRINT("sys_getegid16 ( )"); -//zz PRE_REG_READ0(long, "getegid16"); -//zz } +PRE(sys_getegid16) +{ + PRINT("sys_getegid16 ( )"); + PRE_REG_READ0(long, "getegid16"); +} PRE(sys_getegid) { @@ -2872,11 +2884,11 @@ PRE(sys_getpid) PRE_REG_READ0(long, "getpid"); } -//zz PRE(sys_getpgid, 0) -//zz { -//zz PRINT("sys_getpgid ( %d )", ARG1); -//zz PRE_REG_READ1(long, "getpgid", vki_pid_t, pid); -//zz } +PRE(sys_getpgid) +{ + PRINT("sys_getpgid ( %d )", ARG1); + PRE_REG_READ1(long, "getpgid", vki_pid_t, pid); +} PRE(sys_getpgrp) { @@ -2910,18 +2922,18 @@ static void common_post_getrlimit(ThreadId tid, UWord a1, UWord a2) } } -//zz PRE(sys_old_getrlimit, 0) -//zz { -//zz PRINT("sys_old_getrlimit ( %d, %p )", ARG1,ARG2); -//zz PRE_REG_READ2(long, "old_getrlimit", -//zz unsigned int, resource, struct rlimit *, rlim); -//zz PRE_MEM_WRITE( "old_getrlimit(rlim)", ARG2, sizeof(struct vki_rlimit) ); -//zz } -//zz -//zz POST(sys_old_getrlimit) -//zz { -//zz common_post_getrlimit(tid, ARG1, ARG2); -//zz } +PRE(sys_old_getrlimit) +{ + PRINT("sys_old_getrlimit ( %d, %p )", ARG1,ARG2); + PRE_REG_READ2(long, "old_getrlimit", + unsigned int, resource, struct rlimit *, rlim); + PRE_MEM_WRITE( "old_getrlimit(rlim)", ARG2, sizeof(struct vki_rlimit) ); +} + +POST(sys_old_getrlimit) +{ + common_post_getrlimit(tid, ARG1, ARG2); +} PRE(sys_getrlimit) { @@ -2936,19 +2948,20 @@ POST(sys_getrlimit) common_post_getrlimit(tid, ARG1, ARG2); } -//zz PRE(sys_getrusage, 0) -//zz { -//zz /* int getrusage (int who, struct rusage *usage); */ -//zz PRINT("sys_getrusage ( %d, %p )", ARG1,ARG2); -//zz PRE_REG_READ2(long, "getrusage", int, who, struct rusage *, usage); -//zz PRE_MEM_WRITE( "getrusage(usage)", ARG2, sizeof(struct vki_rusage) ); -//zz } -//zz -//zz POST(sys_getrusage) -//zz { -//zz if (RES == 0) -//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_rusage) ); -//zz } +PRE(sys_getrusage) +{ + /* int getrusage (int who, struct rusage *usage); */ + PRINT("sys_getrusage ( %d, %p )", ARG1,ARG2); + PRE_REG_READ2(long, "getrusage", int, who, struct rusage *, usage); + PRE_MEM_WRITE( "getrusage(usage)", ARG2, sizeof(struct vki_rusage) ); +} + +POST(sys_getrusage) +{ + vg_assert(SUCCESS); + if (RES == 0) + POST_MEM_WRITE( ARG2, sizeof(struct vki_rusage) ); +} PRE(sys_gettimeofday) { @@ -2970,17 +2983,17 @@ POST(sys_gettimeofday) } } -//zz PRE(sys_settimeofday, 0) -//zz { -//zz PRINT("sys_settimeofday ( %p, %p )", ARG1,ARG2); -//zz PRE_REG_READ2(long, "settimeofday", -//zz struct timeval *, tv, struct timezone *, tz); -//zz PRE_MEM_READ( "settimeofday(tv)", ARG1, sizeof(struct vki_timeval) ); -//zz if (ARG2 != 0) { -//zz PRE_MEM_READ( "settimeofday(tz)", ARG2, sizeof(struct vki_timezone) ); -//zz /* maybe should warn if tz->tz_dsttime is non-zero? */ -//zz } -//zz } +PRE(sys_settimeofday) +{ + PRINT("sys_settimeofday ( %p, %p )", ARG1,ARG2); + PRE_REG_READ2(long, "settimeofday", + struct timeval *, tv, struct timezone *, tz); + PRE_MEM_READ( "settimeofday(tv)", ARG1, sizeof(struct vki_timeval) ); + if (ARG2 != 0) { + PRE_MEM_READ( "settimeofday(tz)", ARG2, sizeof(struct vki_timezone) ); + /* maybe should warn if tz->tz_dsttime is non-zero? */ + } +} PRE(sys_getuid16) { @@ -4359,20 +4372,21 @@ PRE(sys_lseek) unsigned int, fd, vki_off_t, offset, unsigned int, whence); } -//zz PRE(sys_newlstat, 0) -//zz { -//zz PRINT("sys_newlstat ( %p(%s), %p )", ARG1,ARG1,ARG2); -//zz PRE_REG_READ2(long, "lstat", char *, file_name, struct stat *, buf); -//zz PRE_MEM_RASCIIZ( "lstat(file_name)", ARG1 ); -//zz PRE_MEM_WRITE( "lstat(buf)", ARG2, sizeof(struct vki_stat) ); -//zz } -//zz -//zz POST(sys_newlstat) -//zz { -//zz if (RES == 0) { -//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) ); -//zz } -//zz } +PRE(sys_newlstat) +{ + PRINT("sys_newlstat ( %p(%s), %p )", ARG1,ARG1,ARG2); + PRE_REG_READ2(long, "lstat", char *, file_name, struct stat *, buf); + PRE_MEM_RASCIIZ( "lstat(file_name)", ARG1 ); + PRE_MEM_WRITE( "lstat(buf)", ARG2, sizeof(struct vki_stat) ); +} + +POST(sys_newlstat) +{ + vg_assert(SUCCESS); + if (RES == 0) { + POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) ); + } +} PRE(sys_mkdir) { @@ -4805,21 +4819,21 @@ PRE(sys_setgid16) //zz PRINT("sys_setgid ( %d )", ARG1); //zz PRE_REG_READ1(long, "setgid", vki_gid_t, gid); //zz } -//zz -//zz PRE(sys_setsid, 0) -//zz { -//zz PRINT("sys_setsid ( )"); -//zz PRE_REG_READ0(long, "setsid"); -//zz } -//zz -//zz PRE(sys_setgroups16, 0) -//zz { -//zz PRINT("sys_setgroups16 ( %llu, %p )", (ULong)ARG1, ARG2); -//zz PRE_REG_READ2(long, "setgroups16", int, size, vki_old_gid_t *, list); -//zz if (ARG1 > 0) -//zz PRE_MEM_READ( "setgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) ); -//zz } -//zz + +PRE(sys_setsid) +{ + PRINT("sys_setsid ( )"); + PRE_REG_READ0(long, "setsid"); +} + +PRE(sys_setgroups16) +{ + PRINT("sys_setgroups16 ( %llu, %p )", (ULong)ARG1, ARG2); + PRE_REG_READ2(long, "setgroups16", int, size, vki_old_gid_t *, list); + if (ARG1 > 0) + PRE_MEM_READ( "setgroups16(list)", ARG2, ARG1 * sizeof(vki_old_gid_t) ); +} + //zz PRE(sys_setgroups, 0) //zz { //zz PRINT("setgroups ( %llu, %p )", (ULong)ARG1, ARG2); @@ -4827,25 +4841,25 @@ PRE(sys_setgid16) //zz if (ARG1 > 0) //zz PRE_MEM_READ( "setgroups(list)", ARG2, ARG1 * sizeof(vki_gid_t) ); //zz } -//zz -//zz PRE(sys_setpgid, 0) -//zz { -//zz PRINT("setpgid ( %d, %d )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "setpgid", vki_pid_t, pid, vki_pid_t, pgid); -//zz } -//zz -//zz PRE(sys_setregid, 0) -//zz { -//zz PRINT("sys_setregid ( %d, %d )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "setregid", vki_gid_t, rgid, vki_gid_t, egid); -//zz } -//zz -//zz PRE(sys_setreuid16, 0) -//zz { -//zz PRINT("setreuid16 ( 0x%x, 0x%x )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "setreuid16", vki_old_uid_t, ruid, vki_old_uid_t, euid); -//zz } -//zz + +PRE(sys_setpgid) +{ + PRINT("setpgid ( %d, %d )", ARG1, ARG2); + PRE_REG_READ2(long, "setpgid", vki_pid_t, pid, vki_pid_t, pgid); +} + +PRE(sys_setregid) +{ + PRINT("sys_setregid ( %d, %d )", ARG1, ARG2); + PRE_REG_READ2(long, "setregid", vki_gid_t, rgid, vki_gid_t, egid); +} + +PRE(sys_setreuid16) +{ + PRINT("setreuid16 ( 0x%x, 0x%x )", ARG1, ARG2); + PRE_REG_READ2(long, "setreuid16", vki_old_uid_t, ruid, vki_old_uid_t, euid); +} + //zz PRE(sys_setreuid, 0) //zz { //zz PRINT("sys_setreuid ( 0x%x, 0x%x )", ARG1, ARG2); @@ -4904,32 +4918,32 @@ PRE(sys_setuid16) //zz PRE_REG_READ1(long, "setuid", vki_uid_t, uid); //zz } -//zz PRE(sys_newstat, 0) -//zz { -//zz PRINT("sys_newstat ( %p(%s), %p )", ARG1,ARG1,ARG2); -//zz PRE_REG_READ2(long, "stat", char *, file_name, struct stat *, buf); -//zz PRE_MEM_RASCIIZ( "stat(file_name)", ARG1 ); -//zz PRE_MEM_WRITE( "stat(buf)", ARG2, sizeof(struct vki_stat) ); -//zz } -//zz -//zz POST(sys_newstat) -//zz { -//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) ); -//zz } -//zz -//zz PRE(sys_statfs, 0) -//zz { -//zz PRINT("sys_statfs ( %p, %p )",ARG1,ARG2); -//zz PRE_REG_READ2(long, "statfs", const char *, path, struct statfs *, buf); -//zz PRE_MEM_RASCIIZ( "statfs(path)", ARG1 ); -//zz PRE_MEM_WRITE( "statfs(buf)", ARG2, sizeof(struct vki_statfs) ); -//zz } -//zz -//zz POST(sys_statfs) -//zz { -//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs) ); -//zz } -//zz +PRE(sys_newstat) +{ + PRINT("sys_newstat ( %p(%s), %p )", ARG1,ARG1,ARG2); + PRE_REG_READ2(long, "stat", char *, file_name, struct stat *, buf); + PRE_MEM_RASCIIZ( "stat(file_name)", ARG1 ); + PRE_MEM_WRITE( "stat(buf)", ARG2, sizeof(struct vki_stat) ); +} + +POST(sys_newstat) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) ); +} + +PRE(sys_statfs) +{ + PRINT("sys_statfs ( %p, %p )",ARG1,ARG2); + PRE_REG_READ2(long, "statfs", const char *, path, struct statfs *, buf); + PRE_MEM_RASCIIZ( "statfs(path)", ARG1 ); + PRE_MEM_WRITE( "statfs(buf)", ARG2, sizeof(struct vki_statfs) ); +} + +POST(sys_statfs) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs) ); +} + //zz PRE(sys_statfs64, 0) //zz { //zz PRINT("sys_statfs64 ( %p, %llu, %p )",ARG1,(ULong)ARG2,ARG3); @@ -5114,13 +5128,13 @@ PRE(sys_writev) //zz { //zz POST_MEM_WRITE(ARG3, ARG2); //zz } -//zz -//zz PRE(sys_acct, 0) -//zz { -//zz PRINT("sys_acct ( %p )", ARG1); -//zz PRE_REG_READ1(long, "acct", const char *, filename); -//zz PRE_MEM_RASCIIZ( "acct(filename)", ARG1 ); -//zz } + +PRE(sys_acct) +{ + PRINT("sys_acct ( %p )", ARG1); + PRE_REG_READ1(long, "acct", const char *, filename); + PRE_MEM_RASCIIZ( "acct(filename)", ARG1 ); +} PRE(sys_pause) { @@ -5346,18 +5360,18 @@ POST(sys_rt_sigprocmask) POST_MEM_WRITE( ARG3, sizeof(vki_sigset_t)); } -//zz PRE(sys_sigpending, 0) -//zz { -//zz PRINT( "sys_sigpending ( %p )", ARG1 ); -//zz PRE_REG_READ1(long, "sigpending", vki_old_sigset_t *, set); -//zz PRE_MEM_WRITE( "sigpending(set)", ARG1, sizeof(vki_old_sigset_t)); -//zz } -//zz -//zz POST(sys_sigpending) -//zz { -//zz POST_MEM_WRITE( ARG1, sizeof(vki_old_sigset_t) ) ; -//zz } -//zz +PRE(sys_sigpending) +{ + PRINT( "sys_sigpending ( %p )", ARG1 ); + PRE_REG_READ1(long, "sigpending", vki_old_sigset_t *, set); + PRE_MEM_WRITE( "sigpending(set)", ARG1, sizeof(vki_old_sigset_t)); +} + +POST(sys_sigpending) +{ + POST_MEM_WRITE( ARG1, sizeof(vki_old_sigset_t) ) ; +} + //zz PRE(sys_rt_sigpending, 0) //zz { //zz PRINT( "sys_rt_sigpending ( %p )", ARG1 ); diff --git a/coregrind/m_syscalls/syscalls-linux.c b/coregrind/m_syscalls/syscalls-linux.c index 0b0e77fbbb..2b8f726b15 100644 --- a/coregrind/m_syscalls/syscalls-linux.c +++ b/coregrind/m_syscalls/syscalls-linux.c @@ -162,25 +162,25 @@ POST(sys_llseek) //zz { //zz POST_MEM_WRITE( ARG1, sizeof(struct vki_timex) ); //zz } -//zz -//zz PRE(sys_setfsuid16, 0) -//zz { -//zz PRINT("sys_setfsuid16 ( %d )", ARG1); -//zz PRE_REG_READ1(long, "setfsuid16", vki_old_uid_t, uid); -//zz } -//zz + +PRE(sys_setfsuid16) +{ + PRINT("sys_setfsuid16 ( %d )", ARG1); + PRE_REG_READ1(long, "setfsuid16", vki_old_uid_t, uid); +} + //zz PRE(sys_setfsuid, 0) //zz { //zz PRINT("sys_setfsuid ( %d )", ARG1); //zz PRE_REG_READ1(long, "setfsuid", vki_uid_t, uid); //zz } -//zz -//zz PRE(sys_setfsgid16, 0) -//zz { -//zz PRINT("sys_setfsgid16 ( %d )", ARG1); -//zz PRE_REG_READ1(long, "setfsgid16", vki_old_gid_t, gid); -//zz } -//zz + +PRE(sys_setfsgid16) +{ + PRINT("sys_setfsgid16 ( %d )", ARG1); + PRE_REG_READ1(long, "setfsgid16", vki_old_gid_t, gid); +} + //zz PRE(sys_setfsgid, 0) //zz { //zz PRINT("sys_setfsgid ( %d )", ARG1); @@ -295,62 +295,63 @@ POST(sys_getresgid) } } -//zz PRE(sys_ioperm, 0) -//zz { -//zz PRINT("sys_ioperm ( %d, %d, %d )", ARG1, ARG2, ARG3 ); -//zz PRE_REG_READ3(long, "ioperm", -//zz unsigned long, from, unsigned long, num, int, turn_on); -//zz } -//zz -//zz PRE(sys_syslog, MayBlock) -//zz { -//zz PRINT("sys_syslog (%d, %p, %d)", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "syslog", int, type, char *, bufp, int, len); -//zz switch (ARG1) { -//zz // The kernel uses magic numbers here, rather than named constants, -//zz // therefore so do we. -//zz case 2: case 3: case 4: -//zz PRE_MEM_WRITE( "syslog(bufp)", ARG2, ARG3); -//zz break; -//zz default: -//zz break; -//zz } -//zz } -//zz -//zz POST(sys_syslog) -//zz { -//zz switch (ARG1) { -//zz case 2: case 3: case 4: -//zz POST_MEM_WRITE( ARG2, ARG3 ); -//zz break; -//zz default: -//zz break; -//zz } -//zz } -//zz -//zz PRE(sys_vhangup, 0) -//zz { -//zz PRINT("sys_vhangup ( )"); -//zz PRE_REG_READ0(long, "vhangup"); -//zz } -//zz -//zz PRE(sys_sysinfo, 0) -//zz { -//zz PRINT("sys_sysinfo ( %p )",ARG1); -//zz PRE_REG_READ1(long, "sysinfo", struct sysinfo *, info); -//zz PRE_MEM_WRITE( "sysinfo(info)", ARG1, sizeof(struct vki_sysinfo) ); -//zz } -//zz -//zz POST(sys_sysinfo) -//zz { -//zz POST_MEM_WRITE( ARG1, sizeof(struct vki_sysinfo) ); -//zz } -//zz -//zz PRE(sys_personality, 0) -//zz { -//zz PRINT("sys_personality ( %llu )", (ULong)ARG1); -//zz PRE_REG_READ1(long, "personality", vki_u_long, persona); -//zz } +PRE(sys_ioperm) +{ + PRINT("sys_ioperm ( %d, %d, %d )", ARG1, ARG2, ARG3 ); + PRE_REG_READ3(long, "ioperm", + unsigned long, from, unsigned long, num, int, turn_on); +} + +PRE(sys_syslog) +{ + *flags |= SfMayBlock; + PRINT("sys_syslog (%d, %p, %d)", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "syslog", int, type, char *, bufp, int, len); + switch (ARG1) { + // The kernel uses magic numbers here, rather than named constants, + // therefore so do we. + case 2: case 3: case 4: + PRE_MEM_WRITE( "syslog(bufp)", ARG2, ARG3); + break; + default: + break; + } +} + +POST(sys_syslog) +{ + switch (ARG1) { + case 2: case 3: case 4: + POST_MEM_WRITE( ARG2, ARG3 ); + break; + default: + break; + } +} + +PRE(sys_vhangup) +{ + PRINT("sys_vhangup ( )"); + PRE_REG_READ0(long, "vhangup"); +} + +PRE(sys_sysinfo) +{ + PRINT("sys_sysinfo ( %p )",ARG1); + PRE_REG_READ1(long, "sysinfo", struct sysinfo *, info); + PRE_MEM_WRITE( "sysinfo(info)", ARG1, sizeof(struct vki_sysinfo) ); +} + +POST(sys_sysinfo) +{ + POST_MEM_WRITE( ARG1, sizeof(struct vki_sysinfo) ); +} + +PRE(sys_personality) +{ + PRINT("sys_personality ( %llu )", (ULong)ARG1); + PRE_REG_READ1(long, "personality", vki_u_long, persona); +} PRE(sys_sysctl) { diff --git a/coregrind/m_syscalls/syscalls-x86-linux.c b/coregrind/m_syscalls/syscalls-x86-linux.c index 7a4c1129e3..53395beb1d 100644 --- a/coregrind/m_syscalls/syscalls-x86-linux.c +++ b/coregrind/m_syscalls/syscalls-x86-linux.c @@ -951,39 +951,41 @@ DECL_TEMPLATE(x86_linux, sys_rt_sigreturn); DECL_TEMPLATE(x86_linux, sys_modify_ldt); DECL_TEMPLATE(x86_linux, sys_set_thread_area); DECL_TEMPLATE(x86_linux, sys_ptrace); +DECL_TEMPLATE(x86_linux, sys_sigaction); +DECL_TEMPLATE(x86_linux, old_select); -//zz PRE(old_select, MayBlock) -//zz { -//zz /* struct sel_arg_struct { -//zz unsigned long n; -//zz fd_set *inp, *outp, *exp; -//zz struct timeval *tvp; -//zz }; -//zz */ -//zz PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args); -//zz PRE_MEM_READ( "old_select(args)", ARG1, 5*sizeof(UWord) ); -//zz -//zz { -//zz UInt* arg_struct = (UInt*)ARG1; -//zz UInt a1, a2, a3, a4, a5; -//zz -//zz a1 = arg_struct[0]; -//zz a2 = arg_struct[1]; -//zz a3 = arg_struct[2]; -//zz a4 = arg_struct[3]; -//zz a5 = arg_struct[4]; -//zz -//zz PRINT("old_select ( %d, %p, %p, %p, %p )", a1,a2,a3,a4,a5); -//zz if (a2 != (Addr)NULL) -//zz PRE_MEM_READ( "old_select(readfds)", a2, a1/8 /* __FD_SETSIZE/8 */ ); -//zz if (a3 != (Addr)NULL) -//zz PRE_MEM_READ( "old_select(writefds)", a3, a1/8 /* __FD_SETSIZE/8 */ ); -//zz if (a4 != (Addr)NULL) -//zz PRE_MEM_READ( "old_select(exceptfds)", a4, a1/8 /* __FD_SETSIZE/8 */ ); -//zz if (a5 != (Addr)NULL) -//zz PRE_MEM_READ( "old_select(timeout)", a5, sizeof(struct vki_timeval) ); -//zz } -//zz } +PRE(old_select) +{ + /* struct sel_arg_struct { + unsigned long n; + fd_set *inp, *outp, *exp; + struct timeval *tvp; + }; + */ + PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args); + PRE_MEM_READ( "old_select(args)", ARG1, 5*sizeof(UWord) ); + *flags |= SfMayBlock; + { + UInt* arg_struct = (UInt*)ARG1; + UInt a1, a2, a3, a4, a5; + + a1 = arg_struct[0]; + a2 = arg_struct[1]; + a3 = arg_struct[2]; + a4 = arg_struct[3]; + a5 = arg_struct[4]; + + PRINT("old_select ( %d, %p, %p, %p, %p )", a1,a2,a3,a4,a5); + if (a2 != (Addr)NULL) + PRE_MEM_READ( "old_select(readfds)", a2, a1/8 /* __FD_SETSIZE/8 */ ); + if (a3 != (Addr)NULL) + PRE_MEM_READ( "old_select(writefds)", a3, a1/8 /* __FD_SETSIZE/8 */ ); + if (a4 != (Addr)NULL) + PRE_MEM_READ( "old_select(exceptfds)", a4, a1/8 /* __FD_SETSIZE/8 */ ); + if (a5 != (Addr)NULL) + PRE_MEM_READ( "old_select(timeout)", a5, sizeof(struct vki_timeval) ); + } +} PRE(sys_clone) { @@ -1820,81 +1822,69 @@ POST(sys_socketcall) # undef ARG2_5 } -//zz // jrs 20050207: this is from the svn branch -//zz //PRE(sys_sigaction, Special) -//zz //{ -//zz // PRINT("sys_sigaction ( %d, %p, %p )", ARG1,ARG2,ARG3); -//zz // PRE_REG_READ3(int, "sigaction", -//zz // int, signum, const struct old_sigaction *, act, -//zz // struct old_sigaction *, oldact) -//zz // if (ARG2 != 0) -//zz // PRE_MEM_READ( "sigaction(act)", ARG2, sizeof(struct vki_old_sigaction)); -//zz // if (ARG3 != 0) -//zz // PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction)); -//zz // -//zz // VG_(do_sys_sigaction)(tid); -//zz //} -//zz -//zz /* Convert from non-RT to RT sigset_t's */ -//zz static void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set) -//zz { -//zz VG_(sigemptyset)(set); -//zz set->sig[0] = *oldset; -//zz } -//zz PRE(sys_sigaction, Special) -//zz { -//zz struct vki_sigaction new, old; -//zz struct vki_sigaction *newp, *oldp; -//zz -//zz PRINT("sys_sigaction ( %d, %p, %p )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(int, "sigaction", -//zz int, signum, const struct old_sigaction *, act, -//zz struct old_sigaction *, oldact); -//zz -//zz newp = oldp = NULL; -//zz -//zz if (ARG2 != 0) -//zz PRE_MEM_READ( "sigaction(act)", ARG2, sizeof(struct vki_old_sigaction)); -//zz -//zz if (ARG3 != 0) { -//zz PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction)); -//zz oldp = &old; -//zz } -//zz -//zz //jrs 20050207: what?! how can this make any sense? -//zz //if (VG_(is_kerror)(SYSRES)) -//zz // return; -//zz -//zz if (ARG2 != 0) { -//zz struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2; -//zz -//zz new.ksa_handler = oldnew->ksa_handler; -//zz new.sa_flags = oldnew->sa_flags; -//zz new.sa_restorer = oldnew->sa_restorer; -//zz convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask); -//zz newp = &new; -//zz } -//zz -//zz SET_STATUS_( VG_(do_sys_sigaction)(ARG1, newp, oldp) ); -//zz -//zz if (ARG3 != 0 && RES == 0) { -//zz struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3; -//zz -//zz oldold->ksa_handler = oldp->ksa_handler; -//zz oldold->sa_flags = oldp->sa_flags; -//zz oldold->sa_restorer = oldp->sa_restorer; -//zz oldold->sa_mask = oldp->sa_mask.sig[0]; -//zz } -//zz } -//zz -//zz POST(sys_sigaction) -//zz { -//zz if (RES == 0 && ARG3 != 0) -//zz POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction)); -//zz } -//zz -//zz #undef PRE -//zz #undef POST +/* Convert from non-RT to RT sigset_t's */ +static +void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set) +{ + VG_(sigemptyset)(set); + set->sig[0] = *oldset; +} +PRE(sys_sigaction) +{ + struct vki_sigaction new, old; + struct vki_sigaction *newp, *oldp; + + 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); + + newp = oldp = NULL; + + if (ARG2 != 0) + PRE_MEM_READ( "sigaction(act)", ARG2, sizeof(struct vki_old_sigaction)); + + if (ARG3 != 0) { + PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction)); + oldp = &old; + } + + //jrs 20050207: what?! how can this make any sense? + //if (VG_(is_kerror)(SYSRES)) + // return; + + if (ARG2 != 0) { + struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2; + + new.ksa_handler = oldnew->ksa_handler; + new.sa_flags = oldnew->sa_flags; + new.sa_restorer = oldnew->sa_restorer; + convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask); + newp = &new; + } + + SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) ); + + if (ARG3 != 0 && SUCCESS && RES == 0) { + struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3; + + oldold->ksa_handler = oldp->ksa_handler; + oldold->sa_flags = oldp->sa_flags; + oldold->sa_restorer = oldp->sa_restorer; + oldold->sa_mask = oldp->sa_mask.sig[0]; + } +} + +POST(sys_sigaction) +{ + vg_assert(SUCCESS); + if (RES == 0 && ARG3 != 0) + POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction)); +} + +#undef PRE +#undef POST + /* --------------------------------------------------------------------- The x86/Linux syscall table @@ -1974,46 +1964,46 @@ const SyscallTableEntry VGP_(syscall_table)[] = { GENX_(__NR_getgid, sys_getgid16), // 47 //zz // (__NR_signal, sys_signal), // 48 */* (ANSI C) GENX_(__NR_geteuid, sys_geteuid16), // 49 -//zz -//zz GENX_(__NR_getegid, sys_getegid16), // 50 -//zz GENX_(__NR_acct, sys_acct), // 51 -//zz LINX_(__NR_umount2, sys_umount), // 52 + + GENX_(__NR_getegid, sys_getegid16), // 50 + GENX_(__NR_acct, sys_acct), // 51 + LINX_(__NR_umount2, sys_umount), // 52 GENX_(__NR_lock, sys_ni_syscall), // 53 GENXY(__NR_ioctl, sys_ioctl), // 54 -//zz -//zz GENXY(__NR_fcntl, sys_fcntl), // 55 + + GENXY(__NR_fcntl, sys_fcntl), // 55 GENX_(__NR_mpx, sys_ni_syscall), // 56 -//zz GENX_(__NR_setpgid, sys_setpgid), // 57 + GENX_(__NR_setpgid, sys_setpgid), // 57 GENX_(__NR_ulimit, sys_ni_syscall), // 58 //zz // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete //zz GENX_(__NR_umask, sys_umask), // 60 -//zz GENX_(__NR_chroot, sys_chroot), // 61 + GENX_(__NR_chroot, sys_chroot), // 61 //zz // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated GENXY(__NR_dup2, sys_dup2), // 63 GENX_(__NR_getppid, sys_getppid), // 64 GENX_(__NR_getpgrp, sys_getpgrp), // 65 -//zz GENX_(__NR_setsid, sys_setsid), // 66 -//zz PLAXY(__NR_sigaction, sys_sigaction), // 67 + GENX_(__NR_setsid, sys_setsid), // 66 + PLAXY(__NR_sigaction, sys_sigaction), // 67 //zz // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C) //zz // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C) //zz -//zz GENX_(__NR_setreuid, sys_setreuid16), // 70 -//zz GENX_(__NR_setregid, sys_setregid16), // 71 + GENX_(__NR_setreuid, sys_setreuid16), // 70 + GENX_(__NR_setregid, sys_setregid16), // 71 //zz GENX_(__NR_sigsuspend, sys_sigsuspend), // 72 -//zz GENXY(__NR_sigpending, sys_sigpending), // 73 + GENXY(__NR_sigpending, sys_sigpending), // 73 //zz // (__NR_sethostname, sys_sethostname), // 74 */* //zz GENX_(__NR_setrlimit, sys_setrlimit), // 75 -//zz GENXY(__NR_getrlimit, sys_old_getrlimit), // 76 -//zz GENXY(__NR_getrusage, sys_getrusage), // 77 + GENXY(__NR_getrlimit, sys_old_getrlimit), // 76 + GENXY(__NR_getrusage, sys_getrusage), // 77 GENXY(__NR_gettimeofday, sys_gettimeofday), // 78 -//zz GENX_(__NR_settimeofday, sys_settimeofday), // 79 -//zz -//zz GENXY(__NR_getgroups, sys_getgroups16), // 80 -//zz GENX_(__NR_setgroups, sys_setgroups16), // 81 -//zz PLAX_(__NR_select, old_select), // 82 + GENX_(__NR_settimeofday, sys_settimeofday), // 79 + + GENXY(__NR_getgroups, sys_getgroups16), // 80 + GENX_(__NR_setgroups, sys_setgroups16), // 81 + PLAX_(__NR_select, old_select), // 82 GENX_(__NR_symlink, sys_symlink), // 83 //zz // (__NR_oldlstat, sys_lstat), // 84 -- obsolete //zz @@ -2025,36 +2015,36 @@ const SyscallTableEntry VGP_(syscall_table)[] = { //zz PLAX_(__NR_mmap, old_mmap), // 90 GENXY(__NR_munmap, sys_munmap), // 91 -//zz GENX_(__NR_truncate, sys_truncate), // 92 + GENX_(__NR_truncate, sys_truncate), // 92 GENX_(__NR_ftruncate, sys_ftruncate), // 93 -//zz GENX_(__NR_fchmod, sys_fchmod), // 94 -//zz -//zz GENX_(__NR_fchown, sys_fchown16), // 95 -//zz GENX_(__NR_getpriority, sys_getpriority), // 96 -//zz GENX_(__NR_setpriority, sys_setpriority), // 97 + GENX_(__NR_fchmod, sys_fchmod), // 94 + + GENX_(__NR_fchown, sys_fchown16), // 95 + GENX_(__NR_getpriority, sys_getpriority), // 96 + GENX_(__NR_setpriority, sys_setpriority), // 97 GENX_(__NR_profil, sys_ni_syscall), // 98 -//zz GENXY(__NR_statfs, sys_statfs), // 99 -//zz -//zz GENXY(__NR_fstatfs, sys_fstatfs), // 100 -//zz LINX_(__NR_ioperm, sys_ioperm), // 101 + GENXY(__NR_statfs, sys_statfs), // 99 + + GENXY(__NR_fstatfs, sys_fstatfs), // 100 + LINX_(__NR_ioperm, sys_ioperm), // 101 PLAXY(__NR_socketcall, sys_socketcall), // 102 x86/Linux-only -//zz LINXY(__NR_syslog, sys_syslog), // 103 -//zz GENXY(__NR_setitimer, sys_setitimer), // 104 -//zz -//zz GENXY(__NR_getitimer, sys_getitimer), // 105 -//zz GENXY(__NR_stat, sys_newstat), // 106 -//zz GENXY(__NR_lstat, sys_newlstat), // 107 -//zz GENXY(__NR_fstat, sys_newfstat), // 108 + LINXY(__NR_syslog, sys_syslog), // 103 + GENXY(__NR_setitimer, sys_setitimer), // 104 + + GENXY(__NR_getitimer, sys_getitimer), // 105 + GENXY(__NR_stat, sys_newstat), // 106 + GENXY(__NR_lstat, sys_newlstat), // 107 + GENXY(__NR_fstat, sys_newfstat), // 108 //zz // (__NR_olduname, sys_uname), // 109 -- obsolete //zz -//zz GENX_(__NR_iopl, sys_iopl), // 110 -//zz LINX_(__NR_vhangup, sys_vhangup), // 111 + GENX_(__NR_iopl, sys_iopl), // 110 + LINX_(__NR_vhangup, sys_vhangup), // 111 GENX_(__NR_idle, sys_ni_syscall), // 112 //zz // (__NR_vm86old, sys_vm86old), // 113 x86/Linux-only GENXY(__NR_wait4, sys_wait4), // 114 //zz //zz // (__NR_swapoff, sys_swapoff), // 115 */Linux -//zz LINXY(__NR_sysinfo, sys_sysinfo), // 116 + LINXY(__NR_sysinfo, sys_sysinfo), // 116 PLAXY(__NR_ipc, sys_ipc), // 117 GENX_(__NR_fsync, sys_fsync), // 118 PLAX_(__NR_sigreturn, sys_sigreturn), // 119 ?/Linux @@ -2069,38 +2059,38 @@ const SyscallTableEntry VGP_(syscall_table)[] = { GENXY(__NR_sigprocmask, sys_sigprocmask), // 126 //zz // Nb: create_module() was removed 2.4-->2.6 GENX_(__NR_create_module, sys_ni_syscall), // 127 -//zz GENX_(__NR_init_module, sys_init_module), // 128 + GENX_(__NR_init_module, sys_init_module), // 128 //zz // (__NR_delete_module, sys_delete_module), // 129 (*/Linux)? //zz //zz // Nb: get_kernel_syms() was removed 2.4-->2.6 GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130 -//zz GENX_(__NR_quotactl, sys_quotactl), // 131 -//zz GENX_(__NR_getpgid, sys_getpgid), // 132 -//zz GENX_(__NR_fchdir, sys_fchdir), // 133 + GENX_(__NR_quotactl, sys_quotactl), // 131 + GENX_(__NR_getpgid, sys_getpgid), // 132 + GENX_(__NR_fchdir, sys_fchdir), // 133 //zz // (__NR_bdflush, sys_bdflush), // 134 */Linux //zz //zz // (__NR_sysfs, sys_sysfs), // 135 SVr4 -//zz LINX_(__NR_personality, sys_personality), // 136 + LINX_(__NR_personality, sys_personality), // 136 GENX_(__NR_afs_syscall, sys_ni_syscall), // 137 -//zz LINX_(__NR_setfsuid, sys_setfsuid16), // 138 -//zz LINX_(__NR_setfsgid, sys_setfsgid16), // 139 -//zz + LINX_(__NR_setfsuid, sys_setfsuid16), // 138 + LINX_(__NR_setfsgid, sys_setfsgid16), // 139 + LINXY(__NR__llseek, sys_llseek), // 140 GENXY(__NR_getdents, sys_getdents), // 141 GENX_(__NR__newselect, sys_select), // 142 -//zz GENX_(__NR_flock, sys_flock), // 143 -//zz GENX_(__NR_msync, sys_msync), // 144 -//zz + GENX_(__NR_flock, sys_flock), // 143 + GENX_(__NR_msync, sys_msync), // 144 + GENXY(__NR_readv, sys_readv), // 145 GENX_(__NR_writev, sys_writev), // 146 -//zz GENX_(__NR_getsid, sys_getsid), // 147 -//zz GENX_(__NR_fdatasync, sys_fdatasync), // 148 + GENX_(__NR_getsid, sys_getsid), // 147 + GENX_(__NR_fdatasync, sys_fdatasync), // 148 LINXY(__NR__sysctl, sys_sysctl), // 149 -//zz -//zz GENX_(__NR_mlock, sys_mlock), // 150 -//zz GENX_(__NR_munlock, sys_munlock), // 151 -//zz GENX_(__NR_mlockall, sys_mlockall), // 152 -//zz GENX_(__NR_munlockall, sys_munlockall), // 153 + + GENX_(__NR_mlock, sys_mlock), // 150 + GENX_(__NR_munlock, sys_munlock), // 151 + GENX_(__NR_mlockall, sys_mlockall), // 152 + GENX_(__NR_munlockall, sys_munlockall), // 153 //zz GENXY(__NR_sched_setparam, sys_sched_setparam), // 154 //zz GENXY(__NR_sched_getparam, sys_sched_getparam), // 155