From b394242240db749b6a85e3e269c858d9cbd1aa69 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 9 Jun 2009 23:41:45 -0700 Subject: ARM: Hook in the mmap2 system call. Make ArmLinuxProcess handle 5,6 syscall params. --- src/arch/arm/linux/process.cc | 20 +++++++++++++++++++- src/arch/arm/linux/process.hh | 3 +++ 2 files changed, 22 insertions(+), 1 deletion(-) (limited to 'src/arch/arm/linux') 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; -- cgit v1.2.3