arch,sim: Convert clone to GuestABI and define a cloneBackwardsFunc.

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>
This commit is contained in:
Gabe Black
2019-11-27 23:03:14 -08:00
parent 382dda67dc
commit ca867678a6
3 changed files with 17 additions and 23 deletions

View 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" },

View 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" }},

View 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