From: Gabe Black Date: Wed, 10 Jun 2009 06:41:45 +0000 (-0700) Subject: ARM: Hook in the mmap2 system call. Make ArmLinuxProcess handle 5,6 syscall params. X-Git-Tag: Calvin_Submission~281 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b394242240db749b6a85e3e269c858d9cbd1aa69;p=gem5.git ARM: Hook in the mmap2 system call. Make ArmLinuxProcess handle 5,6 syscall params. --- diff --git a/src/arch/arm/linux/process.cc b/src/arch/arm/linux/process.cc index a36d1fd8f..7158acfff 100644 --- a/src/arch/arm/linux/process.cc +++ b/src/arch/arm/linux/process.cc @@ -255,7 +255,7 @@ SyscallDesc ArmLinuxProcess::syscallDescs[] = { /* 189 */ SyscallDesc("putpmsg", unimplementedFunc), /* 190 */ SyscallDesc("vfork", unimplementedFunc), /* 191 */ SyscallDesc("getrlimit", unimplementedFunc), - /* 192 */ SyscallDesc("mmap2", unimplementedFunc), + /* 192 */ SyscallDesc("mmap2", mmapFunc), /* 193 */ SyscallDesc("truncate64", unimplementedFunc), /* 194 */ SyscallDesc("ftruncate64", unimplementedFunc), /* 195 */ SyscallDesc("stat64", unimplementedFunc), @@ -509,3 +509,21 @@ ArmLinuxProcess::startup() }; tc->getMemPort()->writeBlob(commPage + 0x0fe0, get_tls, sizeof(get_tls)); } + +ArmISA::IntReg +ArmLinuxProcess::getSyscallArg(ThreadContext *tc, int i) +{ + // Linux apparently allows more parameter than the ABI says it should. + // This limit may need to be increased even further. + assert(i < 6); + return tc->readIntReg(ArgumentReg0 + i); +} + +void +ArmLinuxProcess::setSyscallArg(ThreadContext *tc, int i, ArmISA::IntReg val) +{ + // Linux apparently allows more parameter than the ABI says it should. + // This limit may need to be increased even further. + assert(i < 6); + tc->setIntReg(ArgumentReg0 + i, val); +} diff --git a/src/arch/arm/linux/process.hh b/src/arch/arm/linux/process.hh index 835b94161..53b3781d2 100644 --- a/src/arch/arm/linux/process.hh +++ b/src/arch/arm/linux/process.hh @@ -44,6 +44,9 @@ class ArmLinuxProcess : public ArmLiveProcess void startup(); + ArmISA::IntReg getSyscallArg(ThreadContext *tc, int i); + void setSyscallArg(ThreadContext *tc, int i, ArmISA::IntReg val); + /// The target system's hostname. static const char *hostname;