* fix a bug in sys_clone that was causing threads to hang at exit
* enable enough syscalls to be able to run ssh and bash


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13826 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c
index 1b1bf5b..e444333 100644
--- a/coregrind/m_syswrap/syswrap-arm64-linux.c
+++ b/coregrind/m_syswrap/syswrap-arm64-linux.c
@@ -137,22 +137,21 @@
 	    int    flags	in x0
 	    void*  child_stack	in x1
 	    pid_t* parent_tid	in x2
-	    pid_t* child_tid	in x3
-	    void*  tls_ptr      in x4
+	    void*  tls_ptr      in x3
+	    pid_t* child_tid	in x4
 
 	Returns a Long encoded in the linux-arm64 way, not a SysRes.
-        x10-x20 are caller save, so they might be useful.
 */
 #define __NR_CLONE        VG_STRINGIFY(__NR_clone)
 #define __NR_EXIT         VG_STRINGIFY(__NR_exit)
 
 extern
 Long do_syscall_clone_arm64_linux ( Word (*fn)(void *), 
-                                    void* stack, 
+                                    void* child_stack, 
                                     Long  flags, 
                                     void* arg,
-                                    Long* child_tid,
-                                    Long* parent_tid,
+                                    Int*  child_tid,
+                                    Int*  parent_tid,
                                     void* tls );
 asm(
 ".text\n"
@@ -168,8 +167,8 @@
 "       mov    x0, x2\n"            // syscall arg1: flags
 "       mov    x1, x1\n"            // syscall arg2: child_stack
 "       mov    x2, x5\n"            // syscall arg3: parent_tid
-"       mov    x3, x4\n"            // syscall arg4: child_tid
-"       mov    x4, x6\n"            // syscall arg5: tls_ptr
+"       mov    x3, x6\n"            // syscall arg4: tls_ptr
+"       mov    x4, x4\n"            // syscall arg5: child_tid
 
 "       svc    0\n"                 // clone()
 
@@ -215,10 +214,11 @@
    for SP.
  */
 static SysRes do_clone ( ThreadId ptid, 
-                         ULong flags, Addr xsp, 
-                         Long* parent_tidptr, 
-                         Long* child_tidptr, 
-                         Addr child_tls )
+                         ULong flags,
+                         Addr  child_xsp, 
+                         Int*  parent_tidptr, 
+                         Int*  child_tidptr, 
+                         Addr  child_tls )
 {
    const Bool debug = False;
 
@@ -260,8 +260,8 @@
       child. */
    ctst->arch.vex.guest_X0 = 0;
 
-   if (xsp != 0)
-      ctst->arch.vex.guest_XSP = xsp;
+   if (child_xsp != 0)
+      ctst->arch.vex.guest_XSP = child_xsp;
 
    ctst->os_state.parent = ptid;
 
@@ -285,20 +285,20 @@
       memory mappings and try to derive some useful information.  We
       assume that xsp starts near its highest possible value, and can
       only go down to the start of the mmaped segment. */
-   seg = VG_(am_find_nsegment)((Addr)xsp);
+   seg = VG_(am_find_nsegment)((Addr)child_xsp);
    if (seg && seg->kind != SkResvn) {
-      ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(xsp);
+      ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(child_xsp);
       ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
    
       VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
    
       if (debug)
          VG_(printf)("tid %d: guessed client stack range %#lx-%#lx\n",
-         ctid, seg->start, VG_PGROUNDUP(xsp));
+         ctid, seg->start, VG_PGROUNDUP(child_xsp));
    } else {
       VG_(message)(
          Vg_UserMsg,
-         "!? New thread %d starts with sp+%#lx) unmapped\n", ctid, xsp
+         "!? New thread %d starts with sp+%#lx) unmapped\n", ctid, child_xsp
       );
       ctst->client_stack_szB  = 0;
    }
@@ -534,6 +534,16 @@
 //ZZ    POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
 //ZZ }
 
+/* Aarch64 seems to use CONFIG_CLONE_BACKWARDS in the kernel.  See:
+      http://dev.gentoo.org/~vapier/aarch64/linux-3.12.6.config
+      http://people.redhat.com/wcohen/aarch64/aarch64_config
+   from linux-3.10.5/kernel/fork.c 
+    #ifdef CONFIG_CLONE_BACKWARDS
+    SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
+                     int __user *, parent_tidptr,
+                     int, tls_val,
+                     int __user *, child_tidptr)
+*/
 PRE(sys_clone)
 {
    UInt cloneflags;
@@ -554,14 +564,6 @@
          return;
       }
    }
-   if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
-      PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
-      if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int), 
-                                             VKI_PROT_WRITE)) {
-         SET_STATUS_Failure( VKI_EFAULT );
-         return;
-      }
-   }
 //ZZ    if (ARG1 & VKI_CLONE_SETTLS) {
 //ZZ       PRE_MEM_READ("clone(tls_user_desc)", ARG4, sizeof(vki_modify_ldt_t));
 //ZZ       if (!VG_(am_is_valid_for_client)(ARG4, sizeof(vki_modify_ldt_t), 
@@ -570,6 +572,14 @@
 //ZZ          return;
 //ZZ       }
 //ZZ    }
+   if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
+      PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
+      if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int), 
+                                             VKI_PROT_WRITE)) {
+         SET_STATUS_Failure( VKI_EFAULT );
+         return;
+      }
+   }
 
    cloneflags = ARG1;
 
@@ -585,11 +595,11 @@
       /* thread creation */
       SET_STATUS_from_SysRes(
          do_clone(tid,
-                  ARG1,          /* flags */
-                  (Addr)ARG2,    /* child SP */
-                  (Long *)ARG3,  /* parent_tidptr */
-                  (Long *)ARG5,  /* child_tidptr */
-                  (Addr)ARG4));  /* set_tls */
+                  ARG1,         /* flags */
+                  (Addr)ARG2,   /* child SP */
+                  (Int*)ARG3,   /* parent_tidptr */
+                  (Int*)ARG5,   /* child_tidptr */
+                  (Addr)ARG4)); /* tls_val */
       break;
 
    case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
@@ -599,9 +609,9 @@
    case 0: /* plain fork */
       SET_STATUS_from_SysRes(
          ML_(do_fork_clone)(tid,
-                       cloneflags,      /* flags */
-                       (Int *)ARG3,     /* parent_tidptr */
-                       (Int *)ARG5));   /* child_tidptr */
+                       cloneflags,     /* flags */
+                       (Int*)ARG3,     /* parent_tidptr */
+                       (Int*)ARG5));   /* child_tidptr */
       break;
 
    default:
@@ -871,6 +881,7 @@
    LINXY(__NR_getxattr,          sys_getxattr),          // 8
    LINXY(__NR_lgetxattr,         sys_lgetxattr),         // 9
    GENXY(__NR_getcwd,            sys_getcwd),            // 17
+   GENXY(__NR_dup,               sys_dup),               // 23
    LINXY(__NR_dup3,              sys_dup3),              // 24
 
    // FIXME IS THIS CORRECT?
@@ -896,6 +907,7 @@
    GENXY(__NR_read,              sys_read),              // 63
    GENX_(__NR_write,             sys_write),             // 64
    GENX_(__NR_writev,            sys_writev),            // 66
+   LINX_(__NR_pselect6,          sys_pselect6),          // 72
    LINXY(__NR_ppoll,             sys_ppoll),             // 73
    LINX_(__NR_readlinkat,        sys_readlinkat),        // 78
 
@@ -915,10 +927,14 @@
    LINXY(__NR_rt_sigaction,      sys_rt_sigaction),      // 134
    LINXY(__NR_rt_sigprocmask,    sys_rt_sigprocmask),    // 135
    PLAX_(__NR_rt_sigreturn,      sys_rt_sigreturn),      // 139
+   LINX_(__NR_setresuid,         sys_setresuid),         // 147
+   GENX_(__NR_setpgid,           sys_setpgid),           // 154
    GENX_(__NR_getpgid,           sys_getpgid),           // 155
    GENXY(__NR_uname,             sys_newuname),          // 160
    GENXY(__NR_getrlimit,         sys_old_getrlimit),     // 163
+   GENX_(__NR_setrlimit,         sys_setrlimit),         // 164
    GENXY(__NR_getrusage,         sys_getrusage),         // 165
+   GENX_(__NR_umask,             sys_umask),             // 166
    GENXY(__NR_gettimeofday,      sys_gettimeofday),      // 169
    GENX_(__NR_getpid,            sys_getpid),            // 172
    GENX_(__NR_getppid,           sys_getppid),           // 173
@@ -929,7 +945,16 @@
    LINX_(__NR_gettid,            sys_gettid),            // 178
    LINXY(__NR_socket,            sys_socket),            // 198
    LINXY(__NR_socketpair,        sys_socketpair),        // 199
+   LINX_(__NR_bind,              sys_bind),              // 200
    LINX_(__NR_connect,           sys_connect),           // 203
+   LINXY(__NR_getsockname,       sys_getsockname),       // 204
+   LINXY(__NR_getpeername,       sys_getpeername),       // 205
+   LINX_(__NR_sendto,            sys_sendto),            // 206
+   LINX_(__NR_setsockopt,        sys_setsockopt),        // 208
+   LINXY(__NR_getsockopt,        sys_getsockopt),        // 209
+   LINX_(__NR_shutdown,          sys_shutdown),          // 210
+   LINX_(__NR_sendmsg,           sys_sendmsg),           // 211
+   LINXY(__NR_recvmsg,           sys_recvmsg),           // 212
    GENX_(__NR_brk,               sys_brk),               // 214
    GENXY(__NR_munmap,            sys_munmap),            // 215
    PLAX_(__NR_clone,             sys_clone),             // 220
@@ -988,7 +1013,6 @@
 //ZZ    GENX_(__NR_mkdir,             sys_mkdir),          // 39
 //ZZ 
 //ZZ    GENX_(__NR_rmdir,             sys_rmdir),          // 40
-//ZZ    GENXY(__NR_dup,               sys_dup),            // 41
 //ZZ    LINXY(__NR_pipe,              sys_pipe),           // 42
 //ZZ    GENXY(__NR_times,             sys_times),          // 43
 //ZZ //   GENX_(__NR_prof,              sys_ni_syscall),     // 44
@@ -1005,11 +1029,9 @@
 //ZZ 
 //ZZ    LINXY(__NR_fcntl,             sys_fcntl),          // 55
 //ZZ //   GENX_(__NR_mpx,               sys_ni_syscall),     // 56
-//ZZ    GENX_(__NR_setpgid,           sys_setpgid),        // 57
 //ZZ //   GENX_(__NR_ulimit,            sys_ni_syscall),     // 58
 //ZZ //zz    //   (__NR_oldolduname,       sys_olduname),       // 59 Linux -- obsolete
 //ZZ //zz 
-//ZZ    GENX_(__NR_umask,             sys_umask),          // 60
 //ZZ    GENX_(__NR_chroot,            sys_chroot),         // 61
 //ZZ //zz    //   (__NR_ustat,             sys_ustat)           // 62 SVr4 -- deprecated
 //ZZ    GENXY(__NR_dup2,              sys_dup2),           // 63
@@ -1027,7 +1049,6 @@
 //ZZ    LINXY(__NR_sigpending,        sys_sigpending),     // 73
 //ZZ //zz    //   (__NR_sethostname,       sys_sethostname),    // 74 */*
 //ZZ //zz 
-//ZZ    GENX_(__NR_setrlimit,         sys_setrlimit),      // 75
 //ZZ    GENXY(__NR_getrlimit,         sys_old_getrlimit),  // 76
 //ZZ    GENX_(__NR_settimeofday,      sys_settimeofday),   // 79
 //ZZ 
@@ -1261,20 +1282,11 @@
 //ZZ    LINXY(__NR_mq_getsetattr,     sys_mq_getsetattr),  // (mq_open+5)
 //ZZ    LINXY(__NR_waitid,            sys_waitid),         // 280
 //ZZ 
-//ZZ    LINX_(__NR_bind,              sys_bind),           // 282
 //ZZ    LINX_(__NR_listen,            sys_listen),         // 284
 //ZZ    LINXY(__NR_accept,            sys_accept),         // 285
-//ZZ    LINXY(__NR_getsockname,       sys_getsockname),    // 286
-//ZZ    LINXY(__NR_getpeername,       sys_getpeername),    // 287
 //ZZ    LINX_(__NR_send,              sys_send),
-//ZZ    LINX_(__NR_sendto,            sys_sendto),         // 290
 //ZZ    LINXY(__NR_recv,              sys_recv),
 //ZZ    LINXY(__NR_recvfrom,          sys_recvfrom),       // 292
-//ZZ    LINX_(__NR_shutdown,          sys_shutdown),       // 293
-//ZZ    LINX_(__NR_setsockopt,        sys_setsockopt),     // 294
-//ZZ    LINXY(__NR_getsockopt,        sys_getsockopt),     // 295
-//ZZ    LINX_(__NR_sendmsg,           sys_sendmsg),        // 296
-//ZZ    LINXY(__NR_recvmsg,           sys_recvmsg),        // 297
 //ZZ    LINX_(__NR_semop,             sys_semop),          // 298 
 //ZZ    LINX_(__NR_semget,            sys_semget),         // 299
 //ZZ    LINXY(__NR_semctl,            sys_semctl),         // 300
@@ -1339,7 +1351,6 @@
 //ZZ    // correspond to what's in include/vki/vki-scnums-arm-linux.h.
 //ZZ    // From here onwards, please ensure the numbers are correct.
 //ZZ 
-//ZZ    LINX_(__NR_pselect6,          sys_pselect6),         // 335
 //ZZ 
 //ZZ    LINXY(__NR_epoll_pwait,       sys_epoll_pwait),      // 346
 //ZZ