changeset 4842482e1bd1 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=4842482e1bd1
description:
        Syscalls: Make system calls access arguments like a stack, not an array.

        When accessing arguments for a syscall, the position of an argument 
depends on
        the policies of the ISA, how much space preceding arguments took up, 
and the
        "alignment" of the index for this particular argument into the number of
        possible storate locations. This change adjusts getSyscallArg to take 
its
        index parameter by reference instead of value and to adjust it to point 
to the
        possible location of the next argument on the stack, basically just 
after the
        current one. This way, the rules for the new argument can be applied 
locally
        without knowing about other arguments since those have already been 
taken into
        account implicitly.

        All system calls have also been changed to reflect the new interface. 
In a
        number of cases this made the implementation clearer since it encourages
        arguments to be collected in one place in order and then used as 
necessary
        later, as opposed to scattering them throughout the function or using 
them in
        place in long expressions. It also discourages using getSyscallArg over 
and
        over to retrieve the same value when a temporary would do the job.

diffstat:

27 files changed, 361 insertions(+), 229 deletions(-)
src/arch/alpha/linux/process.cc   |   15 ++-
src/arch/alpha/process.cc         |    4 
src/arch/alpha/process.hh         |    2 
src/arch/alpha/tru64/process.cc   |   41 +++++---
src/arch/arm/linux/process.cc     |   10 +-
src/arch/arm/linux/process.hh     |    2 
src/arch/arm/process.cc           |    4 
src/arch/arm/process.hh           |    2 
src/arch/mips/linux/process.cc    |   19 ++--
src/arch/mips/process.cc          |    4 
src/arch/mips/process.hh          |    2 
src/arch/power/linux/process.cc   |    7 -
src/arch/power/linux/process.hh   |    2 
src/arch/power/process.cc         |    4 
src/arch/power/process.hh         |    2 
src/arch/sparc/linux/syscalls.cc  |   10 +-
src/arch/sparc/process.cc         |    8 -
src/arch/sparc/process.hh         |    4 
src/arch/sparc/solaris/process.cc |    3 
src/arch/x86/linux/syscalls.cc    |   11 +-
src/arch/x86/process.cc           |   19 +++-
src/arch/x86/process.hh           |    5 -
src/kern/tru64/tru64.hh           |   77 ++++++++++------
src/sim/process.cc                |    6 +
src/sim/process.hh                |    4 
src/sim/syscall_emul.cc           |  153 ++++++++++++++++++++-------------
src/sim/syscall_emul.hh           |  170 ++++++++++++++++++++++---------------

diffs (truncated from 1652 to 300 lines):

diff -r deb871e1fc27 -r 4842482e1bd1 src/arch/alpha/linux/process.cc
--- a/src/arch/alpha/linux/process.cc   Wed Oct 28 11:56:56 2009 -0700
+++ b/src/arch/alpha/linux/process.cc   Fri Oct 30 00:44:55 2009 -0700
@@ -48,7 +48,8 @@
 unameFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
           ThreadContext *tc)
 {
-    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, 0));
+    int index = 0;
+    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "m5.eecs.umich.edu");
@@ -67,13 +68,15 @@
 osf_getsysinfoFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                    ThreadContext *tc)
 {
-    unsigned op = process->getSyscallArg(tc, 0);
+    int index = 0;
+    unsigned op = process->getSyscallArg(tc, index);
+    Addr bufPtr = process->getSyscallArg(tc, index);
     // unsigned nbytes = process->getSyscallArg(tc, 2);
 
     switch (op) {
 
       case 45: { // GSI_IEEE_FP_CONTROL
-          TypedBufferArg<uint64_t> fpcr(process->getSyscallArg(tc, 1));
+          TypedBufferArg<uint64_t> fpcr(bufPtr);
           // I don't think this exactly matches the HW FPCR
           *fpcr = 0;
           fpcr.copyOut(tc->getMemPort());
@@ -94,13 +97,15 @@
 osf_setsysinfoFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                    ThreadContext *tc)
 {
-    unsigned op = process->getSyscallArg(tc, 0);
+    int index = 0;
+    unsigned op = process->getSyscallArg(tc, index);
+    Addr bufPtr = process->getSyscallArg(tc, index);
     // unsigned nbytes = process->getSyscallArg(tc, 2);
 
     switch (op) {
 
       case 14: { // SSI_IEEE_FP_CONTROL
-          TypedBufferArg<uint64_t> fpcr(process->getSyscallArg(tc, 1));
+          TypedBufferArg<uint64_t> fpcr(bufPtr);
           // I don't think this exactly matches the HW FPCR
           fpcr.copyIn(tc->getMemPort());
           DPRINTFR(SyscallVerbose, "osf_setsysinfo(SSI_IEEE_FP_CONTROL): "
diff -r deb871e1fc27 -r 4842482e1bd1 src/arch/alpha/process.cc
--- a/src/arch/alpha/process.cc Wed Oct 28 11:56:56 2009 -0700
+++ b/src/arch/alpha/process.cc Fri Oct 30 00:44:55 2009 -0700
@@ -193,10 +193,10 @@
 }
 
 AlphaISA::IntReg
-AlphaLiveProcess::getSyscallArg(ThreadContext *tc, int i)
+AlphaLiveProcess::getSyscallArg(ThreadContext *tc, int &i)
 {
     assert(i < 6);
-    return tc->readIntReg(FirstArgumentReg + i);
+    return tc->readIntReg(FirstArgumentReg + i++);
 }
 
 void
diff -r deb871e1fc27 -r 4842482e1bd1 src/arch/alpha/process.hh
--- a/src/arch/alpha/process.hh Wed Oct 28 11:56:56 2009 -0700
+++ b/src/arch/alpha/process.hh Fri Oct 30 00:44:55 2009 -0700
@@ -44,7 +44,7 @@
     void argsInit(int intSize, int pageSize);
 
   public:
-    AlphaISA::IntReg getSyscallArg(ThreadContext *tc, int i);
+    AlphaISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
     void setSyscallArg(ThreadContext *tc, int i, AlphaISA::IntReg val);
     void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
 };
diff -r deb871e1fc27 -r 4842482e1bd1 src/arch/alpha/tru64/process.cc
--- a/src/arch/alpha/tru64/process.cc   Wed Oct 28 11:56:56 2009 -0700
+++ b/src/arch/alpha/tru64/process.cc   Fri Oct 30 00:44:55 2009 -0700
@@ -45,7 +45,8 @@
 unameFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
           ThreadContext *tc)
 {
-    TypedBufferArg<AlphaTru64::utsname> name(process->getSyscallArg(tc, 0));
+    int index = 0;
+    TypedBufferArg<AlphaTru64::utsname> name(process->getSyscallArg(tc, 
index));
 
     strcpy(name->sysname, "OSF1");
     strcpy(name->nodename, "m5.eecs.umich.edu");
@@ -62,35 +63,36 @@
 getsysinfoFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                ThreadContext *tc)
 {
-    unsigned op = process->getSyscallArg(tc, 0);
-    unsigned nbytes = process->getSyscallArg(tc, 2);
+    int index = 0;
+    unsigned op = process->getSyscallArg(tc, index);
+    Addr bufPtr = process->getSyscallArg(tc, index);
+    unsigned nbytes = process->getSyscallArg(tc, index);
 
     switch (op) {
 
       case AlphaTru64::GSI_MAX_CPU: {
-          TypedBufferArg<uint32_t> max_cpu(process->getSyscallArg(tc, 1));
+          TypedBufferArg<uint32_t> max_cpu(bufPtr);
           *max_cpu = htog((uint32_t)process->numCpus());
           max_cpu.copyOut(tc->getMemPort());
           return 1;
       }
 
       case AlphaTru64::GSI_CPUS_IN_BOX: {
-          TypedBufferArg<uint32_t> cpus_in_box(process->getSyscallArg(tc, 1));
+          TypedBufferArg<uint32_t> cpus_in_box(bufPtr);
           *cpus_in_box = htog((uint32_t)process->numCpus());
           cpus_in_box.copyOut(tc->getMemPort());
           return 1;
       }
 
       case AlphaTru64::GSI_PHYSMEM: {
-          TypedBufferArg<uint64_t> physmem(process->getSyscallArg(tc, 1));
+          TypedBufferArg<uint64_t> physmem(bufPtr);
           *physmem = htog((uint64_t)1024 * 1024);  // physical memory in KB
           physmem.copyOut(tc->getMemPort());
           return 1;
       }
 
       case AlphaTru64::GSI_CPU_INFO: {
-          TypedBufferArg<AlphaTru64::cpu_info>
-              infop(process->getSyscallArg(tc, 1));
+          TypedBufferArg<AlphaTru64::cpu_info> infop(bufPtr);
 
           infop->current_cpu = htog(0);
           infop->cpus_in_box = htog(process->numCpus());
@@ -107,14 +109,14 @@
       }
 
       case AlphaTru64::GSI_PROC_TYPE: {
-          TypedBufferArg<uint64_t> proc_type(process->getSyscallArg(tc, 1));
+          TypedBufferArg<uint64_t> proc_type(bufPtr);
           *proc_type = htog((uint64_t)11);
           proc_type.copyOut(tc->getMemPort());
           return 1;
       }
 
       case AlphaTru64::GSI_PLATFORM_NAME: {
-          BufferArg bufArg(process->getSyscallArg(tc, 1), nbytes);
+          BufferArg bufArg(bufPtr, nbytes);
           strncpy((char *)bufArg.bufferPtr(),
                   "COMPAQ Professional Workstation XP1000",
                   nbytes);
@@ -123,7 +125,7 @@
       }
 
       case AlphaTru64::GSI_CLK_TCK: {
-          TypedBufferArg<uint64_t> clk_hz(process->getSyscallArg(tc, 1));
+          TypedBufferArg<uint64_t> clk_hz(bufPtr);
           *clk_hz = htog((uint64_t)1024);
           clk_hz.copyOut(tc->getMemPort());
           return 1;
@@ -142,12 +144,13 @@
 setsysinfoFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                ThreadContext *tc)
 {
-    unsigned op = process->getSyscallArg(tc, 0);
+    int index = 0;
+    unsigned op = process->getSyscallArg(tc, index);
 
     switch (op) {
       case AlphaTru64::SSI_IEEE_FP_CONTROL:
         warn("setsysinfo: ignoring ieee_set_fp_control() arg 0x%x\n",
-             process->getSyscallArg(tc, 1));
+             process->getSyscallArg(tc, index));
         break;
 
       default:
@@ -165,17 +168,19 @@
 {
     using namespace std;
 
-    int id = process->getSyscallArg(tc, 0);      // table ID
-    int index = process->getSyscallArg(tc, 1);   // index into table
+    int argIndex = 0;
+    int id = process->getSyscallArg(tc, argIndex);    // table ID
+    int index = process->getSyscallArg(tc, argIndex); // index into table
+    Addr bufPtr = process->getSyscallArg(tc, argIndex);
     // arg 2 is buffer pointer; type depends on table ID
-    int nel = process->getSyscallArg(tc, 3);     // number of elements
-    int lel = process->getSyscallArg(tc, 4);     // expected element size
+    int nel = process->getSyscallArg(tc, argIndex);   // number of elements
+    int lel = process->getSyscallArg(tc, argIndex);   // expected element size
 
     switch (id) {
       case AlphaTru64::TBL_SYSINFO: {
           if (index != 0 || nel != 1 || lel != sizeof(Tru64::tbl_sysinfo))
               return -EINVAL;
-          TypedBufferArg<Tru64::tbl_sysinfo> elp(process->getSyscallArg(tc, 
2));
+          TypedBufferArg<Tru64::tbl_sysinfo> elp(bufPtr);
 
           const int clk_hz = one_million;
           elp->si_user = htog(curTick / (Clock::Frequency / clk_hz));
diff -r deb871e1fc27 -r 4842482e1bd1 src/arch/arm/linux/process.cc
--- a/src/arch/arm/linux/process.cc     Wed Oct 28 11:56:56 2009 -0700
+++ b/src/arch/arm/linux/process.cc     Fri Oct 30 00:44:55 2009 -0700
@@ -50,7 +50,8 @@
 unameFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
           ThreadContext *tc)
 {
-    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, 0));
+    int index = 0;
+    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "m5.eecs.umich.edu");
@@ -417,7 +418,8 @@
 setTLSFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
           ThreadContext *tc)
 {
-    uint32_t tlsPtr = process->getSyscallArg(tc, 0);
+    int index = 0;
+    uint32_t tlsPtr = process->getSyscallArg(tc, index);
 
     tc->getMemPort()->writeBlob(ArmLinuxProcess::commPage + 0x0ff0,
                                 (uint8_t *)&tlsPtr, sizeof(tlsPtr));
@@ -511,12 +513,12 @@
 }
 
 ArmISA::IntReg
-ArmLinuxProcess::getSyscallArg(ThreadContext *tc, int i)
+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);
+    return tc->readIntReg(ArgumentReg0 + i++);
 }
 
 void
diff -r deb871e1fc27 -r 4842482e1bd1 src/arch/arm/linux/process.hh
--- a/src/arch/arm/linux/process.hh     Wed Oct 28 11:56:56 2009 -0700
+++ b/src/arch/arm/linux/process.hh     Fri Oct 30 00:44:55 2009 -0700
@@ -44,7 +44,7 @@
 
     void startup();
 
-    ArmISA::IntReg getSyscallArg(ThreadContext *tc, int i);
+    ArmISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
     void setSyscallArg(ThreadContext *tc, int i, ArmISA::IntReg val);
 
     /// The target system's hostname.
diff -r deb871e1fc27 -r 4842482e1bd1 src/arch/arm/process.cc
--- a/src/arch/arm/process.cc   Wed Oct 28 11:56:56 2009 -0700
+++ b/src/arch/arm/process.cc   Fri Oct 30 00:44:55 2009 -0700
@@ -324,10 +324,10 @@
 }
 
 ArmISA::IntReg
-ArmLiveProcess::getSyscallArg(ThreadContext *tc, int i)
+ArmLiveProcess::getSyscallArg(ThreadContext *tc, int &i)
 {
     assert(i < 4);
-    return tc->readIntReg(ArgumentReg0 + i);
+    return tc->readIntReg(ArgumentReg0 + i++);
 }
 
 void
diff -r deb871e1fc27 -r 4842482e1bd1 src/arch/arm/process.hh
--- a/src/arch/arm/process.hh   Wed Oct 28 11:56:56 2009 -0700
+++ b/src/arch/arm/process.hh   Fri Oct 30 00:44:55 2009 -0700
@@ -53,7 +53,7 @@
   public:
     void argsInit(int intSize, int pageSize);
 
-    ArmISA::IntReg getSyscallArg(ThreadContext *tc, int i);
+    ArmISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
     void setSyscallArg(ThreadContext *tc, int i, ArmISA::IntReg val);
     void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
 };
diff -r deb871e1fc27 -r 4842482e1bd1 src/arch/mips/linux/process.cc
--- a/src/arch/mips/linux/process.cc    Wed Oct 28 11:56:56 2009 -0700
+++ b/src/arch/mips/linux/process.cc    Fri Oct 30 00:44:55 2009 -0700
@@ -51,7 +51,8 @@
 unameFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
           ThreadContext *tc)
 {
-    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, 0));
+    int index = 0;
+    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, index));
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename,"m5.eecs.umich.edu");
@@ -70,14 +71,16 @@
 sys_getsysinfoFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                    ThreadContext *tc)
 {
-    unsigned op = process->getSyscallArg(tc, 0);
-    // unsigned nbytes = process->getSyscallArg(tc, 2);
+    int index = 0;
+    unsigned op = process->getSyscallArg(tc, index);
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to