Processes: Make getting and setting system call arguments part of a process object.
This commit is contained in:
@@ -616,12 +616,10 @@ LiveProcess::argsInit(int intSize, int pageSize)
|
||||
copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem);
|
||||
copyStringArray(envp, envp_array_base, env_data_base, initVirtMem);
|
||||
|
||||
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();
|
||||
|
||||
@@ -44,9 +44,11 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "arch/types.hh"
|
||||
#include "base/statistics.hh"
|
||||
#include "sim/host.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
#include "sim/syscallreturn.hh"
|
||||
|
||||
class GDBListener;
|
||||
class PageTable;
|
||||
@@ -321,6 +323,11 @@ class LiveProcess : public Process
|
||||
std::string getcwd() const { return cwd; }
|
||||
|
||||
virtual void syscall(int64_t callnum, ThreadContext *tc);
|
||||
virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int i) = 0;
|
||||
virtual void setSyscallArg(ThreadContext *tc,
|
||||
int i, TheISA::IntReg val) = 0;
|
||||
virtual void setSyscallReturn(ThreadContext *tc,
|
||||
SyscallReturn return_value) = 0;
|
||||
|
||||
virtual SyscallDesc* getDesc(int callnum) = 0;
|
||||
|
||||
|
||||
@@ -53,8 +53,8 @@ SyscallDesc::doSyscall(int callnum, LiveProcess *process, ThreadContext *tc)
|
||||
{
|
||||
DPRINTFR(SyscallVerbose, "%d: %s: syscall %s called w/arguments %d,%d,%d,%d\n",
|
||||
curTick,tc->getCpuPtr()->name(), name,
|
||||
tc->getSyscallArg(0),tc->getSyscallArg(1),
|
||||
tc->getSyscallArg(2),tc->getSyscallArg(3));
|
||||
process->getSyscallArg(tc, 0), process->getSyscallArg(tc, 1),
|
||||
process->getSyscallArg(tc, 2), process->getSyscallArg(tc, 3));
|
||||
|
||||
SyscallReturn retval = (*funcPtr)(this, callnum, process, tc);
|
||||
|
||||
@@ -62,7 +62,7 @@ SyscallDesc::doSyscall(int callnum, LiveProcess *process, ThreadContext *tc)
|
||||
curTick,tc->getCpuPtr()->name(), name, retval.value());
|
||||
|
||||
if (!(flags & SyscallDesc::SuppressReturnValue))
|
||||
tc->setSyscallReturn(retval);
|
||||
process->setSyscallReturn(tc, retval);
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ ignoreFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
warn("ignoring syscall %s(%d, %d, ...)", desc->name,
|
||||
tc->getSyscallArg(0), tc->getSyscallArg(1));
|
||||
process->getSyscallArg(tc, 0), process->getSyscallArg(tc, 1));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -92,7 +92,8 @@ exitFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
if (tc->exit()) {
|
||||
exitSimLoop("target called exit()", tc->getSyscallArg(0) & 0xff);
|
||||
exitSimLoop("target called exit()",
|
||||
process->getSyscallArg(tc, 0) & 0xff);
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -110,7 +111,7 @@ SyscallReturn
|
||||
brkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
// change brk addr to first arg
|
||||
Addr new_brk = tc->getSyscallArg(0);
|
||||
Addr new_brk = p->getSyscallArg(tc, 0);
|
||||
|
||||
// in Linux at least, brk(0) returns the current break value
|
||||
// (note that the syscall and the glibc function have different behavior)
|
||||
@@ -136,7 +137,7 @@ brkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
SyscallReturn
|
||||
closeFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
int target_fd = tc->getSyscallArg(0);
|
||||
int target_fd = p->getSyscallArg(tc, 0);
|
||||
int status = close(p->sim_fd(target_fd));
|
||||
if (status >= 0)
|
||||
p->free_fd(target_fd);
|
||||
@@ -147,9 +148,9 @@ closeFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
SyscallReturn
|
||||
readFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
int fd = p->sim_fd(tc->getSyscallArg(0));
|
||||
int nbytes = tc->getSyscallArg(2);
|
||||
BufferArg bufArg(tc->getSyscallArg(1), nbytes);
|
||||
int fd = p->sim_fd(p->getSyscallArg(tc, 0));
|
||||
int nbytes = p->getSyscallArg(tc, 2);
|
||||
BufferArg bufArg(p->getSyscallArg(tc, 1), nbytes);
|
||||
|
||||
int bytes_read = read(fd, bufArg.bufferPtr(), nbytes);
|
||||
|
||||
@@ -162,9 +163,9 @@ readFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
SyscallReturn
|
||||
writeFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
int fd = p->sim_fd(tc->getSyscallArg(0));
|
||||
int nbytes = tc->getSyscallArg(2);
|
||||
BufferArg bufArg(tc->getSyscallArg(1), nbytes);
|
||||
int fd = p->sim_fd(p->getSyscallArg(tc, 0));
|
||||
int nbytes = p->getSyscallArg(tc, 2);
|
||||
BufferArg bufArg(p->getSyscallArg(tc, 1), nbytes);
|
||||
|
||||
bufArg.copyIn(tc->getMemPort());
|
||||
|
||||
@@ -179,9 +180,9 @@ writeFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
SyscallReturn
|
||||
lseekFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
int fd = p->sim_fd(tc->getSyscallArg(0));
|
||||
uint64_t offs = tc->getSyscallArg(1);
|
||||
int whence = tc->getSyscallArg(2);
|
||||
int fd = p->sim_fd(p->getSyscallArg(tc, 0));
|
||||
uint64_t offs = p->getSyscallArg(tc, 1);
|
||||
int whence = p->getSyscallArg(tc, 2);
|
||||
|
||||
off_t result = lseek(fd, offs, whence);
|
||||
|
||||
@@ -192,11 +193,11 @@ lseekFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
SyscallReturn
|
||||
_llseekFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
int fd = p->sim_fd(tc->getSyscallArg(0));
|
||||
uint64_t offset_high = tc->getSyscallArg(1);
|
||||
uint32_t offset_low = tc->getSyscallArg(2);
|
||||
Addr result_ptr = tc->getSyscallArg(3);
|
||||
int whence = tc->getSyscallArg(4);
|
||||
int fd = p->sim_fd(p->getSyscallArg(tc, 0));
|
||||
uint64_t offset_high = p->getSyscallArg(tc, 1);
|
||||
uint32_t offset_low = p->getSyscallArg(tc, 2);
|
||||
Addr result_ptr = p->getSyscallArg(tc, 3);
|
||||
int whence = p->getSyscallArg(tc, 4);
|
||||
|
||||
uint64_t offset = (offset_high << 32) | offset_low;
|
||||
|
||||
@@ -235,8 +236,8 @@ const char *hostname = "m5.eecs.umich.edu";
|
||||
SyscallReturn
|
||||
gethostnameFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
int name_len = tc->getSyscallArg(1);
|
||||
BufferArg name(tc->getSyscallArg(0), name_len);
|
||||
int name_len = p->getSyscallArg(tc, 1);
|
||||
BufferArg name(p->getSyscallArg(tc, 0), name_len);
|
||||
|
||||
strncpy((char *)name.bufferPtr(), hostname, name_len);
|
||||
|
||||
@@ -249,8 +250,8 @@ SyscallReturn
|
||||
getcwdFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
int result = 0;
|
||||
unsigned long size = tc->getSyscallArg(1);
|
||||
BufferArg buf(tc->getSyscallArg(0), size);
|
||||
unsigned long size = p->getSyscallArg(tc, 1);
|
||||
BufferArg buf(p->getSyscallArg(tc, 0), size);
|
||||
|
||||
// Is current working directory defined?
|
||||
string cwd = p->getcwd();
|
||||
@@ -282,14 +283,14 @@ readlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, p->getSyscallArg(tc, 0)))
|
||||
return (TheISA::IntReg)-EFAULT;
|
||||
|
||||
// Adjust path for current working directory
|
||||
path = p->fullPath(path);
|
||||
|
||||
size_t bufsiz = tc->getSyscallArg(2);
|
||||
BufferArg buf(tc->getSyscallArg(1), bufsiz);
|
||||
size_t bufsiz = p->getSyscallArg(tc, 2);
|
||||
BufferArg buf(p->getSyscallArg(tc, 1), bufsiz);
|
||||
|
||||
int result = readlink(path.c_str(), (char *)buf.bufferPtr(), bufsiz);
|
||||
|
||||
@@ -303,7 +304,7 @@ unlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, p->getSyscallArg(tc, 0)))
|
||||
return (TheISA::IntReg)-EFAULT;
|
||||
|
||||
// Adjust path for current working directory
|
||||
@@ -319,13 +320,13 @@ mkdirFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, p->getSyscallArg(tc, 0)))
|
||||
return (TheISA::IntReg)-EFAULT;
|
||||
|
||||
// Adjust path for current working directory
|
||||
path = p->fullPath(path);
|
||||
|
||||
mode_t mode = tc->getSyscallArg(1);
|
||||
mode_t mode = p->getSyscallArg(tc, 1);
|
||||
|
||||
int result = mkdir(path.c_str(), mode);
|
||||
return (result == -1) ? -errno : result;
|
||||
@@ -336,12 +337,12 @@ renameFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
string old_name;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(old_name, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(old_name, p->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
string new_name;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(new_name, tc->getSyscallArg(1)))
|
||||
if (!tc->getMemPort()->tryReadString(new_name, p->getSyscallArg(tc, 1)))
|
||||
return -EFAULT;
|
||||
|
||||
// Adjust path for current working directory
|
||||
@@ -357,10 +358,10 @@ truncateFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, p->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
off_t length = tc->getSyscallArg(1);
|
||||
off_t length = p->getSyscallArg(tc, 1);
|
||||
|
||||
// Adjust path for current working directory
|
||||
path = p->fullPath(path);
|
||||
@@ -372,12 +373,12 @@ truncateFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
SyscallReturn
|
||||
ftruncateFunc(SyscallDesc *desc, int num, LiveProcess *process, ThreadContext *tc)
|
||||
{
|
||||
int fd = process->sim_fd(tc->getSyscallArg(0));
|
||||
int fd = process->sim_fd(process->getSyscallArg(tc, 0));
|
||||
|
||||
if (fd < 0)
|
||||
return -EBADF;
|
||||
|
||||
off_t length = tc->getSyscallArg(1);
|
||||
off_t length = process->getSyscallArg(tc, 1);
|
||||
|
||||
int result = ftruncate(fd, length);
|
||||
return (result == -1) ? -errno : result;
|
||||
@@ -399,13 +400,13 @@ chownFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, p->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
/* XXX endianess */
|
||||
uint32_t owner = tc->getSyscallArg(1);
|
||||
uint32_t owner = p->getSyscallArg(tc, 1);
|
||||
uid_t hostOwner = owner;
|
||||
uint32_t group = tc->getSyscallArg(2);
|
||||
uint32_t group = p->getSyscallArg(tc, 2);
|
||||
gid_t hostGroup = group;
|
||||
|
||||
// Adjust path for current working directory
|
||||
@@ -418,15 +419,15 @@ chownFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
SyscallReturn
|
||||
fchownFunc(SyscallDesc *desc, int num, LiveProcess *process, ThreadContext *tc)
|
||||
{
|
||||
int fd = process->sim_fd(tc->getSyscallArg(0));
|
||||
int fd = process->sim_fd(process->getSyscallArg(tc, 0));
|
||||
|
||||
if (fd < 0)
|
||||
return -EBADF;
|
||||
|
||||
/* XXX endianess */
|
||||
uint32_t owner = tc->getSyscallArg(1);
|
||||
uint32_t owner = process->getSyscallArg(tc, 1);
|
||||
uid_t hostOwner = owner;
|
||||
uint32_t group = tc->getSyscallArg(2);
|
||||
uint32_t group = process->getSyscallArg(tc, 2);
|
||||
gid_t hostGroup = group;
|
||||
|
||||
int result = fchown(fd, hostOwner, hostGroup);
|
||||
@@ -437,11 +438,11 @@ fchownFunc(SyscallDesc *desc, int num, LiveProcess *process, ThreadContext *tc)
|
||||
SyscallReturn
|
||||
dupFunc(SyscallDesc *desc, int num, LiveProcess *process, ThreadContext *tc)
|
||||
{
|
||||
int fd = process->sim_fd(tc->getSyscallArg(0));
|
||||
int fd = process->sim_fd(process->getSyscallArg(tc, 0));
|
||||
if (fd < 0)
|
||||
return -EBADF;
|
||||
|
||||
Process::FdMap *fdo = process->sim_fd_obj(tc->getSyscallArg(0));
|
||||
Process::FdMap *fdo = process->sim_fd_obj(process->getSyscallArg(tc, 0));
|
||||
|
||||
int result = dup(fd);
|
||||
return (result == -1) ? -errno : process->alloc_fd(result, fdo->filename, fdo->flags, fdo->mode, false);
|
||||
@@ -452,12 +453,12 @@ SyscallReturn
|
||||
fcntlFunc(SyscallDesc *desc, int num, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
int fd = tc->getSyscallArg(0);
|
||||
int fd = process->getSyscallArg(tc, 0);
|
||||
|
||||
if (fd < 0 || process->sim_fd(fd) < 0)
|
||||
return -EBADF;
|
||||
|
||||
int cmd = tc->getSyscallArg(1);
|
||||
int cmd = process->getSyscallArg(tc, 1);
|
||||
switch (cmd) {
|
||||
case 0: // F_DUPFD
|
||||
// if we really wanted to support this, we'd need to do it
|
||||
@@ -494,12 +495,12 @@ SyscallReturn
|
||||
fcntl64Func(SyscallDesc *desc, int num, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
int fd = tc->getSyscallArg(0);
|
||||
int fd = process->getSyscallArg(tc, 0);
|
||||
|
||||
if (fd < 0 || process->sim_fd(fd) < 0)
|
||||
return -EBADF;
|
||||
|
||||
int cmd = tc->getSyscallArg(1);
|
||||
int cmd = process->getSyscallArg(tc, 1);
|
||||
switch (cmd) {
|
||||
case 33: //F_GETLK64
|
||||
warn("fcntl64(%d, F_GETLK64) not supported, error returned\n", fd);
|
||||
@@ -583,7 +584,7 @@ setuidFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
// can't fathom why a benchmark would call this.
|
||||
warn("Ignoring call to setuid(%d)\n", tc->getSyscallArg(0));
|
||||
warn("Ignoring call to setuid(%d)\n", process->getSyscallArg(tc, 0));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -467,8 +467,8 @@ SyscallReturn
|
||||
ioctlFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
int fd = tc->getSyscallArg(0);
|
||||
unsigned req = tc->getSyscallArg(1);
|
||||
int fd = process->getSyscallArg(tc, 0);
|
||||
unsigned req = process->getSyscallArg(tc, 1);
|
||||
|
||||
DPRINTF(SyscallVerbose, "ioctl(%d, 0x%x, ...)\n", fd, req);
|
||||
|
||||
@@ -502,7 +502,7 @@ openFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
{
|
||||
std::string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, process->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
if (path == "/dev/sysdev0") {
|
||||
@@ -512,8 +512,8 @@ openFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int tgtFlags = tc->getSyscallArg(1);
|
||||
int mode = tc->getSyscallArg(2);
|
||||
int tgtFlags = process->getSyscallArg(tc, 1);
|
||||
int mode = process->getSyscallArg(tc, 2);
|
||||
int hostFlags = 0;
|
||||
|
||||
// translate open flags
|
||||
@@ -560,10 +560,10 @@ chmodFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
{
|
||||
std::string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, process->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
uint32_t mode = tc->getSyscallArg(1);
|
||||
uint32_t mode = process->getSyscallArg(tc, 1);
|
||||
mode_t hostMode = 0;
|
||||
|
||||
// XXX translate mode flags via OS::something???
|
||||
@@ -587,13 +587,13 @@ SyscallReturn
|
||||
fchmodFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
int fd = tc->getSyscallArg(0);
|
||||
int fd = process->getSyscallArg(tc, 0);
|
||||
if (fd < 0 || process->sim_fd(fd) < 0) {
|
||||
// doesn't map to any simulator fd: not a valid target fd
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
uint32_t mode = tc->getSyscallArg(1);
|
||||
uint32_t mode = process->getSyscallArg(tc, 1);
|
||||
mode_t hostMode = 0;
|
||||
|
||||
// XXX translate mode flags via OS::someting???
|
||||
@@ -612,10 +612,10 @@ template <class OS>
|
||||
SyscallReturn
|
||||
mremapFunc(SyscallDesc *desc, int callnum, LiveProcess *process, ThreadContext *tc)
|
||||
{
|
||||
Addr start = tc->getSyscallArg(0);
|
||||
uint64_t old_length = tc->getSyscallArg(1);
|
||||
uint64_t new_length = tc->getSyscallArg(2);
|
||||
uint64_t flags = tc->getSyscallArg(3);
|
||||
Addr start = process->getSyscallArg(tc, 0);
|
||||
uint64_t old_length = process->getSyscallArg(tc, 1);
|
||||
uint64_t new_length = process->getSyscallArg(tc, 2);
|
||||
uint64_t flags = process->getSyscallArg(tc, 3);
|
||||
|
||||
if ((start % TheISA::VMPageSize != 0) ||
|
||||
(new_length % TheISA::VMPageSize != 0)) {
|
||||
@@ -661,7 +661,7 @@ statFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
{
|
||||
std::string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, process->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
// Adjust path for current working directory
|
||||
@@ -673,7 +673,8 @@ statFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
if (result < 0)
|
||||
return -errno;
|
||||
|
||||
copyOutStatBuf<OS>(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
|
||||
copyOutStatBuf<OS>(tc->getMemPort(), process->getSyscallArg(tc, 1),
|
||||
&hostBuf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -687,7 +688,7 @@ stat64Func(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
{
|
||||
std::string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, process->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
// Adjust path for current working directory
|
||||
@@ -704,7 +705,8 @@ stat64Func(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
if (result < 0)
|
||||
return -errno;
|
||||
|
||||
copyOutStat64Buf<OS>(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
|
||||
copyOutStat64Buf<OS>(tc->getMemPort(), process->getSyscallArg(tc, 1),
|
||||
&hostBuf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -716,7 +718,7 @@ SyscallReturn
|
||||
fstat64Func(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
int fd = tc->getSyscallArg(0);
|
||||
int fd = process->getSyscallArg(tc, 0);
|
||||
if (fd < 0 || process->sim_fd(fd) < 0) {
|
||||
// doesn't map to any simulator fd: not a valid target fd
|
||||
return -EBADF;
|
||||
@@ -733,7 +735,7 @@ fstat64Func(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
if (result < 0)
|
||||
return -errno;
|
||||
|
||||
copyOutStat64Buf<OS>(tc->getMemPort(), tc->getSyscallArg(1),
|
||||
copyOutStat64Buf<OS>(tc->getMemPort(), process->getSyscallArg(tc, 1),
|
||||
&hostBuf, (fd == 1));
|
||||
|
||||
return 0;
|
||||
@@ -748,7 +750,7 @@ lstatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
{
|
||||
std::string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, process->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
// Adjust path for current working directory
|
||||
@@ -760,7 +762,8 @@ lstatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
if (result < 0)
|
||||
return -errno;
|
||||
|
||||
copyOutStatBuf<OS>(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
|
||||
copyOutStatBuf<OS>(tc->getMemPort(), process->getSyscallArg(tc, 1),
|
||||
&hostBuf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -773,7 +776,7 @@ lstat64Func(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
{
|
||||
std::string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, process->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
// Adjust path for current working directory
|
||||
@@ -790,7 +793,8 @@ lstat64Func(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
if (result < 0)
|
||||
return -errno;
|
||||
|
||||
copyOutStat64Buf<OS>(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
|
||||
copyOutStat64Buf<OS>(tc->getMemPort(), process->getSyscallArg(tc, 1),
|
||||
&hostBuf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -801,7 +805,7 @@ SyscallReturn
|
||||
fstatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
int fd = process->sim_fd(tc->getSyscallArg(0));
|
||||
int fd = process->sim_fd(process->getSyscallArg(tc, 0));
|
||||
|
||||
DPRINTF(SyscallVerbose, "fstat(%d, ...)\n", fd);
|
||||
|
||||
@@ -814,7 +818,7 @@ fstatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
if (result < 0)
|
||||
return -errno;
|
||||
|
||||
copyOutStatBuf<OS>(tc->getMemPort(), tc->getSyscallArg(1),
|
||||
copyOutStatBuf<OS>(tc->getMemPort(), process->getSyscallArg(tc, 1),
|
||||
&hostBuf, (fd == 1));
|
||||
|
||||
return 0;
|
||||
@@ -829,7 +833,7 @@ statfsFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
{
|
||||
std::string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, process->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
// Adjust path for current working directory
|
||||
@@ -842,7 +846,7 @@ statfsFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
return -errno;
|
||||
|
||||
OS::copyOutStatfsBuf(tc->getMemPort(),
|
||||
(Addr)(tc->getSyscallArg(1)), &hostBuf);
|
||||
(Addr)(process->getSyscallArg(tc, 1)), &hostBuf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -854,7 +858,7 @@ SyscallReturn
|
||||
fstatfsFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
int fd = process->sim_fd(tc->getSyscallArg(0));
|
||||
int fd = process->sim_fd(process->getSyscallArg(tc, 0));
|
||||
|
||||
if (fd < 0)
|
||||
return -EBADF;
|
||||
@@ -865,7 +869,7 @@ fstatfsFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
if (result < 0)
|
||||
return -errno;
|
||||
|
||||
OS::copyOutStatfsBuf(tc->getMemPort(), tc->getSyscallArg(1),
|
||||
OS::copyOutStatfsBuf(tc->getMemPort(), process->getSyscallArg(tc, 1),
|
||||
&hostBuf);
|
||||
|
||||
return 0;
|
||||
@@ -878,15 +882,15 @@ SyscallReturn
|
||||
writevFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
int fd = tc->getSyscallArg(0);
|
||||
int fd = process->getSyscallArg(tc, 0);
|
||||
if (fd < 0 || process->sim_fd(fd) < 0) {
|
||||
// doesn't map to any simulator fd: not a valid target fd
|
||||
return -EBADF;
|
||||
}
|
||||
|
||||
TranslatingPort *p = tc->getMemPort();
|
||||
uint64_t tiov_base = tc->getSyscallArg(1);
|
||||
size_t count = tc->getSyscallArg(2);
|
||||
uint64_t tiov_base = process->getSyscallArg(tc, 1);
|
||||
size_t count = process->getSyscallArg(tc, 2);
|
||||
struct iovec hiov[count];
|
||||
for (int i = 0; i < count; ++i)
|
||||
{
|
||||
@@ -930,12 +934,12 @@ template <class OS>
|
||||
SyscallReturn
|
||||
mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
{
|
||||
Addr start = tc->getSyscallArg(0);
|
||||
uint64_t length = tc->getSyscallArg(1);
|
||||
// int prot = tc->getSyscallArg(2);
|
||||
int flags = tc->getSyscallArg(3);
|
||||
// int fd = p->sim_fd(tc->getSyscallArg(4));
|
||||
// int offset = tc->getSyscallArg(5);
|
||||
Addr start = p->getSyscallArg(tc, 0);
|
||||
uint64_t length = p->getSyscallArg(tc, 1);
|
||||
// int prot = p->getSyscallArg(tc, 2);
|
||||
int flags = p->getSyscallArg(tc, 3);
|
||||
// int fd = p->sim_fd(p->getSyscallArg(tc, 4));
|
||||
// int offset = p->getSyscallArg(tc, 5);
|
||||
|
||||
|
||||
if ((start % TheISA::VMPageSize) != 0 ||
|
||||
@@ -958,7 +962,7 @@ mmapFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||
|
||||
if (!(flags & OS::TGT_MAP_ANONYMOUS)) {
|
||||
warn("allowing mmap of file @ fd %d. "
|
||||
"This will break if not /dev/zero.", tc->getSyscallArg(4));
|
||||
"This will break if not /dev/zero.", p->getSyscallArg(tc, 4));
|
||||
}
|
||||
|
||||
return start;
|
||||
@@ -970,8 +974,8 @@ SyscallReturn
|
||||
getrlimitFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
unsigned resource = tc->getSyscallArg(0);
|
||||
TypedBufferArg<typename OS::rlimit> rlp(tc->getSyscallArg(1));
|
||||
unsigned resource = process->getSyscallArg(tc, 0);
|
||||
TypedBufferArg<typename OS::rlimit> rlp(process->getSyscallArg(tc, 1));
|
||||
|
||||
switch (resource) {
|
||||
case OS::TGT_RLIMIT_STACK:
|
||||
@@ -1005,7 +1009,7 @@ SyscallReturn
|
||||
gettimeofdayFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
TypedBufferArg<typename OS::timeval> tp(tc->getSyscallArg(0));
|
||||
TypedBufferArg<typename OS::timeval> tp(process->getSyscallArg(tc, 0));
|
||||
|
||||
getElapsedTime(tp->tv_sec, tp->tv_usec);
|
||||
tp->tv_sec += seconds_since_epoch;
|
||||
@@ -1026,10 +1030,10 @@ utimesFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
{
|
||||
std::string path;
|
||||
|
||||
if (!tc->getMemPort()->tryReadString(path, tc->getSyscallArg(0)))
|
||||
if (!tc->getMemPort()->tryReadString(path, process->getSyscallArg(tc, 0)))
|
||||
return -EFAULT;
|
||||
|
||||
TypedBufferArg<typename OS::timeval [2]> tp(tc->getSyscallArg(1));
|
||||
TypedBufferArg<typename OS::timeval [2]> tp(process->getSyscallArg(tc, 1));
|
||||
tp.copyIn(tc->getMemPort());
|
||||
|
||||
struct timeval hostTimeval[2];
|
||||
@@ -1055,8 +1059,8 @@ SyscallReturn
|
||||
getrusageFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||
ThreadContext *tc)
|
||||
{
|
||||
int who = tc->getSyscallArg(0); // THREAD, SELF, or CHILDREN
|
||||
TypedBufferArg<typename OS::rusage> rup(tc->getSyscallArg(1));
|
||||
int who = process->getSyscallArg(tc, 0); // THREAD, SELF, or CHILDREN
|
||||
TypedBufferArg<typename OS::rusage> rup(process->getSyscallArg(tc, 1));
|
||||
|
||||
rup->ru_utime.tv_sec = 0;
|
||||
rup->ru_utime.tv_usec = 0;
|
||||
|
||||
Reference in New Issue
Block a user