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