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