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 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_syscalls.c b/coregrind/vg_syscalls.c
index 01348f5..b7315ec 100644
--- a/coregrind/vg_syscalls.c
+++ b/coregrind/vg_syscalls.c
@@ -1291,9 +1291,10 @@
    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 @@
    }
 }
 
-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 @@
    } 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 @@
    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 @@
    }   
 }
 
-POST(ipc)
+POSTx(sys_ipc)
 {
    switch (arg1 /* call */) {
    case 1: /* IPCOP_semop */
@@ -5569,20 +5583,21 @@
       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 @@
    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 4b65f80..20035a8 100644
--- a/include/linux/vki.h
+++ b/include/linux/vki.h
@@ -127,6 +127,8 @@
 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 561ee11..367f2d4 100644
--- a/memcheck/tests/scalar.c
+++ b/memcheck/tests/scalar.c
@@ -8,8 +8,6 @@
 
    // All __NR_xxx numbers are taken from x86
 
-   // 0--49
-   
    // __NR_restart_syscall 1  XXX ???
    // (see below)
 
@@ -442,9 +440,9 @@
    // __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 @@
  //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 @@
    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 <asm/ipc.h>
+   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 @@
  //SY(__NR_sigreturn);
 
    // __NR_clone 120
- //GO(__NR_clone, ".s .m");
- //SY(__NR_clone);
+   #include <sched.h>
+   #include <signal.h>
+   // 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 09ab77f..9118099 100644
--- a/memcheck/tests/scalar.stderr.exp
+++ b/memcheck/tests/scalar.stderr.exp
@@ -1303,12 +1303,55 @@
    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 @@
    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 @@
    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
 -----------------------------------------------------