syscall: Resolve conflicts between m5threads and Gabe's recent SE changes.
authorSteve Reinhardt <steve.reinhardt@amd.com>
Tue, 21 Apr 2009 15:17:36 +0000 (08:17 -0700)
committerSteve Reinhardt <steve.reinhardt@amd.com>
Tue, 21 Apr 2009 15:17:36 +0000 (08:17 -0700)
src/arch/alpha/isa_traits.hh
src/arch/alpha/process.cc
src/arch/mips/isa_traits.hh
src/arch/mips/process.cc
src/arch/sparc/isa_traits.hh
src/arch/sparc/process.cc
src/arch/x86/isa_traits.hh
src/arch/x86/process.cc
src/sim/syscall_emul.cc

index d37a769ea171f26b5d6547065a8a1c1e6899a014..ab3af0a1d7fda870959175713a8bfa98a2ad6e9b 100644 (file)
@@ -155,6 +155,7 @@ const int FramePointerReg = 15;
 const int SyscallNumReg = 0;
 const int FirstArgumentReg = 16;
 const int SyscallPseudoReturnReg = 20;
+const int SyscallSuccessReg = 19;
 
 const int LogVMPageSize = 13;       // 8K bytes
 const int VMPageSize = (1 << LogVMPageSize);
index 9c6e62815d75d94786c82e0cc8265cc6dbc16de4..093d83d8a4131aa36e911f81ff4c4243517c92e4 100644 (file)
@@ -42,8 +42,6 @@
 using namespace AlphaISA;
 using namespace std;
 
-static const int SyscallSuccessReg = 19;
-
 AlphaLiveProcess::AlphaLiveProcess(LiveProcessParams *params,
                                    ObjectFile *objFile)
     : LiveProcess(params, objFile)
index 59c2c00a2bb9d60bc2508ad4e8b204bc9e76554f..fb46890c1c39101c8995bbb52e38ac25c08ee074 100644 (file)
@@ -188,6 +188,10 @@ namespace MipsISA
     // semantically meaningful register indices
     const int ZeroReg = 0;
     const int AssemblerReg = 1;
+    const int SyscallSuccessReg = 7;
+    const int FirstArgumentReg = 4;
+    const int ReturnValueReg = 2;
+
     const int KernelReg0 = 26;
     const int KernelReg1 = 27;
     const int GlobalPointerReg = 28;
index 784ddfe33ff355310a9ae67d8c47aba4f93b0112..3e9fb7c20e8c416bcde37b2e5e39f26a2fefe20f 100644 (file)
 using namespace std;
 using namespace MipsISA;
 
-static const int SyscallSuccessReg = 7;
-static const int FirstArgumentReg = 4;
-static const int ReturnValueReg = 2;
-
 MipsLiveProcess::MipsLiveProcess(LiveProcessParams * params,
         ObjectFile *objFile)
     : LiveProcess(params, objFile)
index 501f2f9903b63445ccca28a7a963c510876865f5..9833057a26451ee56614e82b2995109c2ba08957 100644 (file)
@@ -69,6 +69,7 @@ namespace SparcISA
     const int ZeroReg = 0;      // architecturally meaningful
     // the rest of these depend on the ABI
     const int ReturnAddressReg = 31; // post call, precall is 15
+    const int ReturnValueReg = 8;  // Post return, 24 is pre-return.
     const int StackPointerReg = 14;
     const int FramePointerReg = 30;
 
index b2b539816b5f5247e045e60098ca6126e638db31..533e385b36e0e4ba15720fad87f9b8f2d7816bbd 100644 (file)
@@ -47,7 +47,6 @@ using namespace std;
 using namespace SparcISA;
 
 static const int FirstArgumentReg = 8;
-static const int ReturnValueReg = 8;
 
 
 SparcLiveProcess::SparcLiveProcess(LiveProcessParams * params,
index d25e0eb706eb67ef7d3cd1d2c31a75e3af3d581b..09241c3107a2713f334ebb92ba4426a9ac97913f 100644 (file)
@@ -106,6 +106,7 @@ namespace X86ISA
     const int StackPointerReg = INTREG_RSP;
     //X86 doesn't seem to have a link register
     const int ReturnAddressReg = 0;
+    const int ReturnValueReg = INTREG_RAX;
     const int FramePointerReg = INTREG_RBP;
 
     // Some OS syscalls use a second register (rdx) to return a second
index 4a61ed1687f11cd60e552a8c5b548b6285d1be3d..43dd4a5918b93ac0a4e65c498db467b6afe52230 100644 (file)
 using namespace std;
 using namespace X86ISA;
 
-static const int ReturnValueReg = INTREG_RAX;
 static const int ArgumentReg[] = {
     INTREG_RDI,
     INTREG_RSI,
index d3161de26ce8592f76f17fc062267f19fd320023..6928b9e4adca9446abb9ed4e9e76e4d70bb44f36 100644 (file)
@@ -659,12 +659,12 @@ cloneFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
            ThreadContext *tc)
 {
     DPRINTF(SyscallVerbose, "In sys_clone:\n");
-    DPRINTF(SyscallVerbose, " Flags=%llx\n", tc->getSyscallArg(0));
-    DPRINTF(SyscallVerbose, " Child stack=%llx\n", tc->getSyscallArg(1));
+    DPRINTF(SyscallVerbose, " Flags=%llx\n", process->getSyscallArg(tc, 0));
+    DPRINTF(SyscallVerbose, " Child stack=%llx\n", process->getSyscallArg(tc, 1));
 
 
-    if (tc->getSyscallArg(0) != 0x10f00) {
-        warn("This sys_clone implementation assumes flags CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD (0x10f00), and may not work correctly with given flags 0x%llx\n", tc->getSyscallArg(0));
+    if (process->getSyscallArg(tc, 0) != 0x10f00) {
+        warn("This sys_clone implementation assumes flags CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD (0x10f00), and may not work correctly with given flags 0x%llx\n", process->getSyscallArg(tc, 0));
     }
 
     ThreadContext* ctc; //child thread context
@@ -697,14 +697,14 @@ cloneFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
         #endif
 
         //Set up stack register
-        ctc->setIntReg(TheISA::StackPointerReg, tc->getSyscallArg(1));
+        ctc->setIntReg(TheISA::StackPointerReg, process->getSyscallArg(tc, 1));
 
         //Set up syscall return values in parent and child
         ctc->setIntReg(ReturnValueReg, 0); //return value, child
 
         //Alpha needs SyscallSuccessReg=0 in child
         #if THE_ISA == ALPHA_ISA
-            ctc->setIntReg(SyscallSuccessReg, 0);
+            ctc->setIntReg(TheISA::SyscallSuccessReg, 0);
         #endif
 
         //In SPARC/Linux, clone returns 0 on pseudo-return register if parent, non-zero if child