From: Nicholas Nethercote Date: Mon, 15 Nov 2004 12:28:58 +0000 (+0000) Subject: Converted a few more, including clone() which I'm not at all sure about, and X-Git-Tag: svn/VALGRIND_3_0_0~1310 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ad980e636a2efd93ab15b9476d32fe873b4d0682;p=thirdparty%2Fvalgrind.git Converted a few more, including clone() which I'm not at all sure about, and ipc() which is done too simplistically. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3002 --- diff --git a/coregrind/vg_syscalls.c b/coregrind/vg_syscalls.c index 01348f5715..b7315ecdfe 100644 --- a/coregrind/vg_syscalls.c +++ b/coregrind/vg_syscalls.c @@ -1291,9 +1291,10 @@ PREx(sys_vhangup, 0) PRE_REG_READ0(long, "vhangup"); } -PRE(iopl) +PREx(sys_iopl, 0) { - PRINT("iopl ( %d )", arg1); + PRINT("sys_iopl ( %d )", arg1); + PRE_REG_READ1(long, "iopl", unsigned long, level); } PREx(sys_setxattr, MayBlock) @@ -2276,9 +2277,15 @@ POSTx(sys_fork) } } -PRE(clone) +// XXX: x86-specific +PREx(sys_clone, Special) { - PRINT("clone ( %d, %p, %p, %p, %p )",arg1,arg2,arg3,arg4,arg5); + PRINT("sys_clone ( %d, %p, %p, %p, %p )",arg1,arg2,arg3,arg4,arg5); + // XXX: really not sure about the last two args... if they are really + // there, we should do PRE_MEM_READs for both of them... + PRE_REG_READ4(int, "clone", + unsigned long, flags, void *, child_stack, + int *, parent_tidptr, int *, child_tidptr); if (arg2 == 0 && (arg1 == (VKI_CLONE_CHILD_CLEARTID|VKI_CLONE_CHILD_SETTID|VKI_SIGCHLD) @@ -2290,7 +2297,7 @@ PRE(clone) } else { VG_(unimplemented) ("clone(): not supported by Valgrind.\n " - "We do now support programs linked against\n " + "We do support programs linked against\n " "libpthread.so, though. Re-run with -v and ensure that\n " "you are picking up Valgrind's implementation of libpthread.so."); } @@ -2644,9 +2651,16 @@ PREx(sys_getuid, 0) PRE_REG_READ0(long, "getuid"); } -PRE(ipc) +// XXX: x86-specific +// XXX: should use the constants here (eg. SHMAT), not the numbers directly! +PREx(sys_ipc, 0) { - PRINT("ipc ( %d, %d, %d, %d, %p, %d )", arg1,arg2,arg3,arg4,arg5,arg6); + PRINT("sys_ipc ( %d, %d, %d, %d, %p, %d )", arg1,arg2,arg3,arg4,arg5,arg6); + // XXX: this is simplistic -- some args are not used in all circumstances. + PRE_REG_READ6(int, "ipc", + vki_uint, call, int, first, int, second, int, third, + void *, ptr, long, fifth) + switch (arg1 /* call */) { case 1: /* IPCOP_semop */ PRE_MEM_READ( "semop(sops)", arg5, arg3 * sizeof(struct vki_sembuf) ); @@ -2901,7 +2915,7 @@ PRE(ipc) } } -POST(ipc) +POSTx(sys_ipc) { switch (arg1 /* call */) { case 1: /* IPCOP_semop */ @@ -5569,20 +5583,21 @@ POSTx(sys_waitpid) POST_MEM_WRITE( arg2, sizeof(int) ); } -PRE(wait4) +PREx(sys_wait4, MayBlock) { - /* pid_t wait4(pid_t pid, int *status, int options, - struct rusage *rusage) */ - PRINT("wait4 ( %d, %p, %d, %p )", arg1,arg2,arg3,arg4); + PRINT("sys_wait4 ( %d, %p, %d, %p )", arg1,arg2,arg3,arg4); arg3 &= ~(__VKI_WCLONE | __VKI_WALL); + PRE_REG_READ4(long, "wait4", + vki_pid_t, pid, unsigned int *, status, int, options, + struct rusage *, rusage); if (arg2 != (Addr)NULL) PRE_MEM_WRITE( "wait4(status)", arg2, sizeof(int) ); if (arg4 != (Addr)NULL) PRE_MEM_WRITE( "wait4(rusage)", arg4, sizeof(struct vki_rusage) ); } -POST(wait4) +POSTx(sys_wait4) { if (arg2 != (Addr)NULL) POST_MEM_WRITE( arg2, sizeof(int) ); @@ -6428,19 +6443,19 @@ static const struct sys_info sys_info[] = { SYSXY(__NR_fstat, sys_newfstat), // 108 * P (SVr4,BSD4.3) // (__NR_olduname, sys_uname), // 109 (?) L -- obsolete - SYSB_(__NR_iopl, sys_iopl, 0), // 110 + SYSX_(__NR_iopl, sys_iopl), // 110 (x86/amd64) L SYSX_(__NR_vhangup, sys_vhangup), // 111 * L SYSX_(__NR_idle, sys_ni_syscall), // 112 * P -- unimplemented // (__NR_vm86old, sys_vm86old), // 113 (x86) L - SYSBA(__NR_wait4, sys_wait4, MayBlock), // 114 * + SYSXY(__NR_wait4, sys_wait4), // 114 * P // (__NR_swapoff, sys_swapoff), // 115 * L SYSXY(__NR_sysinfo, sys_sysinfo), // 116 * L - SYSBA(__NR_ipc, sys_ipc, 0), // 117 + SYSXY(__NR_ipc, sys_ipc), // 117 (x86) L SYSX_(__NR_fsync, sys_fsync), // 118 * L // (__NR_sigreturn, sys_sigreturn), // 119 () L - SYSB_(__NR_clone, sys_clone, Special), // 120 (very non-gen) L + SYSX_(__NR_clone, sys_clone), // 120 (x86) L // (__NR_setdomainname, sys_setdomainname),// 121 * (non-P?) SYSXY(__NR_uname, sys_newuname), // 122 * P SYSB_(__NR_modify_ldt, sys_modify_ldt, Special), // 123 (x86,amd64) L diff --git a/include/linux/vki.h b/include/linux/vki.h index 4b65f8092e..20035a812e 100644 --- a/include/linux/vki.h +++ b/include/linux/vki.h @@ -127,6 +127,8 @@ typedef __vki_kernel_time_t vki_time_t; typedef __vki_kernel_clock_t vki_clock_t; typedef __vki_kernel_caddr_t vki_caddr_t; +typedef unsigned int vki_uint; + //---------------------------------------------------------------------- // Now the rest of the arch-specific stuff //---------------------------------------------------------------------- diff --git a/memcheck/tests/scalar.c b/memcheck/tests/scalar.c index 561ee11b5c..367f2d43e1 100644 --- a/memcheck/tests/scalar.c +++ b/memcheck/tests/scalar.c @@ -8,8 +8,6 @@ int main(void) // All __NR_xxx numbers are taken from x86 - // 0--49 - // __NR_restart_syscall 1 XXX ??? // (see below) @@ -442,9 +440,9 @@ int main(void) // __NR_olduname 109 // (obsolete, not handled by Valgrind) - // __NR_iopl 110 - //GO(__NR_iopl, ".s .m"); - //SY(__NR_iopl); + // __NR_iopl 110 --> sys_iopl() + GO(__NR_iopl, "1s 0m"); + SY(__NR_iopl, x0); // __NR_vhangup 111 --> sys_vhangup() GO(__NR_vhangup, "0e"); @@ -458,9 +456,9 @@ int main(void) //GO(__NR_vm86old, ".s .m"); //SY(__NR_vm86old); - // __NR_wait4 114 - //GO(__NR_wait4, ".s .m"); - //SY(__NR_wait4); + // __NR_wait4 114 --> sys_wait4() + GO(__NR_wait4, "4s 2m"); + SY(__NR_wait4, x0, x0+1, x0, x0+1); // __NR_swapoff 115 //GO(__NR_swapoff, ".s .m"); @@ -471,8 +469,12 @@ int main(void) SY(__NR_sysinfo, x0); // __NR_ipc 117 - //GO(__NR_ipc, ".s .m"); - //SY(__NR_ipc); + // XXX: This is simplistic -- doesn't treat any of the sub-ops. + // XXX: Also, should be 6 scalar errors, except glibc's syscall() doesn't + // use the 6th one! + #include + GO(__NR_ipc, "5s 0m"); + SY(__NR_ipc, x0+4, x0, x0, x0, x0, x0); // __NR_fsync 118 --> sys_fsync() GO(__NR_fsync, "1s 0m"); @@ -483,8 +485,11 @@ int main(void) //SY(__NR_sigreturn); // __NR_clone 120 - //GO(__NR_clone, ".s .m"); - //SY(__NR_clone); + #include + #include + // XXX: should really be "4s 2m"? Not sure... (see PRE(sys_clone)) + GO(__NR_clone, "4s 0m"); + SY(__NR_clone, x0|CLONE_PARENT_SETTID|SIGCHLD, x0, x0, x0); // __NR_setdomainname 121 //GO(__NR_setdomainname, ".s .m"); diff --git a/memcheck/tests/scalar.stderr.exp b/memcheck/tests/scalar.stderr.exp index 09ab77f318..9118099c1d 100644 --- a/memcheck/tests/scalar.stderr.exp +++ b/memcheck/tests/scalar.stderr.exp @@ -1303,12 +1303,55 @@ Syscall param fstat(buf) points to unaddressable byte(s) by 0x........: ... Address 0x........ is not stack'd, malloc'd or (recently) free'd ----------------------------------------------------- +110: __NR_iopl 1s 0m +----------------------------------------------------- + +Syscall param iopl(level) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... +----------------------------------------------------- 111: __NR_vhangup 0e ----------------------------------------------------- ----------------------------------------------------- 112: __NR_idle 0e ----------------------------------------------------- ----------------------------------------------------- +114: __NR_wait4 4s 2m +----------------------------------------------------- + +Syscall param wait4(pid) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param wait4(status) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param wait4(options) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param wait4(rusage) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param wait4(status) points to unaddressable byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +Syscall param wait4(rusage) points to unaddressable byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd +----------------------------------------------------- 116: __NR_sysinfo 1s 1m ----------------------------------------------------- @@ -1323,6 +1366,34 @@ Syscall param sysinfo(info) points to unaddressable byte(s) by 0x........: ... Address 0x........ is not stack'd, malloc'd or (recently) free'd ----------------------------------------------------- +117: __NR_ipc 5s 0m +----------------------------------------------------- + +Syscall param ipc(call) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param ipc(first) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param ipc(second) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param ipc(third) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param ipc(ptr) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... +----------------------------------------------------- 118: __NR_fsync 1s 0m ----------------------------------------------------- @@ -1331,6 +1402,29 @@ Syscall param fsync(fd) contains uninitialised byte(s) by 0x........: __libc_start_main (...libc...) by 0x........: ... ----------------------------------------------------- +120: __NR_clone 4s 0m +----------------------------------------------------- + +Syscall param clone(flags) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param clone(child_stack) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param clone(parent_tidptr) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... + +Syscall param clone(child_tidptr) contains uninitialised byte(s) + at 0x........: syscall (in /...libc...) + by 0x........: __libc_start_main (...libc...) + by 0x........: ... +----------------------------------------------------- 122: __NR_uname 1s 1m -----------------------------------------------------