arch,sim: Convert clone to GuestABI and define a cloneBackwardsFunc.
authorGabe Black <gabeblack@google.com>
Thu, 28 Nov 2019 07:03:14 +0000 (23:03 -0800)
committerGabe Black <gabeblack@google.com>
Thu, 12 Mar 2020 00:43:28 +0000 (00:43 +0000)
cloneBackwardsFunc takes its arguments in the order specified for
ARM and RISCV. Because of the new GuestABI mechanism, it can be a
simple wrapper around the normal clone implementation without the need
for #ifdefs.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-187

Change-Id: Iff1ffd6774b9162185a124585e9507a5bdbc46f4
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23198
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/arm/linux/process.cc
src/arch/riscv/linux/process.cc
src/sim/syscall_emul.hh

index e3f5481603a6ca6f0c59f1c33ad506c57070f1ca..1f9feaeebd7a845ad70033443847dcd0c8b361ce 100644 (file)
@@ -280,7 +280,7 @@ static SyscallDescABI<DefaultSyscallABI> syscallDescs32[] = {
     /* 117 */ { "ipc" },
     /* 118 */ { "fsync" },
     /* 119 */ { "sigreturn" },
-    /* 120 */ { "clone", cloneFunc<ArmLinux32> },
+    /* 120 */ { "clone", cloneBackwardsFunc<ArmLinux32> },
     /* 121 */ { "setdomainname" },
     /* 122 */ { "uname", unameFunc32 },
     /* 123 */ { "unused#123" },
@@ -761,7 +761,7 @@ static SyscallDescABI<DefaultSyscallABI> syscallDescs64[] = {
     /*  217 */ { "add_key" },
     /*  218 */ { "request_key" },
     /*  219 */ { "keyctl" },
-    /*  220 */ { "clone", cloneFunc<ArmLinux64> },
+    /*  220 */ { "clone", cloneBackwardsFunc<ArmLinux64> },
     /*  221 */ { "execve", execveFunc<ArmLinux64> },
     /*  222 */ { "mmap2", mmapFunc<ArmLinux64> },
     /*  223 */ { "fadvise64_64" },
index 3afbd131b9c01d8a2578926458ec9c7ffed9e5a8..acf6989123e811a76ff18143e53bb5c97b04b32e 100644 (file)
@@ -339,7 +339,7 @@ std::map<int, SyscallDescABI<DefaultSyscallABI>>
     {217,  { "add_key" }},
     {218,  { "request_key" }},
     {219,  { "keyctl" }},
-    {220,  { "clone", cloneFunc<RiscvLinux64> }},
+    {220,  { "clone", cloneBackwardsFunc<RiscvLinux64> }},
     {221,  { "execve", execveFunc<RiscvLinux64> }},
     {222,  { "mmap", mmapFunc<RiscvLinux64> }},
     {223,  { "fadvise64" }},
@@ -671,7 +671,7 @@ std::map<int, SyscallDescABI<DefaultSyscallABI>>
     {217,  { "add_key" }},
     {218,  { "request_key" }},
     {219,  { "keyctl" }},
-    {220,  { "clone", cloneFunc<RiscvLinux32> }},
+    {220,  { "clone", cloneBackwardsFunc<RiscvLinux32> }},
     {221,  { "execve", execveFunc<RiscvLinux32> }},
     {222,  { "mmap", mmapFunc<RiscvLinux32> }},
     {223,  { "fadvise64" }},
index 5a4811fb2c40737ccbb1e36451499f616bd22148..44bb147511b88153ea280dedfa2eaac42ba1e47d 100644 (file)
@@ -1446,27 +1446,11 @@ statfsFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
 
 template <class OS>
 SyscallReturn
-cloneFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
+cloneFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
+          RegVal flags, RegVal newStack, Addr ptidPtr,
+          Addr ctidPtr, Addr tlsPtr)
 {
-    int index = 0;
-
     auto p = tc->getProcessPtr();
-    RegVal flags = p->getSyscallArg(tc, index);
-    RegVal newStack = p->getSyscallArg(tc, index);
-    Addr ptidPtr = p->getSyscallArg(tc, index);
-
-#if THE_ISA == RISCV_ISA or THE_ISA == ARM_ISA
-    /**
-     * Linux sets CLONE_BACKWARDS flag for RISC-V and Arm.
-     * The flag defines the list of clone() arguments in the following
-     * order: flags -> newStack -> ptidPtr -> tlsPtr -> ctidPtr
-     */
-    Addr tlsPtr = p->getSyscallArg(tc, index);
-    Addr ctidPtr = p->getSyscallArg(tc, index);
-#else
-    Addr ctidPtr = p->getSyscallArg(tc, index);
-    Addr tlsPtr = p->getSyscallArg(tc, index);
-#endif
 
     if (((flags & OS::TGT_CLONE_SIGHAND)&& !(flags & OS::TGT_CLONE_VM)) ||
         ((flags & OS::TGT_CLONE_THREAD) && !(flags & OS::TGT_CLONE_SIGHAND)) ||
@@ -1583,6 +1567,16 @@ cloneFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
     return cp->pid();
 }
 
+template <class OS>
+SyscallReturn
+cloneBackwardsFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
+                   RegVal flags, RegVal newStack, Addr ptidPtr,
+                   Addr tlsPtr, Addr ctidPtr)
+{
+    return cloneFunc<OS>(desc, callnum, tc, flags, newStack, ptidPtr,
+                         ctidPtr, tlsPtr);
+}
+
 /// Target fstatfs() handler.
 template <class OS>
 SyscallReturn