From: Julian Seward Date: Fri, 10 Jun 2005 10:27:55 +0000 (+0000) Subject: Clean up after m_syscalls changes: reinstate enough syscalls that X-Git-Tag: svn/VALGRIND_3_0_0~451 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1deec15f7ca5c1a08c0608d3db33a973455bdaee;p=thirdparty%2Fvalgrind.git Clean up after m_syscalls changes: reinstate enough syscalls that memcheck/tests/x86/scalar works again. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3867 --- diff --git a/coregrind/m_syscalls/priv_types_n_macros.h b/coregrind/m_syscalls/priv_types_n_macros.h index 711f061644..17df5bb73a 100644 --- a/coregrind/m_syscalls/priv_types_n_macros.h +++ b/coregrind/m_syscalls/priv_types_n_macros.h @@ -83,11 +83,10 @@ typedef SyscallArgLayout; /* Flags describing syscall wrappers */ -#define SfMayBlock (1 << 1) /* may block */ -#define SfPostOnFail (1 << 2) /* call POST() function on failure */ -/* #define SfPadAddr (1 << 3) */ /* pad+unpad address space around syscall */ -#define SfPollAfter (1 << 4) /* poll for signals on completion */ -#define SfYieldAfter (1 << 5) /* yield on completion */ +#define SfMayBlock (1 << 1) /* may block */ +#define SfPostOnFail (1 << 2) /* call POST() function on failure */ +#define SfPollAfter (1 << 3) /* poll for signals on completion */ +#define SfYieldAfter (1 << 4) /* yield on completion */ /* --------------------------------------------------------------------- @@ -143,13 +142,18 @@ extern const UInt VGP_(syscall_table_size); You should create corresponding global declarations using DECL_TEMPLATE (indirectly) below. + + Note. The silly name "arrghs" is used rather than just "args" + because a few wrappers declare the name "args" themselves, and + renaming those decls can change the name that comes out in error + messages (on scalar arg checks). Hence rename this instead. */ #define DEFN_PRE_TEMPLATE(auxstr, name) \ void vgSysWrap_##auxstr##_##name##_before \ ( ThreadId tid, \ SyscallArgLayout* layout, \ - /*MOD*/SyscallArgs* args, \ + /*MOD*/SyscallArgs* arrghs, \ /*OUT*/SyscallStatus* status, \ /*OUT*/UWord* flags \ ) @@ -157,7 +161,7 @@ extern const UInt VGP_(syscall_table_size); #define DEFN_POST_TEMPLATE(auxstr, name) \ void vgSysWrap_##auxstr##_##name##_after \ ( ThreadId tid, \ - SyscallArgs* args, \ + SyscallArgs* arrghs, \ SyscallStatus* status \ ) @@ -171,14 +175,14 @@ extern const UInt VGP_(syscall_table_size); void vgSysWrap_##auxstr##_##name##_before \ ( ThreadId tid, \ SyscallArgLayout* layout, \ - /*MOD*/SyscallArgs* args, \ + /*MOD*/SyscallArgs* arrghs, \ /*OUT*/SyscallStatus* status, \ /*OUT*/UWord* flags \ ); \ extern \ void vgSysWrap_##auxstr##_##name##_after \ ( ThreadId tid, \ - SyscallArgs* args, \ + SyscallArgs* arrghs, \ SyscallStatus* status \ ); @@ -213,13 +217,13 @@ extern const UInt VGP_(syscall_table_size); /* Reference to the syscall's arguments -- the ones which the pre-wrapper may have modified, not the original copy. */ -#define SYSNO (args->sysno) -#define ARG1 (args->arg1) -#define ARG2 (args->arg2) -#define ARG3 (args->arg3) -#define ARG4 (args->arg4) -#define ARG5 (args->arg5) -#define ARG6 (args->arg6) +#define SYSNO (arrghs->sysno) +#define ARG1 (arrghs->arg1) +#define ARG2 (arrghs->arg2) +#define ARG3 (arrghs->arg3) +#define ARG4 (arrghs->arg4) +#define ARG5 (arrghs->arg5) +#define ARG6 (arrghs->arg6) /* Reference to the syscall's current result status/value. Note that diff --git a/coregrind/m_syscalls/syscalls-generic.c b/coregrind/m_syscalls/syscalls-generic.c index 17b430d0d2..2451816841 100644 --- a/coregrind/m_syscalls/syscalls-generic.c +++ b/coregrind/m_syscalls/syscalls-generic.c @@ -1690,40 +1690,43 @@ PRE(sys_iopl) PRE_REG_READ1(long, "iopl", unsigned long, level); } -//zz PRE(sys_setxattr, SfMayBlock) -//zz { -//zz PRINT("sys_setxattr ( %p, %p, %p, %llu, %d )", -//zz ARG1, ARG2, ARG3, (ULong)ARG4, ARG5); -//zz PRE_REG_READ5(long, "setxattr", -//zz char *, path, char *, name, -//zz void *, value, vki_size_t, size, int, flags); -//zz PRE_MEM_RASCIIZ( "setxattr(path)", ARG1 ); -//zz PRE_MEM_RASCIIZ( "setxattr(name)", ARG2 ); -//zz PRE_MEM_READ( "setxattr(value)", ARG3, ARG4 ); -//zz } -//zz -//zz PRE(sys_lsetxattr, SfMayBlock) -//zz { -//zz PRINT("sys_lsetxattr ( %p, %p, %p, %llu, %d )", -//zz ARG1, ARG2, ARG3, (ULong)ARG4, ARG5); -//zz PRE_REG_READ5(long, "lsetxattr", -//zz char *, path, char *, name, -//zz void *, value, vki_size_t, size, int, flags); -//zz PRE_MEM_RASCIIZ( "lsetxattr(path)", ARG1 ); -//zz PRE_MEM_RASCIIZ( "lsetxattr(name)", ARG2 ); -//zz PRE_MEM_READ( "lsetxattr(value)", ARG3, ARG4 ); -//zz } -//zz -//zz PRE(sys_fsetxattr, SfMayBlock) -//zz { -//zz PRINT("sys_fsetxattr ( %d, %p, %p, %llu, %d )", -//zz ARG1, ARG2, ARG3, (ULong)ARG4, ARG5); -//zz PRE_REG_READ5(long, "fsetxattr", -//zz int, fd, char *, name, void *, value, -//zz vki_size_t, size, int, flags); -//zz PRE_MEM_RASCIIZ( "fsetxattr(name)", ARG2 ); -//zz PRE_MEM_READ( "fsetxattr(value)", ARG3, ARG4 ); -//zz } +PRE(sys_setxattr) +{ + *flags |= SfMayBlock; + PRINT("sys_setxattr ( %p, %p, %p, %llu, %d )", + ARG1, ARG2, ARG3, (ULong)ARG4, ARG5); + PRE_REG_READ5(long, "setxattr", + char *, path, char *, name, + void *, value, vki_size_t, size, int, flags); + PRE_MEM_RASCIIZ( "setxattr(path)", ARG1 ); + PRE_MEM_RASCIIZ( "setxattr(name)", ARG2 ); + PRE_MEM_READ( "setxattr(value)", ARG3, ARG4 ); +} + +PRE(sys_lsetxattr) +{ + *flags |= SfMayBlock; + PRINT("sys_lsetxattr ( %p, %p, %p, %llu, %d )", + ARG1, ARG2, ARG3, (ULong)ARG4, ARG5); + PRE_REG_READ5(long, "lsetxattr", + char *, path, char *, name, + void *, value, vki_size_t, size, int, flags); + PRE_MEM_RASCIIZ( "lsetxattr(path)", ARG1 ); + PRE_MEM_RASCIIZ( "lsetxattr(name)", ARG2 ); + PRE_MEM_READ( "lsetxattr(value)", ARG3, ARG4 ); +} + +PRE(sys_fsetxattr) +{ + *flags |= SfMayBlock; + PRINT("sys_fsetxattr ( %d, %p, %p, %llu, %d )", + ARG1, ARG2, ARG3, (ULong)ARG4, ARG5); + PRE_REG_READ5(long, "fsetxattr", + int, fd, char *, name, void *, value, + vki_size_t, size, int, flags); + PRE_MEM_RASCIIZ( "fsetxattr(name)", ARG2 ); + PRE_MEM_READ( "fsetxattr(value)", ARG3, ARG4 ); +} PRE(sys_getxattr) { @@ -1735,7 +1738,6 @@ PRE(sys_getxattr) PRE_MEM_RASCIIZ( "getxattr(name)", ARG2 ); PRE_MEM_WRITE( "getxattr(value)", ARG3, ARG4 ); } - POST(sys_getxattr) { vg_assert(SUCCESS); @@ -1744,104 +1746,108 @@ POST(sys_getxattr) } } -//zz PRE(sys_lgetxattr, SfMayBlock) -//zz { -//zz PRINT("sys_lgetxattr ( %p, %p, %p, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4); -//zz PRE_REG_READ4(ssize_t, "lgetxattr", -//zz char *, path, char *, name, void *, value, vki_size_t, size); -//zz PRE_MEM_RASCIIZ( "lgetxattr(path)", ARG1 ); -//zz PRE_MEM_RASCIIZ( "lgetxattr(name)", ARG2 ); -//zz PRE_MEM_WRITE( "lgetxattr(value)", ARG3, ARG4 ); -//zz } -//zz -//zz POST(sys_lgetxattr) -//zz { -//zz if (RES > 0 && ARG3 != (Addr)NULL) { -//zz POST_MEM_WRITE( ARG3, RES ); -//zz } -//zz } -//zz -//zz PRE(sys_fgetxattr, SfMayBlock) -//zz { -//zz PRINT("sys_fgetxattr ( %d, %p, %p, %llu )", ARG1, ARG2, ARG3, (ULong)ARG4); -//zz PRE_REG_READ4(ssize_t, "fgetxattr", -//zz int, fd, char *, name, void *, value, vki_size_t, size); -//zz PRE_MEM_RASCIIZ( "fgetxattr(name)", ARG2 ); -//zz PRE_MEM_WRITE( "fgetxattr(value)", ARG3, ARG4 ); -//zz } -//zz -//zz POST(sys_fgetxattr) -//zz { -//zz if (RES > 0 && ARG3 != (Addr)NULL) -//zz POST_MEM_WRITE( ARG3, RES ); -//zz } -//zz -//zz PRE(sys_listxattr, SfMayBlock) -//zz { -//zz PRINT("sys_listxattr ( %p, %p, %llu )", ARG1, ARG2, (ULong)ARG3); -//zz PRE_REG_READ3(ssize_t, "listxattr", -//zz char *, path, char *, list, vki_size_t, size); -//zz PRE_MEM_RASCIIZ( "listxattr(path)", ARG1 ); -//zz PRE_MEM_WRITE( "listxattr(list)", ARG2, ARG3 ); -//zz } -//zz -//zz POST(sys_listxattr) -//zz { -//zz if (RES > 0 && ARG2 != (Addr)NULL) -//zz POST_MEM_WRITE( ARG2, RES ); -//zz } -//zz -//zz PRE(sys_llistxattr, SfMayBlock) -//zz { -//zz PRINT("sys_llistxattr ( %p, %p, %llu )", ARG1, ARG2, (ULong)ARG3); -//zz PRE_REG_READ3(ssize_t, "llistxattr", -//zz char *, path, char *, list, vki_size_t, size); -//zz PRE_MEM_RASCIIZ( "llistxattr(path)", ARG1 ); -//zz PRE_MEM_WRITE( "llistxattr(list)", ARG2, ARG3 ); -//zz } -//zz -//zz POST(sys_llistxattr) -//zz { -//zz if (RES > 0 && ARG2 != (Addr)NULL) -//zz POST_MEM_WRITE( ARG2, RES ); -//zz } -//zz -//zz PRE(sys_flistxattr, SfMayBlock) -//zz { -//zz PRINT("sys_flistxattr ( %d, %p, %llu )", ARG1, ARG2, (ULong)ARG3); -//zz PRE_REG_READ3(ssize_t, "flistxattr", -//zz int, fd, char *, list, vki_size_t, size); -//zz PRE_MEM_WRITE( "flistxattr(list)", ARG2, ARG3 ); -//zz } -//zz -//zz POST(sys_flistxattr) -//zz { -//zz if (RES > 0 && ARG2 != (Addr)NULL) -//zz POST_MEM_WRITE( ARG2, RES ); -//zz } -//zz -//zz PRE(sys_removexattr, SfMayBlock) -//zz { -//zz PRINT("sys_removexattr ( %p, %p )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "removexattr", char *, path, char *, name); -//zz PRE_MEM_RASCIIZ( "removexattr(path)", ARG1 ); -//zz PRE_MEM_RASCIIZ( "removexattr(name)", ARG2 ); -//zz } -//zz -//zz PRE(sys_lremovexattr, SfMayBlock) -//zz { -//zz PRINT("sys_lremovexattr ( %p, %p )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "lremovexattr", char *, path, char *, name); -//zz PRE_MEM_RASCIIZ( "lremovexattr(path)", ARG1 ); -//zz PRE_MEM_RASCIIZ( "lremovexattr(name)", ARG2 ); -//zz } -//zz -//zz PRE(sys_fremovexattr, SfMayBlock) -//zz { -//zz PRINT("sys_fremovexattr ( %d, %p )", ARG1, ARG2); -//zz PRE_REG_READ2(long, "fremovexattr", int, fd, char *, name); -//zz PRE_MEM_RASCIIZ( "fremovexattr(name)", ARG2 ); -//zz } +PRE(sys_lgetxattr) +{ + *flags |= SfMayBlock; + PRINT("sys_lgetxattr ( %p, %p, %p, %llu )", ARG1,ARG2,ARG3, (ULong)ARG4); + PRE_REG_READ4(ssize_t, "lgetxattr", + char *, path, char *, name, void *, value, vki_size_t, size); + PRE_MEM_RASCIIZ( "lgetxattr(path)", ARG1 ); + PRE_MEM_RASCIIZ( "lgetxattr(name)", ARG2 ); + PRE_MEM_WRITE( "lgetxattr(value)", ARG3, ARG4 ); +} +POST(sys_lgetxattr) +{ + vg_assert(SUCCESS); + if (RES > 0 && ARG3 != (Addr)NULL) { + POST_MEM_WRITE( ARG3, RES ); + } +} + +PRE(sys_fgetxattr) +{ + *flags |= SfMayBlock; + PRINT("sys_fgetxattr ( %d, %p, %p, %llu )", ARG1, ARG2, ARG3, (ULong)ARG4); + PRE_REG_READ4(ssize_t, "fgetxattr", + int, fd, char *, name, void *, value, vki_size_t, size); + PRE_MEM_RASCIIZ( "fgetxattr(name)", ARG2 ); + PRE_MEM_WRITE( "fgetxattr(value)", ARG3, ARG4 ); +} +POST(sys_fgetxattr) +{ + if (RES > 0 && ARG3 != (Addr)NULL) + POST_MEM_WRITE( ARG3, RES ); +} + +PRE(sys_listxattr) +{ + *flags |= SfMayBlock; + PRINT("sys_listxattr ( %p, %p, %llu )", ARG1, ARG2, (ULong)ARG3); + PRE_REG_READ3(ssize_t, "listxattr", + char *, path, char *, list, vki_size_t, size); + PRE_MEM_RASCIIZ( "listxattr(path)", ARG1 ); + PRE_MEM_WRITE( "listxattr(list)", ARG2, ARG3 ); +} +POST(sys_listxattr) +{ + if (RES > 0 && ARG2 != (Addr)NULL) + POST_MEM_WRITE( ARG2, RES ); +} + +PRE(sys_llistxattr) +{ + *flags |= SfMayBlock; + PRINT("sys_llistxattr ( %p, %p, %llu )", ARG1, ARG2, (ULong)ARG3); + PRE_REG_READ3(ssize_t, "llistxattr", + char *, path, char *, list, vki_size_t, size); + PRE_MEM_RASCIIZ( "llistxattr(path)", ARG1 ); + PRE_MEM_WRITE( "llistxattr(list)", ARG2, ARG3 ); +} +POST(sys_llistxattr) +{ + if (RES > 0 && ARG2 != (Addr)NULL) + POST_MEM_WRITE( ARG2, RES ); +} + +PRE(sys_flistxattr) +{ + *flags |= SfMayBlock; + PRINT("sys_flistxattr ( %d, %p, %llu )", ARG1, ARG2, (ULong)ARG3); + PRE_REG_READ3(ssize_t, "flistxattr", + int, fd, char *, list, vki_size_t, size); + PRE_MEM_WRITE( "flistxattr(list)", ARG2, ARG3 ); +} +POST(sys_flistxattr) +{ + if (RES > 0 && ARG2 != (Addr)NULL) + POST_MEM_WRITE( ARG2, RES ); +} + +PRE(sys_removexattr) +{ + *flags |= SfMayBlock; + PRINT("sys_removexattr ( %p, %p )", ARG1, ARG2); + PRE_REG_READ2(long, "removexattr", char *, path, char *, name); + PRE_MEM_RASCIIZ( "removexattr(path)", ARG1 ); + PRE_MEM_RASCIIZ( "removexattr(name)", ARG2 ); +} + +PRE(sys_lremovexattr) +{ + *flags |= SfMayBlock; + PRINT("sys_lremovexattr ( %p, %p )", ARG1, ARG2); + PRE_REG_READ2(long, "lremovexattr", char *, path, char *, name); + PRE_MEM_RASCIIZ( "lremovexattr(path)", ARG1 ); + PRE_MEM_RASCIIZ( "lremovexattr(name)", ARG2 ); +} + +PRE(sys_fremovexattr) +{ + *flags |= SfMayBlock; + PRINT("sys_fremovexattr ( %d, %p )", ARG1, ARG2); + PRE_REG_READ2(long, "fremovexattr", int, fd, char *, name); + PRE_MEM_RASCIIZ( "fremovexattr(name)", ARG2 ); +} PRE(sys_quotactl) { @@ -1852,21 +1858,23 @@ PRE(sys_quotactl) PRE_MEM_RASCIIZ( "quotactl(special)", ARG2 ); } -//zz // XXX: this wrapper is only suitable for 32-bit platforms -//zz PRE(sys_lookup_dcookie, 0) -//zz { -//zz PRINT("sys_lookup_dcookie (0x%llx, %p, %d)", LOHI64(ARG1,ARG2), ARG3, ARG4); -//zz PRE_REG_READ4(long, "lookup_dcookie", -//zz vki_u32, cookie_low32, vki_u32, cookie_high32, -//zz char *, buf, vki_size_t, len); -//zz PRE_MEM_WRITE( "lookup_dcookie(buf)", ARG3, ARG4); -//zz } -//zz -//zz POST(sys_lookup_dcookie) -//zz { -//zz if (ARG3 != (Addr)NULL) -//zz POST_MEM_WRITE( ARG3, RES); -//zz } +// XXX: this wrapper is only suitable for 32-bit platforms +#if defined(VGP_x86_linux) +PRE(sys_lookup_dcookie) +{ + PRINT("sys_lookup_dcookie (0x%llx, %p, %d)", LOHI64(ARG1,ARG2), ARG3, ARG4); + PRE_REG_READ4(long, "lookup_dcookie", + vki_u32, cookie_low32, vki_u32, cookie_high32, + char *, buf, vki_size_t, len); + PRE_MEM_WRITE( "lookup_dcookie(buf)", ARG3, ARG4); +} +POST(sys_lookup_dcookie) +{ + vg_assert(SUCCESS); + if (ARG3 != (Addr)NULL) + POST_MEM_WRITE( ARG3, RES); +} +#endif PRE(sys_fsync) { @@ -1891,68 +1899,68 @@ PRE(sys_msync) 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 -//zz // from the kernel sources. -//zz struct vki_pmsg_strbuf { -//zz int maxlen; /* no. of bytes in buffer */ -//zz int len; /* no. of bytes returned */ -//zz vki_caddr_t buf; /* pointer to data */ -//zz }; -//zz -//zz PRE(sys_getpmsg, SfMayBlock) -//zz { -//zz /* LiS getpmsg from http://www.gcom.com/home/linux/lis/ */ -//zz struct vki_pmsg_strbuf *ctrl; -//zz struct vki_pmsg_strbuf *data; -//zz PRINT("sys_getpmsg ( %d, %p, %p, %p, %p )", ARG1,ARG2,ARG3,ARG4,ARG5); -//zz PRE_REG_READ5(int, "getpmsg", -//zz int, fd, struct strbuf *, ctrl, struct strbuf *, data, -//zz int *, bandp, int *, flagsp); -//zz ctrl = (struct vki_pmsg_strbuf *)ARG2; -//zz data = (struct vki_pmsg_strbuf *)ARG3; -//zz if (ctrl && ctrl->maxlen > 0) -//zz PRE_MEM_WRITE( "getpmsg(ctrl)", (Addr)ctrl->buf, ctrl->maxlen); -//zz if (data && data->maxlen > 0) -//zz PRE_MEM_WRITE( "getpmsg(data)", (Addr)data->buf, data->maxlen); -//zz if (ARG4) -//zz PRE_MEM_WRITE( "getpmsg(bandp)", (Addr)ARG4, sizeof(int)); -//zz if (ARG5) -//zz PRE_MEM_WRITE( "getpmsg(flagsp)", (Addr)ARG5, sizeof(int)); -//zz } -//zz -//zz POST(sys_getpmsg) -//zz { -//zz struct vki_pmsg_strbuf *ctrl; -//zz struct vki_pmsg_strbuf *data; -//zz -//zz ctrl = (struct vki_pmsg_strbuf *)ARG2; -//zz data = (struct vki_pmsg_strbuf *)ARG3; -//zz if (RES == 0 && ctrl && ctrl->len > 0) { -//zz POST_MEM_WRITE( (Addr)ctrl->buf, ctrl->len); -//zz } -//zz if (RES == 0 && data && data->len > 0) { -//zz POST_MEM_WRITE( (Addr)data->buf, data->len); -//zz } -//zz } -//zz -//zz PRE(sys_putpmsg, SfMayBlock) -//zz { -//zz /* LiS putpmsg from http://www.gcom.com/home/linux/lis/ */ -//zz struct vki_pmsg_strbuf *ctrl; -//zz struct vki_pmsg_strbuf *data; -//zz PRINT("sys_putpmsg ( %d, %p, %p, %d, %d )", ARG1,ARG2,ARG3,ARG4,ARG5); -//zz PRE_REG_READ5(int, "putpmsg", -//zz int, fd, struct strbuf *, ctrl, struct strbuf *, data, -//zz int, band, int, flags); -//zz ctrl = (struct vki_pmsg_strbuf *)ARG2; -//zz data = (struct vki_pmsg_strbuf *)ARG3; -//zz if (ctrl && ctrl->len > 0) -//zz PRE_MEM_READ( "putpmsg(ctrl)", (Addr)ctrl->buf, ctrl->len); -//zz if (data && data->len > 0) -//zz PRE_MEM_READ( "putpmsg(data)", (Addr)data->buf, data->len); -//zz } +// Nb: getpmsg() and putpmsg() are special additional syscalls used in early +// versions of LiS (Linux Streams). They are not part of the kernel. +// Therefore, we have to provide this type ourself, rather than getting it +// from the kernel sources. +struct vki_pmsg_strbuf { + int maxlen; /* no. of bytes in buffer */ + int len; /* no. of bytes returned */ + vki_caddr_t buf; /* pointer to data */ +}; +PRE(sys_getpmsg) +{ + /* LiS getpmsg from http://www.gcom.com/home/linux/lis/ */ + struct vki_pmsg_strbuf *ctrl; + struct vki_pmsg_strbuf *data; + *flags |= SfMayBlock; + PRINT("sys_getpmsg ( %d, %p, %p, %p, %p )", ARG1,ARG2,ARG3,ARG4,ARG5); + PRE_REG_READ5(int, "getpmsg", + int, fd, struct strbuf *, ctrl, struct strbuf *, data, + int *, bandp, int *, flagsp); + ctrl = (struct vki_pmsg_strbuf *)ARG2; + data = (struct vki_pmsg_strbuf *)ARG3; + if (ctrl && ctrl->maxlen > 0) + PRE_MEM_WRITE( "getpmsg(ctrl)", (Addr)ctrl->buf, ctrl->maxlen); + if (data && data->maxlen > 0) + PRE_MEM_WRITE( "getpmsg(data)", (Addr)data->buf, data->maxlen); + if (ARG4) + PRE_MEM_WRITE( "getpmsg(bandp)", (Addr)ARG4, sizeof(int)); + if (ARG5) + PRE_MEM_WRITE( "getpmsg(flagsp)", (Addr)ARG5, sizeof(int)); +} +POST(sys_getpmsg) +{ + struct vki_pmsg_strbuf *ctrl; + struct vki_pmsg_strbuf *data; + vg_assert(SUCCESS); + ctrl = (struct vki_pmsg_strbuf *)ARG2; + data = (struct vki_pmsg_strbuf *)ARG3; + if (RES == 0 && ctrl && ctrl->len > 0) { + POST_MEM_WRITE( (Addr)ctrl->buf, ctrl->len); + } + if (RES == 0 && data && data->len > 0) { + POST_MEM_WRITE( (Addr)data->buf, data->len); + } +} + +PRE(sys_putpmsg) +{ + /* LiS putpmsg from http://www.gcom.com/home/linux/lis/ */ + struct vki_pmsg_strbuf *ctrl; + struct vki_pmsg_strbuf *data; + *flags |= SfMayBlock; + PRINT("sys_putpmsg ( %d, %p, %p, %d, %d )", ARG1,ARG2,ARG3,ARG4,ARG5); + PRE_REG_READ5(int, "putpmsg", + int, fd, struct strbuf *, ctrl, struct strbuf *, data, + int, band, int, flags); + ctrl = (struct vki_pmsg_strbuf *)ARG2; + data = (struct vki_pmsg_strbuf *)ARG3; + if (ctrl && ctrl->len > 0) + PRE_MEM_READ( "putpmsg(ctrl)", (Addr)ctrl->buf, ctrl->len); + if (data && data->len > 0) + PRE_MEM_READ( "putpmsg(data)", (Addr)data->buf, data->len); +} PRE(sys_getitimer) { @@ -1960,7 +1968,6 @@ PRE(sys_getitimer) 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) { @@ -2097,16 +2104,19 @@ PRE(sys_setregid16) 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 { -//zz PRINT("sys_pwrite64 ( %d, %p, %llu, %lld )", -//zz ARG1, ARG2, (ULong)ARG3, LOHI64(ARG4,ARG5)); -//zz PRE_REG_READ5(ssize_t, "pwrite64", -//zz unsigned int, fd, const char *, buf, vki_size_t, count, -//zz vki_u32, offset_low32, vki_u32, offset_high32); -//zz PRE_MEM_READ( "pwrite64(buf)", ARG2, ARG3 ); -//zz } +// XXX: only for 32-bit archs +#if defined(VGP_x86_linux) +PRE(sys_pwrite64) +{ + *flags |= SfMayBlock; + PRINT("sys_pwrite64 ( %d, %p, %llu, %lld )", + ARG1, ARG2, (ULong)ARG3, LOHI64(ARG4,ARG5)); + PRE_REG_READ5(ssize_t, "pwrite64", + unsigned int, fd, const char *, buf, vki_size_t, count, + vki_u32, offset_low32, vki_u32, offset_high32); + PRE_MEM_READ( "pwrite64(buf)", ARG2, ARG3 ); +} +#endif PRE(sys_sync) { @@ -2128,18 +2138,17 @@ 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); -//zz PRE_REG_READ3(long, "fstatfs64", -//zz unsigned int, fd, vki_size_t, size, struct statfs64 *, buf); -//zz PRE_MEM_WRITE( "fstatfs64(buf)", ARG3, ARG2 ); -//zz } -//zz -//zz POST(sys_fstatfs64) -//zz { -//zz POST_MEM_WRITE( ARG3, ARG2 ); -//zz } +PRE(sys_fstatfs64) +{ + PRINT("sys_fstatfs64 ( %d, %llu, %p )",ARG1,(ULong)ARG2,ARG3); + PRE_REG_READ3(long, "fstatfs64", + unsigned int, fd, vki_size_t, size, struct statfs64 *, buf); + PRE_MEM_WRITE( "fstatfs64(buf)", ARG3, ARG2 ); +} +POST(sys_fstatfs64) +{ + POST_MEM_WRITE( ARG3, ARG2 ); +} PRE(sys_getsid) { @@ -2194,34 +2203,33 @@ PRE(sys_init_module) PRE_MEM_RASCIIZ( "init_module(uargs)", ARG3 ); } -//zz PRE(sys_capget, 0) -//zz { -//zz PRINT("sys_capget ( %p, %p )", ARG1, ARG2 ); -//zz PRE_REG_READ2(long, "capget", -//zz vki_cap_user_header_t, header, vki_cap_user_data_t, data); -//zz PRE_MEM_READ( "capget(header)", ARG1, -//zz sizeof(struct __vki_user_cap_header_struct) ); -//zz PRE_MEM_WRITE( "capget(data)", ARG2, -//zz sizeof(struct __vki_user_cap_data_struct) ); -//zz } -//zz -//zz POST(sys_capget) -//zz { -//zz if (ARG2 != (Addr)NULL) -//zz POST_MEM_WRITE( ARG2, sizeof(struct __vki_user_cap_data_struct) ); -//zz } -//zz -//zz PRE(sys_capset, 0) -//zz { -//zz PRINT("sys_capset ( %p, %p )", ARG1, ARG2 ); -//zz PRE_REG_READ2(long, "capset", -//zz vki_cap_user_header_t, header, -//zz const vki_cap_user_data_t, data); -//zz PRE_MEM_READ( "capset(header)", -//zz ARG1, sizeof(struct __vki_user_cap_header_struct) ); -//zz PRE_MEM_READ( "capset(data)", -//zz ARG2, sizeof(struct __vki_user_cap_data_struct) ); -//zz } +PRE(sys_capget) +{ + PRINT("sys_capget ( %p, %p )", ARG1, ARG2 ); + PRE_REG_READ2(long, "capget", + vki_cap_user_header_t, header, vki_cap_user_data_t, data); + PRE_MEM_READ( "capget(header)", ARG1, + sizeof(struct __vki_user_cap_header_struct) ); + PRE_MEM_WRITE( "capget(data)", ARG2, + sizeof(struct __vki_user_cap_data_struct) ); +} +POST(sys_capget) +{ + if (ARG2 != (Addr)NULL) + POST_MEM_WRITE( ARG2, sizeof(struct __vki_user_cap_data_struct) ); +} + +PRE(sys_capset) +{ + PRINT("sys_capset ( %p, %p )", ARG1, ARG2 ); + PRE_REG_READ2(long, "capset", + vki_cap_user_header_t, header, + const vki_cap_user_data_t, data); + PRE_MEM_READ( "capset(header)", + ARG1, sizeof(struct __vki_user_cap_header_struct) ); + PRE_MEM_READ( "capset(data)", + ARG2, sizeof(struct __vki_user_cap_data_struct) ); +} // Pre_read a char** argument. static void pre_argv_envp(Addr a, ThreadId tid, Char* s1, Char* s2) @@ -2452,31 +2460,31 @@ PRE(sys_chmod) PRE_MEM_RASCIIZ( "chmod(path)", ARG1 ); } -//zz PRE(sys_chown16, 0) -//zz { -//zz PRINT("sys_chown16 ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "chown16", -//zz const char *, path, -//zz vki_old_uid_t, owner, vki_old_gid_t, group); -//zz PRE_MEM_RASCIIZ( "chown16(path)", ARG1 ); -//zz } -//zz -//zz PRE(sys_chown, 0) -//zz { -//zz /* int chown(const char *path, uid_t owner, gid_t group); */ -//zz PRINT("sys_chown ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "chown", -//zz const char *, path, vki_uid_t, owner, vki_gid_t, group); -//zz PRE_MEM_RASCIIZ( "chown(path)", ARG1 ); -//zz } -//zz -//zz PRE(sys_lchown, 0) -//zz { -//zz PRINT("sys_lchown ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "lchown", -//zz const char *, path, vki_uid_t, owner, vki_gid_t, group); -//zz PRE_MEM_RASCIIZ( "lchown(path)", ARG1 ); -//zz } +PRE(sys_chown16) +{ + PRINT("sys_chown16 ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "chown16", + const char *, path, + vki_old_uid_t, owner, vki_old_gid_t, group); + PRE_MEM_RASCIIZ( "chown16(path)", ARG1 ); +} + +PRE(sys_chown) +{ + /* int chown(const char *path, uid_t owner, gid_t group); */ + PRINT("sys_chown ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "chown", + const char *, path, vki_uid_t, owner, vki_gid_t, group); + PRE_MEM_RASCIIZ( "chown(path)", ARG1 ); +} + +PRE(sys_lchown) +{ + PRINT("sys_lchown ( %p, 0x%x, 0x%x )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "lchown", + const char *, path, vki_uid_t, owner, vki_gid_t, group); + PRE_MEM_RASCIIZ( "lchown(path)", ARG1 ); +} PRE(sys_close) { @@ -2539,12 +2547,12 @@ PRE(sys_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 } +PRE(sys_fchown) +{ + PRINT("sys_fchown ( %d, %d, %d )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "fchown", + unsigned int, fd, vki_uid_t, owner, vki_gid_t, group); +} PRE(sys_fchmod) { @@ -2745,25 +2753,30 @@ PRE(sys_truncate) PRE_MEM_RASCIIZ( "truncate(path)", ARG1 ); } -//zz // XXX: this wrapper is only suitable for 32-bit platforms -//zz PRE(sys_ftruncate64, SfMayBlock) -//zz { -//zz PRINT("sys_ftruncate64 ( %d, %lld )", ARG1, LOHI64(ARG2,ARG3)); -//zz PRE_REG_READ3(long, "ftruncate64", -//zz unsigned int, fd, -//zz vki_u32, length_low32, vki_u32, length_high32); -//zz } -//zz -//zz // XXX: this wrapper is only suitable for 32-bit platforms -//zz PRE(sys_truncate64, SfMayBlock) -//zz { -//zz PRINT("sys_truncate64 ( %p, %lld )", ARG1, LOHI64(ARG2, ARG3)); -//zz PRE_REG_READ3(long, "truncate64", -//zz const char *, path, -//zz vki_u32, length_low32, vki_u32, length_high32); -//zz PRE_MEM_RASCIIZ( "truncate64(path)", ARG1 ); -//zz } -//zz +// XXX: this wrapper is only suitable for 32-bit platforms +#if defined(VGP_x86_linux) +PRE(sys_ftruncate64) +{ + *flags |= SfMayBlock; + PRINT("sys_ftruncate64 ( %d, %lld )", ARG1, LOHI64(ARG2,ARG3)); + PRE_REG_READ3(long, "ftruncate64", + unsigned int, fd, + vki_u32, length_low32, vki_u32, length_high32); +} +#endif + +// XXX: this wrapper is only suitable for 32-bit platforms +#if defined(VGP_x86_linux) +PRE(sys_truncate64) +{ + *flags |= SfMayBlock; + PRINT("sys_truncate64 ( %p, %lld )", ARG1, LOHI64(ARG2, ARG3)); + PRE_REG_READ3(long, "truncate64", + const char *, path, + vki_u32, length_low32, vki_u32, length_high32); + PRE_MEM_RASCIIZ( "truncate64(path)", ARG1 ); +} +#endif PRE(sys_getdents) { @@ -4495,19 +4508,18 @@ POST(sys_munmap) VG_TRACK( die_mem_munmap, a, len ); } -//zz PRE(sys_mincore, 0) -//zz { -//zz PRINT("sys_mincore ( %p, %llu, %p )", ARG1,(ULong)ARG2,ARG3); -//zz PRE_REG_READ3(long, "mincore", -//zz unsigned long, start, vki_size_t, length, -//zz unsigned char *, vec); -//zz PRE_MEM_WRITE( "mincore(vec)", ARG3, (ARG2 + 4096 - 1) / 4096); -//zz } -//zz -//zz POST(sys_mincore) -//zz { -//zz POST_MEM_WRITE( ARG3, (ARG2 + 4096 - 1) / 4096 ); -//zz } +PRE(sys_mincore) +{ + PRINT("sys_mincore ( %p, %llu, %p )", ARG1,(ULong)ARG2,ARG3); + PRE_REG_READ3(long, "mincore", + unsigned long, start, vki_size_t, length, + unsigned char *, vec); + PRE_MEM_WRITE( "mincore(vec)", ARG3, (ARG2 + 4096 - 1) / 4096); +} +POST(sys_mincore) +{ + POST_MEM_WRITE( ARG3, (ARG2 + 4096 - 1) / 4096 ); +} PRE(sys_nanosleep) { @@ -4764,18 +4776,17 @@ PRE(sys_rmdir) PRE_MEM_RASCIIZ( "rmdir(pathname)", ARG1 ); } -//zz PRE(sys_sched_setparam, 0) -//zz { -//zz PRINT("sched_setparam ( %d, %p )", ARG1, ARG2 ); -//zz PRE_REG_READ2(long, "sched_setparam", -//zz vki_pid_t, pid, struct sched_param *, p); -//zz PRE_MEM_READ( "sched_setparam(p)", ARG2, sizeof(struct vki_sched_param) ); -//zz } -//zz -//zz POST(sys_sched_setparam) -//zz { -//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) ); -//zz } +PRE(sys_sched_setparam) +{ + PRINT("sched_setparam ( %d, %p )", ARG1, ARG2 ); + PRE_REG_READ2(long, "sched_setparam", + vki_pid_t, pid, struct sched_param *, p); + PRE_MEM_READ( "sched_setparam(p)", ARG2, sizeof(struct vki_sched_param) ); +} +POST(sys_sched_setparam) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_sched_param) ); +} PRE(sys_sched_getparam) { @@ -4817,11 +4828,11 @@ PRE(sys_setgid16) PRE_REG_READ1(long, "setgid16", vki_old_gid_t, gid); } -//zz PRE(sys_setgid, 0) -//zz { -//zz PRINT("sys_setgid ( %d )", ARG1); -//zz PRE_REG_READ1(long, "setgid", vki_gid_t, gid); -//zz } +PRE(sys_setgid) +{ + PRINT("sys_setgid ( %d )", ARG1); + PRE_REG_READ1(long, "setgid", vki_gid_t, gid); +} PRE(sys_setsid) { @@ -4837,13 +4848,13 @@ PRE(sys_setgroups16) 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); -//zz PRE_REG_READ2(long, "setgroups", int, size, vki_gid_t *, list); -//zz if (ARG1 > 0) -//zz PRE_MEM_READ( "setgroups(list)", ARG2, ARG1 * sizeof(vki_gid_t) ); -//zz } +PRE(sys_setgroups) +{ + PRINT("setgroups ( %llu, %p )", (ULong)ARG1, ARG2); + PRE_REG_READ2(long, "setgroups", int, size, vki_gid_t *, list); + if (ARG1 > 0) + PRE_MEM_READ( "setgroups(list)", ARG2, ARG1 * sizeof(vki_gid_t) ); +} PRE(sys_setpgid) { @@ -4863,11 +4874,11 @@ PRE(sys_setreuid16) 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); -//zz PRE_REG_READ2(long, "setreuid", vki_uid_t, ruid, vki_uid_t, euid); -//zz } +PRE(sys_setreuid) +{ + PRINT("sys_setreuid ( 0x%x, 0x%x )", ARG1, ARG2); + PRE_REG_READ2(long, "setreuid", vki_uid_t, ruid, vki_uid_t, euid); +} PRE(sys_setrlimit) { @@ -4915,11 +4926,11 @@ PRE(sys_setuid16) PRE_REG_READ1(long, "setuid16", vki_old_uid_t, uid); } -//zz PRE(sys_setuid, 0) -//zz { -//zz PRINT("sys_setuid ( %d )", ARG1); -//zz PRE_REG_READ1(long, "setuid", vki_uid_t, uid); -//zz } +PRE(sys_setuid) +{ + PRINT("sys_setuid ( %d )", ARG1); + PRE_REG_READ1(long, "setuid", vki_uid_t, uid); +} PRE(sys_newstat) { @@ -4941,25 +4952,23 @@ PRE(sys_statfs) 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); -//zz PRE_REG_READ3(long, "statfs64", -//zz const char *, path, vki_size_t, size, struct statfs64 *, buf); -//zz PRE_MEM_RASCIIZ( "statfs64(path)", ARG1 ); -//zz PRE_MEM_WRITE( "statfs64(buf)", ARG3, ARG2 ); -//zz } -//zz -//zz POST(sys_statfs64) -//zz { -//zz POST_MEM_WRITE( ARG3, ARG2 ); -//zz } +PRE(sys_statfs64) +{ + PRINT("sys_statfs64 ( %p, %llu, %p )",ARG1,(ULong)ARG2,ARG3); + PRE_REG_READ3(long, "statfs64", + const char *, path, vki_size_t, size, struct statfs64 *, buf); + PRE_MEM_RASCIIZ( "statfs64(path)", ARG1 ); + PRE_MEM_WRITE( "statfs64(buf)", ARG3, ARG2 ); +} +POST(sys_statfs64) +{ + POST_MEM_WRITE( ARG3, ARG2 ); +} PRE(sys_symlink) { @@ -5102,35 +5111,34 @@ PRE(sys_writev) } } -//zz PRE(sys_utimes, 0) -//zz { -//zz PRINT("sys_utimes ( %p, %p )", ARG1,ARG2); -//zz PRE_REG_READ2(long, "utimes", char *, filename, struct timeval *, tvp); -//zz PRE_MEM_RASCIIZ( "utimes(filename)", ARG1 ); -//zz if (ARG2 != 0) -//zz PRE_MEM_READ( "utimes(tvp)", ARG2, sizeof(struct vki_timeval) ); -//zz } -//zz -//zz PRE(sys_sched_setaffinity, 0) -//zz { -//zz PRINT("sched_setaffinity ( %d, %d, %p )", ARG1, ARG2, ARG3); -//zz PRE_REG_READ3(long, "sched_setaffinity", -//zz vki_pid_t, pid, unsigned int, len, unsigned long *, mask); -//zz PRE_MEM_READ( "sched_setaffinity(mask)", ARG3, ARG2); -//zz } -//zz -//zz PRE(sys_sched_getaffinity, 0) -//zz { -//zz PRINT("sched_getaffinity ( %d, %d, %p )", ARG1, ARG2, ARG3); -//zz PRE_REG_READ3(long, "sched_getaffinity", -//zz vki_pid_t, pid, unsigned int, len, unsigned long *, mask); -//zz PRE_MEM_WRITE( "sched_getaffinity(mask)", ARG3, ARG2); -//zz } -//zz -//zz POST(sys_sched_getaffinity) -//zz { -//zz POST_MEM_WRITE(ARG3, ARG2); -//zz } +PRE(sys_utimes) +{ + PRINT("sys_utimes ( %p, %p )", ARG1,ARG2); + PRE_REG_READ2(long, "utimes", char *, filename, struct timeval *, tvp); + PRE_MEM_RASCIIZ( "utimes(filename)", ARG1 ); + if (ARG2 != 0) + PRE_MEM_READ( "utimes(tvp)", ARG2, sizeof(struct vki_timeval) ); +} + +PRE(sys_sched_setaffinity) +{ + PRINT("sched_setaffinity ( %d, %d, %p )", ARG1, ARG2, ARG3); + PRE_REG_READ3(long, "sched_setaffinity", + vki_pid_t, pid, unsigned int, len, unsigned long *, mask); + PRE_MEM_READ( "sched_setaffinity(mask)", ARG3, ARG2); +} + +PRE(sys_sched_getaffinity) +{ + PRINT("sched_getaffinity ( %d, %d, %p )", ARG1, ARG2, ARG3); + PRE_REG_READ3(long, "sched_getaffinity", + vki_pid_t, pid, unsigned int, len, unsigned long *, mask); + PRE_MEM_WRITE( "sched_getaffinity(mask)", ARG3, ARG2); +} +POST(sys_sched_getaffinity) +{ + POST_MEM_WRITE(ARG3, ARG2); +} PRE(sys_acct) { @@ -5203,25 +5211,19 @@ POST(sys_rt_sigtimedwait) POST_MEM_WRITE( ARG2, sizeof(vki_siginfo_t) ); } -//zz PRE(sys_rt_sigqueueinfo, 0) -//zz { -//zz PRINT("sys_rt_sigqueueinfo(%d, %d, %p)", ARG1, ARG2, ARG3); -//zz PRE_REG_READ3(long, "rt_sigqueueinfo", -//zz int, pid, int, sig, vki_siginfo_t *, uinfo); -//zz if (ARG2 != 0) -//zz PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", ARG3, sizeof(vki_siginfo_t) ); -//zz } -//zz -//zz POST(sys_rt_sigqueueinfo) -//zz { -//zz PRINT("sys_rt_sigqueueinfo(%d, %d, %p)", ARG1, ARG2, ARG3); -//zz PRE_REG_READ3(long, "rt_sigqueueinfo", -//zz int, pid, int, sig, vki_siginfo_t *, uinfo); -//zz if (ARG2 != 0) -//zz PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", ARG3, sizeof(vki_siginfo_t) ); -//zz if (!VG_(client_signal_OK)(ARG2)) -//zz SET_STATUS_( -VKI_EINVAL ); -//zz } +PRE(sys_rt_sigqueueinfo) +{ + PRINT("sys_rt_sigqueueinfo(%d, %d, %p)", ARG1, ARG2, ARG3); + PRE_REG_READ3(long, "rt_sigqueueinfo", + int, pid, int, sig, vki_siginfo_t *, uinfo); + if (ARG2 != 0) + PRE_MEM_READ( "rt_sigqueueinfo(uinfo)", ARG3, sizeof(vki_siginfo_t) ); +} +POST(sys_rt_sigqueueinfo) +{ + if (!VG_(client_signal_OK)(ARG2)) + SET_STATUS_Failure( VKI_EINVAL ); +} // XXX: x86-specific PRE(sys_sigaltstack) @@ -5242,7 +5244,6 @@ PRE(sys_sigaltstack) (vki_stack_t*)ARG2) ); } - POST(sys_sigaltstack) { vg_assert(SUCCESS); @@ -5272,7 +5273,6 @@ PRE(sys_rt_sigaction) (struct vki_sigaction *)ARG3) ); } - POST(sys_rt_sigaction) { vg_assert(SUCCESS); @@ -5375,18 +5375,17 @@ 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 ); -//zz PRE_REG_READ2(long, "rt_sigpending", -//zz vki_sigset_t *, set, vki_size_t, sigsetsize); -//zz PRE_MEM_WRITE( "rt_sigpending(set)", ARG1, sizeof(vki_sigset_t)); -//zz } -//zz -//zz POST(sys_rt_sigpending) -//zz { -//zz POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ; -//zz } +PRE(sys_rt_sigpending) +{ + PRINT( "sys_rt_sigpending ( %p )", ARG1 ); + PRE_REG_READ2(long, "rt_sigpending", + vki_sigset_t *, set, vki_size_t, sigsetsize); + PRE_MEM_WRITE( "rt_sigpending(set)", ARG1, sizeof(vki_sigset_t)); +} +POST(sys_rt_sigpending) +{ + POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ; +} PRE(sys_mq_open) { @@ -5509,75 +5508,72 @@ POST(sys_mq_getsetattr) POST_MEM_WRITE( ARG3, sizeof(struct vki_mq_attr) ); } -//zz PRE(sys_timer_create, 0) -//zz { -//zz PRINT("sys_timer_create( %d, %p, %p )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "timer_create", -//zz vki_clockid_t, clockid, struct sigevent *, evp, -//zz vki_timer_t *, timerid); -//zz if (ARG2 != 0) -//zz PRE_MEM_READ( "timer_create(evp)", ARG2, sizeof(struct vki_sigevent) ); -//zz PRE_MEM_WRITE( "timer_create(timerid)", ARG3, sizeof(vki_timer_t) ); -//zz } -//zz -//zz POST(sys_timer_create) -//zz { -//zz POST_MEM_WRITE( ARG3, sizeof(vki_timer_t) ); -//zz } -//zz -//zz PRE(sys_timer_settime, 0) -//zz { -//zz PRINT("sys_timer_settime( %lld, %d, %p, %p )", (ULong)ARG1,ARG2,ARG3,ARG4); -//zz PRE_REG_READ4(long, "timer_settime", -//zz vki_timer_t, timerid, int, flags, -//zz const struct itimerspec *, value, -//zz struct itimerspec *, ovalue); -//zz PRE_MEM_READ( "timer_settime(value)", ARG3, -//zz sizeof(struct vki_itimerspec) ); -//zz if (ARG4 != 0) -//zz PRE_MEM_WRITE( "timer_settime(ovalue)", ARG4, -//zz sizeof(struct vki_itimerspec) ); -//zz } -//zz -//zz POST(sys_timer_settime) -//zz { -//zz if (ARG4 != 0) -//zz POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec) ); -//zz } -//zz -//zz PRE(sys_timer_gettime, 0) -//zz { -//zz PRINT("sys_timer_gettime( %lld, %p )", (ULong)ARG1,ARG2); -//zz PRE_REG_READ2(long, "timer_gettime", -//zz vki_timer_t, timerid, struct itimerspec *, value); -//zz PRE_MEM_WRITE( "timer_gettime(value)", ARG2, -//zz sizeof(struct vki_itimerspec)); -//zz } -//zz -//zz POST(sys_timer_gettime) -//zz { -//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec) ); -//zz } -//zz -//zz PRE(sys_timer_getoverrun, 0) -//zz { -//zz PRINT("sys_timer_getoverrun( %p )", ARG1); -//zz PRE_REG_READ1(long, "timer_getoverrun", vki_timer_t, timerid); -//zz } -//zz -//zz PRE(sys_timer_delete, 0) -//zz { -//zz PRINT("sys_timer_delete( %p )", ARG1); -//zz PRE_REG_READ1(long, "timer_delete", vki_timer_t, timerid); -//zz } -//zz -//zz PRE(sys_clock_settime, 0) -//zz { -//zz PRINT("sys_clock_settime( %d, %p )", ARG1,ARG2); -//zz PRE_REG_READ2(long, "clock_settime", -//zz vki_clockid_t, clk_id, const struct timespec *, tp); -//zz PRE_MEM_READ( "clock_settime(tp)", ARG2, sizeof(struct vki_timespec) ); -//zz } +PRE(sys_timer_create) +{ + PRINT("sys_timer_create( %d, %p, %p )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "timer_create", + vki_clockid_t, clockid, struct sigevent *, evp, + vki_timer_t *, timerid); + if (ARG2 != 0) + PRE_MEM_READ( "timer_create(evp)", ARG2, sizeof(struct vki_sigevent) ); + PRE_MEM_WRITE( "timer_create(timerid)", ARG3, sizeof(vki_timer_t) ); +} +POST(sys_timer_create) +{ + POST_MEM_WRITE( ARG3, sizeof(vki_timer_t) ); +} + +PRE(sys_timer_settime) +{ + PRINT("sys_timer_settime( %lld, %d, %p, %p )", (ULong)ARG1,ARG2,ARG3,ARG4); + PRE_REG_READ4(long, "timer_settime", + vki_timer_t, timerid, int, flags, + const struct itimerspec *, value, + struct itimerspec *, ovalue); + PRE_MEM_READ( "timer_settime(value)", ARG3, + sizeof(struct vki_itimerspec) ); + if (ARG4 != 0) + PRE_MEM_WRITE( "timer_settime(ovalue)", ARG4, + sizeof(struct vki_itimerspec) ); +} +POST(sys_timer_settime) +{ + if (ARG4 != 0) + POST_MEM_WRITE( ARG4, sizeof(struct vki_itimerspec) ); +} + +PRE(sys_timer_gettime) +{ + PRINT("sys_timer_gettime( %lld, %p )", (ULong)ARG1,ARG2); + PRE_REG_READ2(long, "timer_gettime", + vki_timer_t, timerid, struct itimerspec *, value); + PRE_MEM_WRITE( "timer_gettime(value)", ARG2, + sizeof(struct vki_itimerspec)); +} +POST(sys_timer_gettime) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_itimerspec) ); +} + +PRE(sys_timer_getoverrun) +{ + PRINT("sys_timer_getoverrun( %p )", ARG1); + PRE_REG_READ1(long, "timer_getoverrun", vki_timer_t, timerid); +} + +PRE(sys_timer_delete) +{ + PRINT("sys_timer_delete( %p )", ARG1); + PRE_REG_READ1(long, "timer_delete", vki_timer_t, timerid); +} + +PRE(sys_clock_settime) +{ + PRINT("sys_clock_settime( %d, %p )", ARG1,ARG2); + PRE_REG_READ2(long, "clock_settime", + vki_clockid_t, clk_id, const struct timespec *, tp); + PRE_MEM_READ( "clock_settime(tp)", ARG2, sizeof(struct vki_timespec) ); +} PRE(sys_clock_gettime) { @@ -5586,27 +5582,27 @@ PRE(sys_clock_gettime) vki_clockid_t, clk_id, struct timespec *, tp); PRE_MEM_WRITE( "clock_gettime(tp)", ARG2, sizeof(struct vki_timespec) ); } - POST(sys_clock_gettime) { POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) ); } -//zz PRE(sys_clock_getres, 0) -//zz { -//zz PRINT("sys_clock_getres( %d, %p )" , ARG1,ARG2); -//zz // Nb: we can't use "RES" as the param name because that's a macro -//zz // defined above! -//zz PRE_REG_READ2(long, "clock_getres", -//zz vki_clockid_t, clk_id, struct timespec *, res); -//zz PRE_MEM_WRITE( "clock_getres(res)", ARG2, sizeof(struct vki_timespec) ); -//zz } -//zz -//zz POST(sys_clock_getres) -//zz { -//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) ); -//zz } +PRE(sys_clock_getres) +{ + PRINT("sys_clock_getres( %d, %p )" , ARG1,ARG2); + // Nb: we can't use "RES" as the param name because that's a macro + // defined above! + PRE_REG_READ2(long, "clock_getres", + vki_clockid_t, clk_id, struct timespec *, res); + PRE_MEM_WRITE( "clock_getres(res)", ARG2, sizeof(struct vki_timespec) ); +} +POST(sys_clock_getres) +{ + POST_MEM_WRITE( ARG2, sizeof(struct vki_timespec) ); +} +#undef PRE +#undef POST /*--------------------------------------------------------------------*/ /*--- end syscalls-generic.c ---*/ diff --git a/coregrind/m_syscalls/syscalls-linux.c b/coregrind/m_syscalls/syscalls-linux.c index 2b8f726b15..713aef478f 100644 --- a/coregrind/m_syscalls/syscalls-linux.c +++ b/coregrind/m_syscalls/syscalls-linux.c @@ -169,11 +169,11 @@ PRE(sys_setfsuid16) 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 } +PRE(sys_setfsuid) +{ + PRINT("sys_setfsuid ( %d )", ARG1); + PRE_REG_READ1(long, "setfsuid", vki_uid_t, uid); +} PRE(sys_setfsgid16) { @@ -181,45 +181,45 @@ PRE(sys_setfsgid16) PRE_REG_READ1(long, "setfsgid16", vki_old_gid_t, gid); } -//zz PRE(sys_setfsgid, 0) -//zz { -//zz PRINT("sys_setfsgid ( %d )", ARG1); -//zz PRE_REG_READ1(long, "setfsgid", vki_gid_t, gid); -//zz } -//zz -//zz PRE(sys_setresuid16, 0) -//zz { -//zz PRINT("sys_setresuid16 ( %d, %d, %d )", ARG1, ARG2, ARG3); -//zz PRE_REG_READ3(long, "setresuid16", -//zz vki_old_uid_t, ruid, vki_old_uid_t, euid, vki_old_uid_t, suid); -//zz } -//zz -//zz PRE(sys_setresuid, 0) -//zz { -//zz PRINT("sys_setresuid ( %d, %d, %d )", ARG1, ARG2, ARG3); -//zz PRE_REG_READ3(long, "setresuid", -//zz vki_uid_t, ruid, vki_uid_t, euid, vki_uid_t, suid); -//zz } -//zz -//zz PRE(sys_getresuid16, 0) -//zz { -//zz PRINT("sys_getresuid16 ( %p, %p, %p )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "getresuid16", -//zz vki_old_uid_t *, ruid, vki_old_uid_t *, euid, -//zz vki_old_uid_t *, suid); -//zz PRE_MEM_WRITE( "getresuid16(ruid)", ARG1, sizeof(vki_old_uid_t) ); -//zz PRE_MEM_WRITE( "getresuid16(euid)", ARG2, sizeof(vki_old_uid_t) ); -//zz PRE_MEM_WRITE( "getresuid16(suid)", ARG3, sizeof(vki_old_uid_t) ); -//zz } -//zz -//zz POST(sys_getresuid16) -//zz { -//zz if (RES == 0) { -//zz POST_MEM_WRITE( ARG1, sizeof(vki_old_uid_t) ); -//zz POST_MEM_WRITE( ARG2, sizeof(vki_old_uid_t) ); -//zz POST_MEM_WRITE( ARG3, sizeof(vki_old_uid_t) ); -//zz } -//zz } +PRE(sys_setfsgid) +{ + PRINT("sys_setfsgid ( %d )", ARG1); + PRE_REG_READ1(long, "setfsgid", vki_gid_t, gid); +} + +PRE(sys_setresuid16) +{ + PRINT("sys_setresuid16 ( %d, %d, %d )", ARG1, ARG2, ARG3); + PRE_REG_READ3(long, "setresuid16", + vki_old_uid_t, ruid, vki_old_uid_t, euid, vki_old_uid_t, suid); +} + +PRE(sys_setresuid) +{ + PRINT("sys_setresuid ( %d, %d, %d )", ARG1, ARG2, ARG3); + PRE_REG_READ3(long, "setresuid", + vki_uid_t, ruid, vki_uid_t, euid, vki_uid_t, suid); +} + +PRE(sys_getresuid16) +{ + PRINT("sys_getresuid16 ( %p, %p, %p )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "getresuid16", + vki_old_uid_t *, ruid, vki_old_uid_t *, euid, + vki_old_uid_t *, suid); + PRE_MEM_WRITE( "getresuid16(ruid)", ARG1, sizeof(vki_old_uid_t) ); + PRE_MEM_WRITE( "getresuid16(euid)", ARG2, sizeof(vki_old_uid_t) ); + PRE_MEM_WRITE( "getresuid16(suid)", ARG3, sizeof(vki_old_uid_t) ); +} +POST(sys_getresuid16) +{ + vg_assert(SUCCESS); + if (RES == 0) { + POST_MEM_WRITE( ARG1, sizeof(vki_old_uid_t) ); + POST_MEM_WRITE( ARG2, sizeof(vki_old_uid_t) ); + POST_MEM_WRITE( ARG3, sizeof(vki_old_uid_t) ); + } +} PRE(sys_getresuid) { @@ -230,7 +230,6 @@ PRE(sys_getresuid) PRE_MEM_WRITE( "getresuid(euid)", ARG2, sizeof(vki_uid_t) ); PRE_MEM_WRITE( "getresuid(suid)", ARG3, sizeof(vki_uid_t) ); } - POST(sys_getresuid) { vg_assert(SUCCESS); @@ -241,39 +240,40 @@ POST(sys_getresuid) } } -//zz PRE(sys_setresgid16, 0) -//zz { -//zz PRINT("sys_setresgid16 ( %d, %d, %d )", ARG1, ARG2, ARG3); -//zz PRE_REG_READ3(long, "setresgid16", -//zz vki_old_gid_t, rgid, vki_old_gid_t, egid, vki_old_gid_t, sgid); -//zz } -//zz -//zz PRE(sys_setresgid, 0) -//zz { -//zz PRINT("sys_setresgid ( %d, %d, %d )", ARG1, ARG2, ARG3); -//zz PRE_REG_READ3(long, "setresgid", -//zz vki_gid_t, rgid, vki_gid_t, egid, vki_gid_t, sgid); -//zz } -//zz -//zz PRE(sys_getresgid16, 0) -//zz { -//zz PRINT("sys_getresgid16 ( %p, %p, %p )", ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "getresgid16", -//zz vki_old_gid_t *, rgid, vki_old_gid_t *, egid, -//zz vki_old_gid_t *, sgid); -//zz PRE_MEM_WRITE( "getresgid16(rgid)", ARG1, sizeof(vki_old_gid_t) ); -//zz PRE_MEM_WRITE( "getresgid16(egid)", ARG2, sizeof(vki_old_gid_t) ); -//zz PRE_MEM_WRITE( "getresgid16(sgid)", ARG3, sizeof(vki_old_gid_t) ); -//zz } -//zz -//zz POST(sys_getresgid16) -//zz { -//zz if (RES == 0) { -//zz POST_MEM_WRITE( ARG1, sizeof(vki_old_gid_t) ); -//zz POST_MEM_WRITE( ARG2, sizeof(vki_old_gid_t) ); -//zz POST_MEM_WRITE( ARG3, sizeof(vki_old_gid_t) ); -//zz } -//zz } +PRE(sys_setresgid16) +{ + PRINT("sys_setresgid16 ( %d, %d, %d )", ARG1, ARG2, ARG3); + PRE_REG_READ3(long, "setresgid16", + vki_old_gid_t, rgid, + vki_old_gid_t, egid, vki_old_gid_t, sgid); +} + +PRE(sys_setresgid) +{ + PRINT("sys_setresgid ( %d, %d, %d )", ARG1, ARG2, ARG3); + PRE_REG_READ3(long, "setresgid", + vki_gid_t, rgid, vki_gid_t, egid, vki_gid_t, sgid); +} + +PRE(sys_getresgid16) +{ + PRINT("sys_getresgid16 ( %p, %p, %p )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "getresgid16", + vki_old_gid_t *, rgid, vki_old_gid_t *, egid, + vki_old_gid_t *, sgid); + PRE_MEM_WRITE( "getresgid16(rgid)", ARG1, sizeof(vki_old_gid_t) ); + PRE_MEM_WRITE( "getresgid16(egid)", ARG2, sizeof(vki_old_gid_t) ); + PRE_MEM_WRITE( "getresgid16(sgid)", ARG3, sizeof(vki_old_gid_t) ); +} +POST(sys_getresgid16) +{ + vg_assert(SUCCESS); + if (RES == 0) { + POST_MEM_WRITE( ARG1, sizeof(vki_old_gid_t) ); + POST_MEM_WRITE( ARG2, sizeof(vki_old_gid_t) ); + POST_MEM_WRITE( ARG3, sizeof(vki_old_gid_t) ); + } +} PRE(sys_getresgid) { @@ -355,78 +355,81 @@ PRE(sys_personality) PRE(sys_sysctl) { - struct __vki_sysctl_args *argz; + struct __vki_sysctl_args *args; PRINT("sys_sysctl ( %p )", ARG1 ); - argz = (struct __vki_sysctl_args *)ARG1; - PRE_REG_READ1(long, "sysctl", struct __sysctl_args *, argz); + args = (struct __vki_sysctl_args *)ARG1; + PRE_REG_READ1(long, "sysctl", struct __sysctl_args *, args); PRE_MEM_WRITE( "sysctl(args)", ARG1, sizeof(struct __vki_sysctl_args) ); if (!VG_(is_addressable)(ARG1, sizeof(struct __vki_sysctl_args), VKI_PROT_READ)) { SET_STATUS_Failure( VKI_EFAULT ); return; } - PRE_MEM_READ("sysctl(name)", (Addr)argz->name, argz->nlen * sizeof(*argz->name)); - if (argz->newval != NULL) - PRE_MEM_READ("sysctl(newval)", (Addr)argz->newval, argz->newlen); - if (argz->oldlenp != NULL) { - PRE_MEM_READ("sysctl(oldlenp)", (Addr)argz->oldlenp, sizeof(*argz->oldlenp)); - PRE_MEM_WRITE("sysctl(oldval)", (Addr)argz->oldval, *argz->oldlenp); + PRE_MEM_READ("sysctl(name)", (Addr)args->name, args->nlen * sizeof(*args->name)); + if (args->newval != NULL) + PRE_MEM_READ("sysctl(newval)", (Addr)args->newval, args->newlen); + if (args->oldlenp != NULL) { + PRE_MEM_READ("sysctl(oldlenp)", (Addr)args->oldlenp, sizeof(*args->oldlenp)); + PRE_MEM_WRITE("sysctl(oldval)", (Addr)args->oldval, *args->oldlenp); } } POST(sys_sysctl) { - struct __vki_sysctl_args *argz; - argz = (struct __vki_sysctl_args *)ARG1; - if (argz->oldlenp != NULL) { - POST_MEM_WRITE((Addr)argz->oldlenp, sizeof(*argz->oldlenp)); - POST_MEM_WRITE((Addr)argz->oldval, 1 + *argz->oldlenp); + struct __vki_sysctl_args *args; + args = (struct __vki_sysctl_args *)ARG1; + if (args->oldlenp != NULL) { + POST_MEM_WRITE((Addr)args->oldlenp, sizeof(*args->oldlenp)); + POST_MEM_WRITE((Addr)args->oldval, 1 + *args->oldlenp); } } -//zz PRE(sys_prctl, MayBlock) -//zz { -//zz PRINT( "prctl ( %d, %d, %d, %d, %d )", ARG1, ARG2, ARG3, ARG4, ARG5 ); -//zz // XXX: too simplistic, often not all args are used -//zz // Nb: can't use "ARG2".."ARG5" here because that's our own macro... -//zz PRE_REG_READ5(long, "prctl", -//zz int, option, unsigned long, arg2, unsigned long, arg3, -//zz unsigned long, arg4, unsigned long, arg5); -//zz // XXX: totally wrong... we need to look at the 'option' arg, and do -//zz // PRE_MEM_READs/PRE_MEM_WRITEs as necessary... -//zz } -//zz -//zz PRE(sys_sendfile, MayBlock) -//zz { -//zz PRINT("sys_sendfile ( %d, %d, %p, %llu )", ARG1,ARG2,ARG3,(ULong)ARG4); -//zz PRE_REG_READ4(ssize_t, "sendfile", -//zz int, out_fd, int, in_fd, vki_off_t *, offset, -//zz vki_size_t, count); -//zz if (ARG3 != 0) -//zz PRE_MEM_WRITE( "sendfile(offset)", ARG3, sizeof(vki_off_t) ); -//zz } -//zz -//zz POST(sys_sendfile) -//zz { -//zz POST_MEM_WRITE( ARG3, sizeof( vki_off_t ) ); -//zz } -//zz -//zz PRE(sys_sendfile64, MayBlock) -//zz { -//zz PRINT("sendfile64 ( %d, %d, %p, %llu )",ARG1,ARG2,ARG3,(ULong)ARG4); -//zz PRE_REG_READ4(ssize_t, "sendfile64", -//zz int, out_fd, int, in_fd, vki_loff_t *, offset, -//zz vki_size_t, count); -//zz if (ARG3 != 0) -//zz PRE_MEM_WRITE( "sendfile64(offset)", ARG3, sizeof(vki_loff_t) ); -//zz } -//zz -//zz POST(sys_sendfile64) -//zz { -//zz if (ARG3 != 0 ) { -//zz POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) ); -//zz } -//zz } +PRE(sys_prctl) +{ + *flags |= SfMayBlock; + PRINT( "prctl ( %d, %d, %d, %d, %d )", ARG1, ARG2, ARG3, ARG4, ARG5 ); + // XXX: too simplistic, often not all args are used + // Nb: can't use "ARG2".."ARG5" here because that's our own macro... + PRE_REG_READ5(long, "prctl", + int, option, unsigned long, arg2, unsigned long, arg3, + unsigned long, arg4, unsigned long, arg5); + // XXX: totally wrong... we need to look at the 'option' arg, and do + // PRE_MEM_READs/PRE_MEM_WRITEs as necessary... +} + +PRE(sys_sendfile) +{ + *flags |= SfMayBlock; + PRINT("sys_sendfile ( %d, %d, %p, %llu )", ARG1,ARG2,ARG3,(ULong)ARG4); + PRE_REG_READ4(ssize_t, "sendfile", + int, out_fd, int, in_fd, vki_off_t *, offset, + vki_size_t, count); + if (ARG3 != 0) + PRE_MEM_WRITE( "sendfile(offset)", ARG3, sizeof(vki_off_t) ); +} +POST(sys_sendfile) +{ + if (ARG3 != 0 ) { + POST_MEM_WRITE( ARG3, sizeof( vki_off_t ) ); + } +} + +PRE(sys_sendfile64) +{ + *flags |= SfMayBlock; + PRINT("sendfile64 ( %d, %d, %p, %llu )",ARG1,ARG2,ARG3,(ULong)ARG4); + PRE_REG_READ4(ssize_t, "sendfile64", + int, out_fd, int, in_fd, vki_loff_t *, offset, + vki_size_t, count); + if (ARG3 != 0) + PRE_MEM_WRITE( "sendfile64(offset)", ARG3, sizeof(vki_loff_t) ); +} +POST(sys_sendfile64) +{ + if (ARG3 != 0 ) { + POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) ); + } +} PRE(sys_futex) { @@ -486,51 +489,52 @@ POST(sys_futex) } } -//zz PRE(sys_epoll_create, 0) -//zz { -//zz PRINT("sys_epoll_create ( %d )", ARG1); -//zz PRE_REG_READ1(long, "epoll_create", int, size); -//zz } -//zz -//zz POST(sys_epoll_create) -//zz { -//zz if (!VG_(fd_allowed)(RES, "epoll_create", 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, NULL); -//zz } -//zz } -//zz -//zz PRE(sys_epoll_ctl, 0) -//zz { -//zz static const char* epoll_ctl_s[3] = { -//zz "EPOLL_CTL_ADD", -//zz "EPOLL_CTL_DEL", -//zz "EPOLL_CTL_MOD" -//zz }; -//zz PRINT("sys_epoll_ctl ( %d, %s, %d, %p )", -//zz ARG1, ( ARG2<3 ? epoll_ctl_s[ARG2] : "?" ), ARG3, ARG4); -//zz PRE_REG_READ4(long, "epoll_ctl", -//zz int, epfd, int, op, int, fd, struct epoll_event *, event); -//zz PRE_MEM_READ( "epoll_ctl(event)", ARG4, sizeof(struct epoll_event) ); -//zz } -//zz -//zz PRE(sys_epoll_wait, MayBlock) -//zz { -//zz PRINT("sys_epoll_wait ( %d, %p, %d, %d )", ARG1, ARG2, ARG3, ARG4); -//zz PRE_REG_READ4(long, "epoll_wait", -//zz int, epfd, struct epoll_event *, events, -//zz int, maxevents, int, timeout); -//zz PRE_MEM_WRITE( "epoll_wait(events)", ARG2, sizeof(struct epoll_event)*ARG3); -//zz } -//zz -//zz POST(sys_epoll_wait) -//zz { -//zz if (RES > 0) -//zz POST_MEM_WRITE( ARG2, sizeof(struct epoll_event)*RES ) ; -//zz } +PRE(sys_epoll_create) +{ + PRINT("sys_epoll_create ( %d )", ARG1); + PRE_REG_READ1(long, "epoll_create", int, size); +} +POST(sys_epoll_create) +{ + vg_assert(SUCCESS); + if (!VG_(fd_allowed)(RES, "epoll_create", tid, True)) { + VG_(close)(RES); + SET_STATUS_Failure( VKI_EMFILE ); + } else { + if (VG_(clo_track_fds)) + VG_(record_fd_open) (tid, RES, NULL); + } +} + +PRE(sys_epoll_ctl) +{ + static const HChar* epoll_ctl_s[3] = { + "EPOLL_CTL_ADD", + "EPOLL_CTL_DEL", + "EPOLL_CTL_MOD" + }; + PRINT("sys_epoll_ctl ( %d, %s, %d, %p )", + ARG1, ( ARG2<3 ? epoll_ctl_s[ARG2] : "?" ), ARG3, ARG4); + PRE_REG_READ4(long, "epoll_ctl", + int, epfd, int, op, int, fd, struct epoll_event *, event); + PRE_MEM_READ( "epoll_ctl(event)", ARG4, sizeof(struct epoll_event) ); +} + +PRE(sys_epoll_wait) +{ + *flags |= SfMayBlock; + PRINT("sys_epoll_wait ( %d, %p, %d, %d )", ARG1, ARG2, ARG3, ARG4); + PRE_REG_READ4(long, "epoll_wait", + int, epfd, struct epoll_event *, events, + int, maxevents, int, timeout); + PRE_MEM_WRITE( "epoll_wait(events)", ARG2, sizeof(struct epoll_event)*ARG3); +} +POST(sys_epoll_wait) +{ + vg_assert(SUCCESS); + if (RES > 0) + POST_MEM_WRITE( ARG2, sizeof(struct epoll_event)*RES ) ; +} PRE(sys_gettid) { @@ -606,171 +610,173 @@ POST(sys_tgkill) //zz PRE_REG_READ4(long, "fadvise64_64", //zz int, fd, vki_loff_t, offset, vki_loff_t, len, int, advice) //zz } -//zz -//zz // Nb: this wrapper is "Special" because we have to pad/unpad memory around -//zz // the syscall itself, and this allows us to control exactly the code that -//zz // gets run while the padding is in place. -//zz PRE(sys_io_setup, Special) -//zz { -//zz SizeT size; -//zz Addr addr; -//zz -//zz PRINT("sys_io_setup ( %u, %p )", ARG1,ARG2); -//zz PRE_REG_READ2(long, "io_setup", -//zz unsigned, nr_events, vki_aio_context_t *, ctxp); -//zz PRE_MEM_WRITE( "io_setup(ctxp)", ARG2, sizeof(vki_aio_context_t) ); -//zz -//zz size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) + -//zz ARG1*sizeof(struct vki_io_event)); -//zz addr = VG_(find_map_space)(0, size, True); -//zz -//zz if (addr == 0) { -//zz SET_STATUS_( -VKI_ENOMEM ); -//zz return; -//zz } -//zz -//zz VG_(map_segment)(addr, size, VKI_PROT_READ|VKI_PROT_WRITE, SF_FIXED); -//zz -//zz VG_(pad_address_space)(0); -//zz SET_STATUS_( VG_(do_syscall2)(SYSNO, ARG1, ARG2) ); -//zz VG_(unpad_address_space)(0); -//zz -//zz if (RES == 0) { -//zz struct vki_aio_ring *r = *(struct vki_aio_ring **)ARG2; -//zz -//zz vg_assert(addr == (Addr)r); -//zz vg_assert(VG_(valid_client_addr)(addr, size, tid, "io_setup")); -//zz -//zz VG_TRACK( new_mem_mmap, addr, size, True, True, False ); -//zz POST_MEM_WRITE( ARG2, sizeof(vki_aio_context_t) ); -//zz } -//zz else { -//zz VG_(unmap_range)(addr, size); -//zz } -//zz } -//zz -//zz // Nb: This wrapper is "Special" because we need 'size' to do the unmap -//zz // after the syscall. We must get 'size' from the aio_ring structure, -//zz // before the syscall, while the aio_ring structure still exists. (And we -//zz // know that we must look at the aio_ring structure because Tom inspected the -//zz // kernel and glibc sources to see what they do, yuk.) -//zz // -//zz // XXX This segment can be implicitly unmapped when aio -//zz // file-descriptors are closed... -//zz PRE(sys_io_destroy, Special) -//zz { -//zz Segment *s = VG_(find_segment)(ARG1); -//zz struct vki_aio_ring *r; -//zz SizeT size; -//zz -//zz PRINT("sys_io_destroy ( %llu )", (ULong)ARG1); -//zz PRE_REG_READ1(long, "io_destroy", vki_aio_context_t, ctx); -//zz -//zz // If we are going to seg fault (due to a bogus ARG1) do it as late as -//zz // possible... -//zz r = *(struct vki_aio_ring **)ARG1; -//zz size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) + -//zz r->nr*sizeof(struct vki_io_event)); -//zz -//zz SET_STATUS_( VG_(do_syscall1)(SYSNO, ARG1) ); -//zz -//zz if (RES == 0 && s != NULL) { -//zz VG_TRACK( die_mem_munmap, ARG1, size ); -//zz VG_(unmap_range)(ARG1, size); -//zz } -//zz } -//zz -//zz PRE(sys_io_getevents, MayBlock) -//zz { -//zz PRINT("sys_io_getevents ( %llu, %lld, %lld, %p, %p )", -//zz (ULong)ARG1,(Long)ARG2,(Long)ARG3,ARG4,ARG5); -//zz PRE_REG_READ5(long, "io_getevents", -//zz vki_aio_context_t, ctx_id, long, min_nr, long, nr, -//zz struct io_event *, events, -//zz struct timespec *, timeout); -//zz if (ARG3 > 0) -//zz PRE_MEM_WRITE( "io_getevents(events)", -//zz ARG4, sizeof(struct vki_io_event)*ARG3 ); -//zz if (ARG5 != 0) -//zz PRE_MEM_READ( "io_getevents(timeout)", -//zz ARG5, sizeof(struct vki_timespec)); -//zz } -//zz -//zz POST(sys_io_getevents) -//zz { -//zz int i; -//zz -//zz if (RES > 0) { -//zz POST_MEM_WRITE( ARG4, sizeof(struct vki_io_event)*RES ); -//zz for (i = 0; i < RES; i++) { -//zz const struct vki_io_event *vev = ((struct vki_io_event *)ARG4) + i; -//zz const struct vki_iocb *cb = (struct vki_iocb *)(Addr)vev->obj; -//zz -//zz switch (cb->aio_lio_opcode) { -//zz case VKI_IOCB_CMD_PREAD: -//zz if (vev->result > 0) -//zz POST_MEM_WRITE( cb->aio_buf, vev->result ); -//zz break; -//zz -//zz case VKI_IOCB_CMD_PWRITE: -//zz break; -//zz -//zz default: -//zz VG_(message)(Vg_DebugMsg,"Warning: unhandled io_getevents opcode: %u\n",cb->aio_lio_opcode); -//zz break; -//zz } -//zz } -//zz } -//zz } -//zz -//zz PRE(sys_io_submit, 0) -//zz { -//zz int i; -//zz -//zz PRINT("sys_io_submit( %llu, %lld, %p )", (ULong)ARG1,(Long)ARG2,ARG3); -//zz PRE_REG_READ3(long, "io_submit", -//zz vki_aio_context_t, ctx_id, long, nr, -//zz struct iocb **, iocbpp); -//zz PRE_MEM_READ( "io_submit(iocbpp)", ARG3, ARG2*sizeof(struct vki_iocb *) ); -//zz if (ARG3 != 0) { -//zz for (i = 0; i < ARG2; i++) { -//zz struct vki_iocb *cb = ((struct vki_iocb **)ARG3)[i]; -//zz PRE_MEM_READ( "io_submit(iocb)", (Addr)cb, sizeof(struct vki_iocb) ); -//zz switch (cb->aio_lio_opcode) { -//zz case VKI_IOCB_CMD_PREAD: -//zz PRE_MEM_WRITE( "io_submit(PREAD)", cb->aio_buf, cb->aio_nbytes ); -//zz break; -//zz -//zz case VKI_IOCB_CMD_PWRITE: -//zz PRE_MEM_READ( "io_submit(PWRITE)", cb->aio_buf, cb->aio_nbytes ); -//zz break; -//zz -//zz default: -//zz VG_(message)(Vg_DebugMsg,"Warning: unhandled io_submit opcode: %u\n", -//zz cb->aio_lio_opcode); -//zz break; -//zz } -//zz } -//zz } -//zz } -//zz -//zz PRE(sys_io_cancel, 0) -//zz { -//zz PRINT("sys_io_cancel( %llu, %p, %p )", (ULong)ARG1,ARG2,ARG3); -//zz PRE_REG_READ3(long, "io_cancel", -//zz vki_aio_context_t, ctx_id, struct iocb *, iocb, -//zz struct io_event *, result); -//zz PRE_MEM_READ( "io_cancel(iocb)", ARG2, sizeof(struct vki_iocb) ); -//zz PRE_MEM_WRITE( "io_cancel(result)", ARG3, sizeof(struct vki_io_event) ); -//zz } -//zz -//zz POST(sys_io_cancel) -//zz { -//zz POST_MEM_WRITE( ARG3, sizeof(struct vki_io_event) ); -//zz } -//zz -//zz #undef PRE -//zz #undef POST + +// Nb: this wrapper has to pad/unpad memory around the syscall itself, +// and this allows us to control exactly the code that gets run while +// the padding is in place. +PRE(sys_io_setup) +{ + SizeT size; + Addr addr; + + PRINT("sys_io_setup ( %u, %p )", ARG1,ARG2); + PRE_REG_READ2(long, "io_setup", + unsigned, nr_events, vki_aio_context_t *, ctxp); + PRE_MEM_WRITE( "io_setup(ctxp)", ARG2, sizeof(vki_aio_context_t) ); + + size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) + + ARG1*sizeof(struct vki_io_event)); + addr = VG_(find_map_space)(0, size, True); + + if (addr == 0) { + SET_STATUS_Failure( VKI_ENOMEM ); + return; + } + + VG_(map_segment)(addr, size, VKI_PROT_READ|VKI_PROT_WRITE, SF_FIXED); + + VG_(pad_address_space)(0); + SET_STATUS_from_SysRes( VG_(do_syscall2)(SYSNO, ARG1, ARG2) ); + VG_(unpad_address_space)(0); + + if (SUCCESS && RES == 0) { + struct vki_aio_ring *r = *(struct vki_aio_ring **)ARG2; + + vg_assert(addr == (Addr)r); + vg_assert(VG_(valid_client_addr)(addr, size, tid, "io_setup")); + + VG_TRACK( new_mem_mmap, addr, size, True, True, False ); + POST_MEM_WRITE( ARG2, sizeof(vki_aio_context_t) ); + } + else { + VG_(unmap_range)(addr, size); + } +} + +// Nb: This wrapper is "Special" because we need 'size' to do the unmap +// after the syscall. We must get 'size' from the aio_ring structure, +// before the syscall, while the aio_ring structure still exists. (And we +// know that we must look at the aio_ring structure because Tom inspected the +// kernel and glibc sources to see what they do, yuk.) +// +// XXX This segment can be implicitly unmapped when aio +// file-descriptors are closed... +PRE(sys_io_destroy) +{ + Segment *s = VG_(find_segment)(ARG1); + struct vki_aio_ring *r; + SizeT size; + + PRINT("sys_io_destroy ( %llu )", (ULong)ARG1); + PRE_REG_READ1(long, "io_destroy", vki_aio_context_t, ctx); + + // If we are going to seg fault (due to a bogus ARG1) do it as late as + // possible... + r = *(struct vki_aio_ring **)ARG1; + size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) + + r->nr*sizeof(struct vki_io_event)); + + SET_STATUS_from_SysRes( VG_(do_syscall1)(SYSNO, ARG1) ); + + if (SUCCESS && RES == 0 && s != NULL) { + VG_TRACK( die_mem_munmap, ARG1, size ); + VG_(unmap_range)(ARG1, size); + } +} + +PRE(sys_io_getevents) +{ + *flags |= SfMayBlock; + PRINT("sys_io_getevents ( %llu, %lld, %lld, %p, %p )", + (ULong)ARG1,(Long)ARG2,(Long)ARG3,ARG4,ARG5); + PRE_REG_READ5(long, "io_getevents", + vki_aio_context_t, ctx_id, long, min_nr, long, nr, + struct io_event *, events, + struct timespec *, timeout); + if (ARG3 > 0) + PRE_MEM_WRITE( "io_getevents(events)", + ARG4, sizeof(struct vki_io_event)*ARG3 ); + if (ARG5 != 0) + PRE_MEM_READ( "io_getevents(timeout)", + ARG5, sizeof(struct vki_timespec)); +} +POST(sys_io_getevents) +{ + Int i; + vg_assert(SUCCESS); + if (RES > 0) { + POST_MEM_WRITE( ARG4, sizeof(struct vki_io_event)*RES ); + for (i = 0; i < RES; i++) { + const struct vki_io_event *vev = ((struct vki_io_event *)ARG4) + i; + const struct vki_iocb *cb = (struct vki_iocb *)(Addr)vev->obj; + + switch (cb->aio_lio_opcode) { + case VKI_IOCB_CMD_PREAD: + if (vev->result > 0) + POST_MEM_WRITE( cb->aio_buf, vev->result ); + break; + + case VKI_IOCB_CMD_PWRITE: + break; + + default: + VG_(message)(Vg_DebugMsg, + "Warning: unhandled io_getevents opcode: %u\n", + cb->aio_lio_opcode); + break; + } + } + } +} + +PRE(sys_io_submit) +{ + Int i; + + PRINT("sys_io_submit( %llu, %lld, %p )", (ULong)ARG1,(Long)ARG2,ARG3); + PRE_REG_READ3(long, "io_submit", + vki_aio_context_t, ctx_id, long, nr, + struct iocb **, iocbpp); + PRE_MEM_READ( "io_submit(iocbpp)", ARG3, ARG2*sizeof(struct vki_iocb *) ); + if (ARG3 != 0) { + for (i = 0; i < ARG2; i++) { + struct vki_iocb *cb = ((struct vki_iocb **)ARG3)[i]; + PRE_MEM_READ( "io_submit(iocb)", (Addr)cb, sizeof(struct vki_iocb) ); + switch (cb->aio_lio_opcode) { + case VKI_IOCB_CMD_PREAD: + PRE_MEM_WRITE( "io_submit(PREAD)", cb->aio_buf, cb->aio_nbytes ); + break; + + case VKI_IOCB_CMD_PWRITE: + PRE_MEM_READ( "io_submit(PWRITE)", cb->aio_buf, cb->aio_nbytes ); + break; + + default: + VG_(message)(Vg_DebugMsg,"Warning: unhandled io_submit opcode: %u\n", + cb->aio_lio_opcode); + break; + } + } + } +} + +PRE(sys_io_cancel) +{ + PRINT("sys_io_cancel( %llu, %p, %p )", (ULong)ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "io_cancel", + vki_aio_context_t, ctx_id, struct iocb *, iocb, + struct io_event *, result); + PRE_MEM_READ( "io_cancel(iocb)", ARG2, sizeof(struct vki_iocb) ); + PRE_MEM_WRITE( "io_cancel(result)", ARG3, sizeof(struct vki_io_event) ); +} + +POST(sys_io_cancel) +{ + POST_MEM_WRITE( ARG3, sizeof(struct vki_io_event) ); +} + +#undef PRE +#undef POST /*--------------------------------------------------------------------*/ /*--- end ---*/ diff --git a/coregrind/m_syscalls/syscalls-x86-linux.c b/coregrind/m_syscalls/syscalls-x86-linux.c index a8f65d39d8..e851a9e1be 100644 --- a/coregrind/m_syscalls/syscalls-x86-linux.c +++ b/coregrind/m_syscalls/syscalls-x86-linux.c @@ -847,45 +847,45 @@ static SysRes sys_set_thread_area ( ThreadId tid, vki_modify_ldt_t* info ) } -//zz static Int sys_get_thread_area ( ThreadId tid, vki_modify_ldt_t* info ) -//zz { -//zz Int idx; -//zz VexGuestX86SegDescr* gdt; -//zz -//zz vg_assert(sizeof(HWord) == sizeof(VexGuestX86SegDescr*)); -//zz vg_assert(8 == sizeof(VexGuestX86SegDescr)); -//zz -//zz if (info == NULL) -//zz return -VKI_EFAULT; -//zz -//zz idx = info->entry_number; -//zz -//zz if (idx < 0 || idx >= VEX_GUEST_X86_GDT_NENT) -//zz return -VKI_EINVAL; -//zz -//zz gdt = (VexGuestX86SegDescr*)VG_(threads)[tid].arch.vex.guest_GDT; -//zz -//zz /* If the thread doesn't have a GDT, allocate it now. */ -//zz if (!gdt) { -//zz gdt = alloc_zeroed_x86_GDT(); -//zz VG_(threads)[tid].arch.vex.guest_GDT = (HWord)gdt; -//zz } -//zz -//zz info->base_addr = ( gdt[idx].LdtEnt.Bits.BaseHi << 24 ) | -//zz ( gdt[idx].LdtEnt.Bits.BaseMid << 16 ) | -//zz gdt[idx].LdtEnt.Bits.BaseLow; -//zz info->limit = ( gdt[idx].LdtEnt.Bits.LimitHi << 16 ) | -//zz gdt[idx].LdtEnt.Bits.LimitLow; -//zz info->seg_32bit = gdt[idx].LdtEnt.Bits.Default_Big; -//zz info->contents = ( gdt[idx].LdtEnt.Bits.Type >> 2 ) & 0x3; -//zz info->read_exec_only = ( gdt[idx].LdtEnt.Bits.Type & 0x1 ) ^ 0x1; -//zz info->limit_in_pages = gdt[idx].LdtEnt.Bits.Granularity; -//zz info->seg_not_present = gdt[idx].LdtEnt.Bits.Pres ^ 0x1; -//zz info->useable = gdt[idx].LdtEnt.Bits.Sys; -//zz info->reserved = 0; -//zz -//zz return 0; -//zz } +static SysRes sys_get_thread_area ( ThreadId tid, vki_modify_ldt_t* info ) +{ + Int idx; + VexGuestX86SegDescr* gdt; + + vg_assert(sizeof(HWord) == sizeof(VexGuestX86SegDescr*)); + vg_assert(8 == sizeof(VexGuestX86SegDescr)); + + if (info == NULL) + return VG_(mk_SysRes_Error)( VKI_EFAULT ); + + idx = info->entry_number; + + if (idx < 0 || idx >= VEX_GUEST_X86_GDT_NENT) + return VG_(mk_SysRes_Error)( VKI_EINVAL ); + + gdt = (VexGuestX86SegDescr*)VG_(threads)[tid].arch.vex.guest_GDT; + + /* If the thread doesn't have a GDT, allocate it now. */ + if (!gdt) { + gdt = alloc_zeroed_x86_GDT(); + VG_(threads)[tid].arch.vex.guest_GDT = (HWord)gdt; + } + + info->base_addr = ( gdt[idx].LdtEnt.Bits.BaseHi << 24 ) | + ( gdt[idx].LdtEnt.Bits.BaseMid << 16 ) | + gdt[idx].LdtEnt.Bits.BaseLow; + info->limit = ( gdt[idx].LdtEnt.Bits.LimitHi << 16 ) | + gdt[idx].LdtEnt.Bits.LimitLow; + info->seg_32bit = gdt[idx].LdtEnt.Bits.Default_Big; + info->contents = ( gdt[idx].LdtEnt.Bits.Type >> 2 ) & 0x3; + info->read_exec_only = ( gdt[idx].LdtEnt.Bits.Type & 0x1 ) ^ 0x1; + info->limit_in_pages = gdt[idx].LdtEnt.Bits.Granularity; + info->seg_not_present = gdt[idx].LdtEnt.Bits.Pres ^ 0x1; + info->useable = gdt[idx].LdtEnt.Bits.Sys; + info->reserved = 0; + + return VG_(mk_SysRes_Error)( 0 ); +} /* --------------------------------------------------------------------- More thread stuff @@ -954,6 +954,7 @@ DECL_TEMPLATE(x86_linux, sys_ipc); 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_get_thread_area); DECL_TEMPLATE(x86_linux, sys_ptrace); DECL_TEMPLATE(x86_linux, sys_sigaction); DECL_TEMPLATE(x86_linux, old_select); @@ -1210,19 +1211,19 @@ PRE(sys_set_thread_area) SET_STATUS_from_SysRes( sys_set_thread_area( tid, (void *)ARG1 ) ); } -//zz PRE(sys_get_thread_area, Special) -//zz { -//zz PRINT("sys_get_thread_area ( %p )", ARG1); -//zz PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info) -//zz PRE_MEM_WRITE( "get_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) ); -//zz -//zz /* "do" the syscall ourselves; the kernel never sees it */ -//zz SET_STATUS_( sys_get_thread_area( tid, (void *)ARG1 ) ); -//zz -//zz if (!VG_(is_kerror)(RES)) { -//zz POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) ); -//zz } -//zz } +PRE(sys_get_thread_area) +{ + PRINT("sys_get_thread_area ( %p )", ARG1); + PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info) + PRE_MEM_WRITE( "get_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) ); + + /* "do" the syscall ourselves; the kernel never sees it */ + SET_STATUS_from_SysRes( sys_get_thread_area( tid, (void *)ARG1 ) ); + + if (SUCCESS) { + POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) ); + } +} // Parts of this are x86-specific, but the *PEEK* cases are generic. // XXX: Why is the memory pointed to by ARG3 never checked? @@ -1458,16 +1459,16 @@ PRE(old_mmap) }; */ UWord a1, a2, a3, a4, a5, a6; - UWord* arg_block = (UWord*)ARG1; - PRE_REG_READ1(long, "old_mmap", struct mmap_arg_struct *, ARG1); - PRE_MEM_READ( "old_mmap(args)", (Addr)arg_block, 6*sizeof(UWord) ); + UWord* args = (UWord*)ARG1; + PRE_REG_READ1(long, "old_mmap", struct mmap_arg_struct *, args); + PRE_MEM_READ( "old_mmap(args)", (Addr)args, 6*sizeof(UWord) ); - a1 = arg_block[0]; - a2 = arg_block[1]; - a3 = arg_block[2]; - a4 = arg_block[3]; - a5 = arg_block[4]; - a6 = arg_block[5]; + a1 = args[0]; + a2 = args[1]; + a3 = args[2]; + a4 = args[3]; + a5 = args[4]; + a6 = args[5]; PRINT("old_mmap ( %p, %llu, %d, %d, %d, %d )", a1, (ULong)a2, a3, a4, a5, a6 ); @@ -1515,13 +1516,13 @@ PRE(old_mmap) if (0) VG_(printf)("old_mmap( %p, fixed %d ) -> %s(%p)\n", - arg_block[0], - arg_block[3]&VKI_MAP_FIXED, + args[0], + args[3]&VKI_MAP_FIXED, FAILURE ? "Fail" : "Success", RES_unchecked); /* Stay sane */ - if (SUCCESS && (arg_block[3] & VKI_MAP_FIXED)) - vg_assert(RES == arg_block[0]); + if (SUCCESS && (args[3] & VKI_MAP_FIXED)) + vg_assert(RES == args[0]); } // XXX: lstat64/fstat64/stat64 are generic, but not necessarily @@ -2094,8 +2095,8 @@ const SyscallTableEntry VGP_(syscall_table)[] = { 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_setparam, sys_sched_setparam), // 154 + GENXY(__NR_sched_getparam, sys_sched_getparam), // 155 GENX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156 GENX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157 @@ -2106,73 +2107,73 @@ const SyscallTableEntry VGP_(syscall_table)[] = { //zz // (__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 */* GENXY(__NR_nanosleep, sys_nanosleep), // 162 GENX_(__NR_mremap, sys_mremap), // 163 -//zz LINX_(__NR_setresuid, sys_setresuid16), // 164 -//zz -//zz LINXY(__NR_getresuid, sys_getresuid16), // 165 + LINX_(__NR_setresuid, sys_setresuid16), // 164 + + LINXY(__NR_getresuid, sys_getresuid16), // 165 //zz // (__NR_vm86, sys_vm86), // 166 x86/Linux-only GENX_(__NR_query_module, sys_ni_syscall), // 167 GENXY(__NR_poll, sys_poll), // 168 //zz // (__NR_nfsservctl, sys_nfsservctl), // 169 */Linux //zz -//zz LINX_(__NR_setresgid, sys_setresgid16), // 170 -//zz LINXY(__NR_getresgid, sys_getresgid16), // 171 -//zz LINX_(__NR_prctl, sys_prctl), // 172 + LINX_(__NR_setresgid, sys_setresgid16), // 170 + LINXY(__NR_getresgid, sys_getresgid16), // 171 + LINX_(__NR_prctl, sys_prctl), // 172 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 173 x86/Linux only? GENXY(__NR_rt_sigaction, sys_rt_sigaction), // 174 GENXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 175 -//zz GENXY(__NR_rt_sigpending, sys_rt_sigpending), // 176 + GENXY(__NR_rt_sigpending, sys_rt_sigpending), // 176 GENXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 177 -//zz GENXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 178 + GENXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 178 GENX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 179 -//zz -//zz GENXY(__NR_pread64, sys_pread64), // 180 -//zz GENX_(__NR_pwrite64, sys_pwrite64), // 181 -//zz GENX_(__NR_chown, sys_chown16), // 182 + + GENXY(__NR_pread64, sys_pread64), // 180 + GENX_(__NR_pwrite64, sys_pwrite64), // 181 + GENX_(__NR_chown, sys_chown16), // 182 GENXY(__NR_getcwd, sys_getcwd), // 183 -//zz GENXY(__NR_capget, sys_capget), // 184 -//zz -//zz GENX_(__NR_capset, sys_capset), // 185 + GENXY(__NR_capget, sys_capget), // 184 + + GENX_(__NR_capset, sys_capset), // 185 GENXY(__NR_sigaltstack, sys_sigaltstack), // 186 -//zz LINXY(__NR_sendfile, sys_sendfile), // 187 -//zz GENXY(__NR_getpmsg, sys_getpmsg), // 188 -//zz GENX_(__NR_putpmsg, sys_putpmsg), // 189 + LINXY(__NR_sendfile, sys_sendfile), // 187 + GENXY(__NR_getpmsg, sys_getpmsg), // 188 + GENX_(__NR_putpmsg, sys_putpmsg), // 189 // Nb: we treat vfork as fork GENX_(__NR_vfork, sys_fork), // 190 GENXY(__NR_ugetrlimit, sys_getrlimit), // 191 GENXY(__NR_mmap2, sys_mmap2), // 192 -//zz GENX_(__NR_truncate64, sys_truncate64), // 193 -//zz GENX_(__NR_ftruncate64, sys_ftruncate64), // 194 -//zz + GENX_(__NR_truncate64, sys_truncate64), // 193 + GENX_(__NR_ftruncate64, sys_ftruncate64), // 194 + PLAXY(__NR_stat64, sys_stat64), // 195 PLAXY(__NR_lstat64, sys_lstat64), // 196 PLAXY(__NR_fstat64, sys_fstat64), // 197 -//zz GENX_(__NR_lchown32, sys_lchown), // 198 + GENX_(__NR_lchown32, sys_lchown), // 198 GENX_(__NR_getuid32, sys_getuid), // 199 GENX_(__NR_getgid32, sys_getgid), // 200 GENX_(__NR_geteuid32, sys_geteuid), // 201 GENX_(__NR_getegid32, sys_getegid), // 202 -//zz GENX_(__NR_setreuid32, sys_setreuid), // 203 -//zz GENX_(__NR_setregid32, sys_setregid), // 204 + GENX_(__NR_setreuid32, sys_setreuid), // 203 + GENX_(__NR_setregid32, sys_setregid), // 204 GENXY(__NR_getgroups32, sys_getgroups), // 205 -//zz GENX_(__NR_setgroups32, sys_setgroups), // 206 -//zz GENX_(__NR_fchown32, sys_fchown), // 207 -//zz LINX_(__NR_setresuid32, sys_setresuid), // 208 + GENX_(__NR_setgroups32, sys_setgroups), // 206 + GENX_(__NR_fchown32, sys_fchown), // 207 + LINX_(__NR_setresuid32, sys_setresuid), // 208 LINXY(__NR_getresuid32, sys_getresuid), // 209 -//zz LINX_(__NR_setresgid32, sys_setresgid), // 210 + LINX_(__NR_setresgid32, sys_setresgid), // 210 LINXY(__NR_getresgid32, sys_getresgid), // 211 -//zz GENX_(__NR_chown32, sys_chown), // 212 -//zz GENX_(__NR_setuid32, sys_setuid), // 213 -//zz GENX_(__NR_setgid32, sys_setgid), // 214 -//zz -//zz LINX_(__NR_setfsuid32, sys_setfsuid), // 215 -//zz LINX_(__NR_setfsgid32, sys_setfsgid), // 216 + GENX_(__NR_chown32, sys_chown), // 212 + GENX_(__NR_setuid32, sys_setuid), // 213 + GENX_(__NR_setgid32, sys_setgid), // 214 + + LINX_(__NR_setfsuid32, sys_setfsuid), // 215 + LINX_(__NR_setfsgid32, sys_setfsgid), // 216 //zz // (__NR_pivot_root, sys_pivot_root), // 217 */Linux -//zz GENXY(__NR_mincore, sys_mincore), // 218 + GENXY(__NR_mincore, sys_mincore), // 218 GENX_(__NR_madvise, sys_madvise), // 219 GENXY(__NR_getdents64, sys_getdents64), // 220 @@ -2182,61 +2183,61 @@ const SyscallTableEntry VGP_(syscall_table)[] = { LINX_(__NR_gettid, sys_gettid), // 224 //zz // (__NR_readahead, sys_readahead), // 225 */(Linux?) -//zz GENX_(__NR_setxattr, sys_setxattr), // 226 -//zz GENX_(__NR_lsetxattr, sys_lsetxattr), // 227 -//zz GENX_(__NR_fsetxattr, sys_fsetxattr), // 228 + GENX_(__NR_setxattr, sys_setxattr), // 226 + GENX_(__NR_lsetxattr, sys_lsetxattr), // 227 + GENX_(__NR_fsetxattr, sys_fsetxattr), // 228 GENXY(__NR_getxattr, sys_getxattr), // 229 -//zz -//zz GENXY(__NR_lgetxattr, sys_lgetxattr), // 230 -//zz GENXY(__NR_fgetxattr, sys_fgetxattr), // 231 -//zz GENXY(__NR_listxattr, sys_listxattr), // 232 -//zz GENXY(__NR_llistxattr, sys_llistxattr), // 233 -//zz GENXY(__NR_flistxattr, sys_flistxattr), // 234 -//zz -//zz GENX_(__NR_removexattr, sys_removexattr), // 235 -//zz GENX_(__NR_lremovexattr, sys_lremovexattr), // 236 -//zz GENX_(__NR_fremovexattr, sys_fremovexattr), // 237 + + GENXY(__NR_lgetxattr, sys_lgetxattr), // 230 + GENXY(__NR_fgetxattr, sys_fgetxattr), // 231 + GENXY(__NR_listxattr, sys_listxattr), // 232 + GENXY(__NR_llistxattr, sys_llistxattr), // 233 + GENXY(__NR_flistxattr, sys_flistxattr), // 234 + + GENX_(__NR_removexattr, sys_removexattr), // 235 + GENX_(__NR_lremovexattr, sys_lremovexattr), // 236 + GENX_(__NR_fremovexattr, sys_fremovexattr), // 237 //zz LINX_(__NR_tkill, sys_tkill), // 238 */Linux -//zz LINXY(__NR_sendfile64, sys_sendfile64), // 239 -//zz + LINXY(__NR_sendfile64, sys_sendfile64), // 239 + LINXY(__NR_futex, sys_futex), // 240 -//zz GENX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 241 -//zz GENXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 242 + GENX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 241 + GENXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 242 PLAX_(__NR_set_thread_area, sys_set_thread_area), // 243 -//zz PLAX_(__NR_get_thread_area, sys_get_thread_area), // 244 -//zz -//zz LINX_(__NR_io_setup, sys_io_setup), // 245 -//zz LINX_(__NR_io_destroy, sys_io_destroy), // 246 -//zz LINXY(__NR_io_getevents, sys_io_getevents), // 247 -//zz LINX_(__NR_io_submit, sys_io_submit), // 248 -//zz LINXY(__NR_io_cancel, sys_io_cancel), // 249 -//zz + PLAX_(__NR_get_thread_area, sys_get_thread_area), // 244 + + LINX_(__NR_io_setup, sys_io_setup), // 245 + LINX_(__NR_io_destroy, sys_io_destroy), // 246 + LINXY(__NR_io_getevents, sys_io_getevents), // 247 + LINX_(__NR_io_submit, sys_io_submit), // 248 + LINXY(__NR_io_cancel, sys_io_cancel), // 249 + //zz LINX_(__NR_fadvise64, sys_fadvise64), // 250 */(Linux?) GENX_(251, sys_ni_syscall), // 251 LINX_(__NR_exit_group, sys_exit_group), // 252 -//zz GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 253 -//zz LINXY(__NR_epoll_create, sys_epoll_create), // 254 -//zz -//zz LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 255 -//zz LINXY(__NR_epoll_wait, sys_epoll_wait), // 256 + GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 253 + LINXY(__NR_epoll_create, sys_epoll_create), // 254 + + LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 255 + LINXY(__NR_epoll_wait, sys_epoll_wait), // 256 //zz // (__NR_remap_file_pages, sys_remap_file_pages), // 257 */Linux LINX_(__NR_set_tid_address, sys_set_tid_address), // 258 -//zz GENXY(__NR_timer_create, sys_timer_create), // 259 -//zz -//zz GENXY(__NR_timer_settime, sys_timer_settime), // (timer_create+1) -//zz GENXY(__NR_timer_gettime, sys_timer_gettime), // (timer_create+2) -//zz GENX_(__NR_timer_getoverrun, sys_timer_getoverrun),//(timer_create+3) -//zz GENX_(__NR_timer_delete, sys_timer_delete), // (timer_create+4) -//zz GENX_(__NR_clock_settime, sys_clock_settime), // (timer_create+5) -//zz + GENXY(__NR_timer_create, sys_timer_create), // 259 + + GENXY(__NR_timer_settime, sys_timer_settime), // (timer_create+1) + GENXY(__NR_timer_gettime, sys_timer_gettime), // (timer_create+2) + GENX_(__NR_timer_getoverrun, sys_timer_getoverrun),//(timer_create+3) + GENX_(__NR_timer_delete, sys_timer_delete), // (timer_create+4) + GENX_(__NR_clock_settime, sys_clock_settime), // (timer_create+5) + GENXY(__NR_clock_gettime, sys_clock_gettime), // (timer_create+6) -//zz GENXY(__NR_clock_getres, sys_clock_getres), // (timer_create+7) + GENXY(__NR_clock_getres, sys_clock_getres), // (timer_create+7) //zz // (__NR_clock_nanosleep, sys_clock_nanosleep),// (timer_create+8) */* -//zz GENXY(__NR_statfs64, sys_statfs64), // 268 -//zz GENXY(__NR_fstatfs64, sys_fstatfs64), // 269 -//zz + GENXY(__NR_statfs64, sys_statfs64), // 268 + GENXY(__NR_fstatfs64, sys_fstatfs64), // 269 + LINX_(__NR_tgkill, sys_tgkill), // 270 */Linux -//zz GENX_(__NR_utimes, sys_utimes), // 271 + GENX_(__NR_utimes, sys_utimes), // 271 //zz LINX_(__NR_fadvise64_64, sys_fadvise64_64), // 272 */(Linux?) GENX_(__NR_vserver, sys_ni_syscall), // 273 //zz // (__NR_mbind, sys_mbind), // 274 ?/?