changeset 2d9737bf3c2f in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=2d9737bf3c2f
description:
        Processes: Make getting and setting system call arguments part of a 
process object.

diffstat:

47 files changed, 401 insertions(+), 726 deletions(-)
src/arch/SConscript               |    1 
src/arch/alpha/freebsd/system.cc  |    5 -
src/arch/alpha/isa_traits.hh      |    9 +--
src/arch/alpha/linux/process.cc   |   14 ++---
src/arch/alpha/process.cc         |   40 +++++++++++++-
src/arch/alpha/process.hh         |    5 +
src/arch/alpha/syscallreturn.hh   |   59 ---------------------
src/arch/alpha/tru64/process.cc   |   35 ++++++------
src/arch/alpha/utility.cc         |    5 +
src/arch/mips/isa_traits.hh       |   14 -----
src/arch/mips/linux/process.cc    |   14 ++---
src/arch/mips/process.cc          |   34 ++++++++++++
src/arch/mips/process.hh          |    4 +
src/arch/mips/syscallreturn.hh    |   55 --------------------
src/arch/sparc/isa_traits.hh      |    8 --
src/arch/sparc/linux/process.hh   |    1 
src/arch/sparc/linux/syscalls.cc  |    9 +--
src/arch/sparc/process.cc         |   63 +++++++++++++++++++++++
src/arch/sparc/process.hh         |    7 ++
src/arch/sparc/solaris/process.cc |    2 
src/arch/sparc/syscallreturn.hh   |   74 ---------------------------
src/arch/sparc/utility.cc         |    3 -
src/arch/x86/isa_traits.hh        |   12 ----
src/arch/x86/linux/process.hh     |    1 
src/arch/x86/linux/syscalls.cc    |    6 +-
src/arch/x86/process.cc           |   44 ++++++++++++++++
src/arch/x86/process.hh           |    8 ++
src/arch/x86/syscallreturn.hh     |   74 ---------------------------
src/cpu/checker/thread_context.hh |   15 -----
src/cpu/inorder/cpu.cc            |   26 ---------
src/cpu/inorder/cpu.hh            |    9 ---
src/cpu/inorder/thread_context.cc |   18 ------
src/cpu/inorder/thread_context.hh |    9 ---
src/cpu/o3/cpu.cc                 |   35 ------------
src/cpu/o3/cpu.hh                 |   11 ----
src/cpu/o3/thread_context.hh      |    9 ---
src/cpu/o3/thread_context_impl.hh |   25 ---------
src/cpu/ozone/cpu.hh              |   17 ------
src/cpu/ozone/cpu_impl.hh         |   20 -------
src/cpu/simple_thread.hh          |   28 ----------
src/cpu/thread_context.hh         |   17 ------
src/kern/tru64/tru64.hh           |   70 +++++++++++++------------
src/kern/tru64/tru64_events.cc    |    2 
src/sim/process.cc                |    6 --
src/sim/process.hh                |    7 ++
src/sim/syscall_emul.cc           |  101 ++++++++++++++++++-------------------
src/sim/syscall_emul.hh           |   96 ++++++++++++++++++-----------------

diffs (truncated from 2361 to 300 lines):

diff -r f24733876990 -r 2d9737bf3c2f src/arch/SConscript
--- a/src/arch/SConscript       Fri Feb 27 09:21:58 2009 -0800
+++ b/src/arch/SConscript       Fri Feb 27 09:22:14 2009 -0800
@@ -56,7 +56,6 @@
         regfile.hh
         remote_gdb.hh
         stacktrace.hh
-        syscallreturn.hh
         tlb.hh
         types.hh
         utility.hh
diff -r f24733876990 -r 2d9737bf3c2f src/arch/alpha/freebsd/system.cc
--- a/src/arch/alpha/freebsd/system.cc  Fri Feb 27 09:21:58 2009 -0800
+++ b/src/arch/alpha/freebsd/system.cc  Fri Feb 27 09:22:14 2009 -0800
@@ -74,9 +74,8 @@
     Addr ppc_vaddr = 0;
     Addr timer_vaddr = 0;
 
-    assert(NumArgumentRegs >= 3);
-    ppc_vaddr = (Addr)tc->readIntReg(ArgumentReg[1]);
-    timer_vaddr = (Addr)tc->readIntReg(ArgumentReg[2]);
+    ppc_vaddr = (Addr)tc->readIntReg(17);
+    timer_vaddr = (Addr)tc->readIntReg(18);
 
     virtPort.write(ppc_vaddr, (uint32_t)Clock::Frequency);
     virtPort.write(timer_vaddr, (uint32_t)TIMER_FREQUENCY);
diff -r f24733876990 -r 2d9737bf3c2f src/arch/alpha/isa_traits.hh
--- a/src/arch/alpha/isa_traits.hh      Fri Feb 27 09:21:58 2009 -0800
+++ b/src/arch/alpha/isa_traits.hh      Fri Feb 27 09:22:14 2009 -0800
@@ -152,12 +152,9 @@
 const int ReturnValueReg = 0;
 const int FramePointerReg = 15;
 
-const int ArgumentReg[] = {16, 17, 18, 19, 20, 21};
-const int NumArgumentRegs = sizeof(ArgumentReg) / sizeof(const int);
-
-const int SyscallNumReg = ReturnValueReg;
-const int SyscallPseudoReturnReg = ArgumentReg[4];
-const int SyscallSuccessReg = 19;
+const int SyscallNumReg = 0;
+const int FirstArgumentReg = 16;
+const int SyscallPseudoReturnReg = 20;
 
 const int LogVMPageSize = 13;       // 8K bytes
 const int VMPageSize = (1 << LogVMPageSize);
diff -r f24733876990 -r 2d9737bf3c2f src/arch/alpha/linux/process.cc
--- a/src/arch/alpha/linux/process.cc   Fri Feb 27 09:21:58 2009 -0800
+++ b/src/arch/alpha/linux/process.cc   Fri Feb 27 09:22:14 2009 -0800
@@ -48,7 +48,7 @@
 unameFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
           ThreadContext *tc)
 {
-    TypedBufferArg<Linux::utsname> name(tc->getSyscallArg(0));
+    TypedBufferArg<Linux::utsname> name(process->getSyscallArg(tc, 0));
 
     strcpy(name->sysname, "Linux");
     strcpy(name->nodename, "m5.eecs.umich.edu");
@@ -67,13 +67,13 @@
 osf_getsysinfoFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                    ThreadContext *tc)
 {
-    unsigned op = tc->getSyscallArg(0);
-    // unsigned nbytes = tc->getSyscallArg(2);
+    unsigned op = process->getSyscallArg(tc, 0);
+    // unsigned nbytes = process->getSyscallArg(tc, 2);
 
     switch (op) {
 
       case 45: { // GSI_IEEE_FP_CONTROL
-          TypedBufferArg<uint64_t> fpcr(tc->getSyscallArg(1));
+          TypedBufferArg<uint64_t> fpcr(process->getSyscallArg(tc, 1));
           // I don't think this exactly matches the HW FPCR
           *fpcr = 0;
           fpcr.copyOut(tc->getMemPort());
@@ -94,13 +94,13 @@
 osf_setsysinfoFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                    ThreadContext *tc)
 {
-    unsigned op = tc->getSyscallArg(0);
-    // unsigned nbytes = tc->getSyscallArg(2);
+    unsigned op = process->getSyscallArg(tc, 0);
+    // unsigned nbytes = process->getSyscallArg(tc, 2);
 
     switch (op) {
 
       case 14: { // SSI_IEEE_FP_CONTROL
-          TypedBufferArg<uint64_t> fpcr(tc->getSyscallArg(1));
+          TypedBufferArg<uint64_t> fpcr(process->getSyscallArg(tc, 1));
           // I don't think this exactly matches the HW FPCR
           fpcr.copyIn(tc->getMemPort());
           DPRINTFR(SyscallVerbose, "osf_setsysinfo(SSI_IEEE_FP_CONTROL): "
diff -r f24733876990 -r 2d9737bf3c2f src/arch/alpha/process.cc
--- a/src/arch/alpha/process.cc Fri Feb 27 09:21:58 2009 -0800
+++ b/src/arch/alpha/process.cc Fri Feb 27 09:22:14 2009 -0800
@@ -42,6 +42,8 @@
 using namespace AlphaISA;
 using namespace std;
 
+static const int SyscallSuccessReg = 19;
+
 AlphaLiveProcess::AlphaLiveProcess(LiveProcessParams *params,
                                    ObjectFile *objFile)
     : LiveProcess(params, objFile)
@@ -156,12 +158,10 @@
                 (uint8_t*)&(auxv[x].a_val), intSize);
     }
 
-    assert(NumArgumentRegs >= 2);
-
     ThreadContext *tc = system->getThreadContext(contextIds[0]);
 
-    tc->setIntReg(ArgumentReg[0], argc);
-    tc->setIntReg(ArgumentReg[1], argv_array_base);
+    setSyscallArg(tc, 0, argc);
+    setSyscallArg(tc, 1, argv_array_base);
     tc->setIntReg(StackPointerReg, stack_min);
 
     Addr prog_entry = objFile->entryPoint();
@@ -195,3 +195,35 @@
     tc->setMiscRegNoEffect(IPR_DTB_ASN, M5_pid << 57);
 }
 
+AlphaISA::IntReg
+AlphaLiveProcess::getSyscallArg(ThreadContext *tc, int i)
+{
+    assert(i < 6);
+    return tc->readIntReg(FirstArgumentReg + i);
+}
+
+void
+AlphaLiveProcess::setSyscallArg(ThreadContext *tc,
+        int i, AlphaISA::IntReg val)
+{
+    assert(i < 6);
+    tc->setIntReg(FirstArgumentReg + i, val);
+}
+
+void
+AlphaLiveProcess::setSyscallReturn(ThreadContext *tc,
+        SyscallReturn return_value)
+{
+    // check for error condition.  Alpha syscall convention is to
+    // indicate success/failure in reg a3 (r19) and put the
+    // return value itself in the standard return value reg (v0).
+    if (return_value.successful()) {
+        // no error
+        tc->setIntReg(SyscallSuccessReg, 0);
+        tc->setIntReg(ReturnValueReg, return_value.value());
+    } else {
+        // got an error, return details
+        tc->setIntReg(SyscallSuccessReg, (IntReg)-1);
+        tc->setIntReg(ReturnValueReg, -return_value.value());
+    }
+}
diff -r f24733876990 -r 2d9737bf3c2f src/arch/alpha/process.hh
--- a/src/arch/alpha/process.hh Fri Feb 27 09:21:58 2009 -0800
+++ b/src/arch/alpha/process.hh Fri Feb 27 09:22:14 2009 -0800
@@ -42,6 +42,11 @@
     void startup();
 
     void argsInit(int intSize, int pageSize);
+
+  public:
+    AlphaISA::IntReg getSyscallArg(ThreadContext *tc, int i);
+    void setSyscallArg(ThreadContext *tc, int i, AlphaISA::IntReg val);
+    void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
 };
 
 #endif // __ARCH_ALPHA_PROCESS_HH__
diff -r f24733876990 -r 2d9737bf3c2f src/arch/alpha/syscallreturn.hh
--- a/src/arch/alpha/syscallreturn.hh   Fri Feb 27 09:21:58 2009 -0800
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Steve Reinhardt
- *          Gabe Black
- */
-
-#ifndef __ARCH_ALPHA_SYSCALLRETURN_HH__
-#define __ARCH_ALPHA_SYSCALLRETURN_HH__
-
-#include "cpu/thread_context.hh"
-#include "sim/syscallreturn.hh"
-
-namespace AlphaISA {
-
-static inline void
-setSyscallReturn(SyscallReturn return_value, ThreadContext *tc)
-{
-    // check for error condition.  Alpha syscall convention is to
-    // indicate success/failure in reg a3 (r19) and put the
-    // return value itself in the standard return value reg (v0).
-    if (return_value.successful()) {
-        // no error
-        tc->setIntReg(SyscallSuccessReg, 0);
-        tc->setIntReg(ReturnValueReg, return_value.value());
-    } else {
-        // got an error, return details
-        tc->setIntReg(SyscallSuccessReg, (IntReg)-1);
-        tc->setIntReg(ReturnValueReg, -return_value.value());
-    }
-}
-
-} // namespace AlphaISA
-
-#endif // __ARCH_ALPHA_SYSCALLRETURN_HH__
diff -r f24733876990 -r 2d9737bf3c2f src/arch/alpha/tru64/process.cc
--- a/src/arch/alpha/tru64/process.cc   Fri Feb 27 09:21:58 2009 -0800
+++ b/src/arch/alpha/tru64/process.cc   Fri Feb 27 09:22:14 2009 -0800
@@ -45,7 +45,7 @@
 unameFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
           ThreadContext *tc)
 {
-    TypedBufferArg<AlphaTru64::utsname> name(tc->getSyscallArg(0));
+    TypedBufferArg<AlphaTru64::utsname> name(process->getSyscallArg(tc, 0));
 
     strcpy(name->sysname, "OSF1");
     strcpy(name->nodename, "m5.eecs.umich.edu");
@@ -62,34 +62,35 @@
 getsysinfoFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                ThreadContext *tc)
 {
-    unsigned op = tc->getSyscallArg(0);
-    unsigned nbytes = tc->getSyscallArg(2);
+    unsigned op = process->getSyscallArg(tc, 0);
+    unsigned nbytes = process->getSyscallArg(tc, 2);
 
     switch (op) {
 
       case AlphaTru64::GSI_MAX_CPU: {
-          TypedBufferArg<uint32_t> max_cpu(tc->getSyscallArg(1));
+          TypedBufferArg<uint32_t> max_cpu(process->getSyscallArg(tc, 1));
           *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(tc->getSyscallArg(1));
+          TypedBufferArg<uint32_t> cpus_in_box(process->getSyscallArg(tc, 1));
           *cpus_in_box = htog((uint32_t)process->numCpus());
           cpus_in_box.copyOut(tc->getMemPort());
           return 1;
       }
 
       case AlphaTru64::GSI_PHYSMEM: {
-          TypedBufferArg<uint64_t> physmem(tc->getSyscallArg(1));
+          TypedBufferArg<uint64_t> physmem(process->getSyscallArg(tc, 1));
           *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(tc->getSyscallArg(1));
+          TypedBufferArg<AlphaTru64::cpu_info>
+              infop(process->getSyscallArg(tc, 1));
 
           infop->current_cpu = htog(0);
           infop->cpus_in_box = htog(process->numCpus());
@@ -106,14 +107,14 @@
       }
 
       case AlphaTru64::GSI_PROC_TYPE: {
-          TypedBufferArg<uint64_t> proc_type(tc->getSyscallArg(1));
+          TypedBufferArg<uint64_t> proc_type(process->getSyscallArg(tc, 1));
           *proc_type = htog((uint64_t)11);
           proc_type.copyOut(tc->getMemPort());
           return 1;
       }
 
       case AlphaTru64::GSI_PLATFORM_NAME: {
-          BufferArg bufArg(tc->getSyscallArg(1), nbytes);
+          BufferArg bufArg(process->getSyscallArg(tc, 1), nbytes);
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to