X86: Handle 32 bit system call arguments.
authorGabe Black <gblack@eecs.umich.edu>
Fri, 27 Feb 2009 17:22:30 +0000 (09:22 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Fri, 27 Feb 2009 17:22:30 +0000 (09:22 -0800)
src/arch/x86/process.cc

index 7d7978a3519a67b3865cd33b9c15d8c047ccbaaa..232f07934040b71d6b8c5aced47ebb96ff7480f0 100644 (file)
@@ -116,6 +116,14 @@ static const int ArgumentReg[] = {
     INTREG_R9W
 };
 static const int NumArgumentRegs = sizeof(ArgumentReg) / sizeof(const int);
+static const int ArgumentReg32[] = {
+    INTREG_EBX,
+    INTREG_ECX,
+    INTREG_EDX,
+    INTREG_ESI,
+    INTREG_EDI,
+};
+static const int NumArgumentRegs32 = sizeof(ArgumentReg) / sizeof(const int);
 
 X86LiveProcess::X86LiveProcess(LiveProcessParams * params, ObjectFile *objFile,
         SyscallDesc *_syscallDescs, int _numSyscallDescs) :
@@ -260,6 +268,7 @@ I386LiveProcess::startup()
             tc->setMiscRegNoEffect(MISCREG_SEG_EFF_BASE(seg), 0);
             tc->setMiscRegNoEffect(MISCREG_SEG_ATTR(seg), dataAttr);
             tc->setMiscRegNoEffect(MISCREG_SEG_SEL(seg), 0xB);
+            tc->setMiscRegNoEffect(MISCREG_SEG_LIMIT(seg), (uint32_t)(-1));
         }
 
         SegAttr csAttr = 0;
@@ -610,11 +619,13 @@ X86_64LiveProcess::setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val)
 X86ISA::IntReg
 I386LiveProcess::getSyscallArg(ThreadContext *tc, int i)
 {
-    panic("32 bit getSyscallArg not implemented.\n");
+    assert(i < NumArgumentRegs32);
+    return tc->readIntReg(ArgumentReg32[i]);
 }
 
 void
 I386LiveProcess::setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val)
 {
-    panic("32 bit setSyscallArg not implemented.\n");
+    assert(i < NumArgumentRegs);
+    return tc->setIntReg(ArgumentReg[i], val);
 }