ARM: Hook in the mmap2 system call. Make ArmLinuxProcess handle 5,6 syscall params.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 10 Jun 2009 06:41:45 +0000 (23:41 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 10 Jun 2009 06:41:45 +0000 (23:41 -0700)
src/arch/arm/linux/process.cc
src/arch/arm/linux/process.hh

index a36d1fd8fecaa622585636e580d29e858ef7b16b..7158acfffc1e0aa3b3abb3b3470029efe25ec65a 100644 (file)
@@ -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<ArmLinux>),
     /* 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);
+}
index 835b94161af1724ca8b2730c282fe3f5993d6878..53b3781d23c88d88e37e14cd743720bfe51ee311 100644 (file)
@@ -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;