sim: Convert most of the common syscalls to use the guest ABI.

A couple tricky instances were left alone for now, specifically one
place where the size of the argument is specified explicitly (the
default ABI always leaves off the size), and two places where the
arguments are variadic which is not yet supported.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-187

Change-Id: I2ec19bea77d329de3575e17e9f7209f4fd871aa6
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23193
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Gabe Black
2019-11-26 17:46:37 -08:00
parent c7cb8bb5d8
commit 97c02b000e
2 changed files with 329 additions and 565 deletions

View File

@@ -110,11 +110,10 @@ exitFutexWake(ThreadContext *tc, Addr addr, uint64_t tgid)
}
static SyscallReturn
exitImpl(SyscallDesc *desc, int callnum, ThreadContext *tc, bool group)
exitImpl(SyscallDesc *desc, int callnum, ThreadContext *tc, bool group,
int status)
{
int index = 0;
auto p = tc->getProcessPtr();
int status = p->getSyscallArg(tc, index);
System *sys = tc->getSystemPtr();
@@ -232,15 +231,15 @@ exitImpl(SyscallDesc *desc, int callnum, ThreadContext *tc, bool group)
}
SyscallReturn
exitFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
exitFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, int status)
{
return exitImpl(desc, callnum, tc, false);
return exitImpl(desc, callnum, tc, false, status);
}
SyscallReturn
exitGroupFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
exitGroupFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, int status)
{
return exitImpl(desc, callnum, tc, true);
return exitImpl(desc, callnum, tc, true, status);
}
SyscallReturn
@@ -251,12 +250,11 @@ getpagesizeFunc(SyscallDesc *desc, int num, ThreadContext *tc)
SyscallReturn
brkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
brkFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr new_brk)
{
// change brk addr to first arg
int index = 0;
auto p = tc->getProcessPtr();
Addr new_brk = p->getSyscallArg(tc, index);
std::shared_ptr<MemState> mem_state = p->memState;
Addr brk_point = mem_state->getBrkPoint();
@@ -300,34 +298,27 @@ brkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
setTidAddressFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
setTidAddressFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
uint64_t tidPtr)
{
int index = 0;
auto process = tc->getProcessPtr();
uint64_t tidPtr = process->getSyscallArg(tc, index);
process->childClearTID = tidPtr;
return process->pid();
}
SyscallReturn
closeFunc(SyscallDesc *desc, int num, ThreadContext *tc)
closeFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
return p->fds->closeFDEntry(tgt_fd);
}
SyscallReturn
lseekFunc(SyscallDesc *desc, int num, ThreadContext *tc)
lseekFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, uint64_t offs, int whence)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
uint64_t offs = p->getSyscallArg(tc, index);
int whence = p->getSyscallArg(tc, index);
auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*p->fds)[tgt_fd]);
if (!ffdp)
@@ -341,15 +332,11 @@ lseekFunc(SyscallDesc *desc, int num, ThreadContext *tc)
SyscallReturn
_llseekFunc(SyscallDesc *desc, int num, ThreadContext *tc)
_llseekFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, uint64_t offset_high, uint32_t offset_low,
Addr result_ptr, int whence)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
uint64_t offset_high = p->getSyscallArg(tc, index);
uint32_t offset_low = p->getSyscallArg(tc, index);
Addr result_ptr = p->getSyscallArg(tc, index);
int whence = p->getSyscallArg(tc, index);
auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*p->fds)[tgt_fd]);
if (!ffdp)
@@ -384,29 +371,21 @@ munmapFunc(SyscallDesc *desc, int num, ThreadContext *tc)
const char *hostname = "m5.eecs.umich.edu";
SyscallReturn
gethostnameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
gethostnameFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr buf_ptr, int name_len)
{
int index = 0;
auto p = tc->getProcessPtr();
Addr buf_ptr = p->getSyscallArg(tc, index);
int name_len = p->getSyscallArg(tc, index);
BufferArg name(buf_ptr, name_len);
strncpy((char *)name.bufferPtr(), hostname, name_len);
name.copyOut(tc->getVirtProxy());
return 0;
}
SyscallReturn
getcwdFunc(SyscallDesc *desc, int num, ThreadContext *tc)
getcwdFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr buf_ptr, unsigned long size)
{
int result = 0;
int index = 0;
auto p = tc->getProcessPtr();
Addr buf_ptr = p->getSyscallArg(tc, index);
unsigned long size = p->getSyscallArg(tc, index);
BufferArg buf(buf_ptr, size);
// Is current working directory defined?
@@ -432,26 +411,18 @@ getcwdFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
readlinkFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
{
return readlinkImpl(desc, callnum, tc, 0);
}
SyscallReturn
readlinkImpl(SyscallDesc *desc, int num, ThreadContext *tc, int index)
readlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr pathname, Addr buf_ptr, size_t bufsiz)
{
string path;
auto p = tc->getProcessPtr();
if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
// Adjust path for cwd and redirection
path = p->checkPathRedirect(path);
Addr buf_ptr = p->getSyscallArg(tc, index);
size_t bufsiz = p->getSyscallArg(tc, index);
BufferArg buf(buf_ptr, bufsiz);
int result = -1;
@@ -498,18 +469,12 @@ readlinkImpl(SyscallDesc *desc, int num, ThreadContext *tc, int index)
}
SyscallReturn
unlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
{
return unlinkHelper(desc, num, tc, 0);
}
SyscallReturn
unlinkHelper(SyscallDesc *desc, int num, ThreadContext *tc, int index)
unlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname)
{
string path;
auto p = tc->getProcessPtr();
if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
path = p->checkPathRedirect(path);
@@ -519,17 +484,17 @@ unlinkHelper(SyscallDesc *desc, int num, ThreadContext *tc, int index)
}
SyscallReturn
linkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
linkFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr pathname, Addr new_pathname)
{
string path;
string new_path;
auto p = tc->getProcessPtr();
int index = 0;
auto &virt_mem = tc->getVirtProxy();
if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
if (!virt_mem.tryReadString(path, pathname))
return -EFAULT;
if (!virt_mem.tryReadString(new_path, p->getSyscallArg(tc, index)))
if (!virt_mem.tryReadString(new_path, new_pathname))
return -EFAULT;
path = p->absolutePath(path, true);
@@ -540,17 +505,17 @@ linkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
symlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
symlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr pathname, Addr new_pathname)
{
string path;
string new_path;
auto p = tc->getProcessPtr();
int index = 0;
auto &virt_mem = tc->getVirtProxy();
if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
if (!virt_mem.tryReadString(path, pathname))
return -EFAULT;
if (!virt_mem.tryReadString(new_path, p->getSyscallArg(tc, index)))
if (!virt_mem.tryReadString(new_path, new_pathname))
return -EFAULT;
path = p->absolutePath(path, true);
@@ -561,39 +526,33 @@ symlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
mkdirFunc(SyscallDesc *desc, int num, ThreadContext *tc)
mkdirFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr pathname, mode_t mode)
{
auto p = tc->getProcessPtr();
int index = 0;
std::string path;
if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
path = p->checkPathRedirect(path);
mode_t mode = p->getSyscallArg(tc, index);
auto result = mkdir(path.c_str(), mode);
return (result == -1) ? -errno : result;
}
SyscallReturn
renameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
renameFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr oldpath, Addr newpath)
{
string old_name;
auto p = tc->getProcessPtr();
int index = 0;
if (!tc->getVirtProxy().tryReadString(
old_name, p->getSyscallArg(tc, index))) {
string old_name;
if (!tc->getVirtProxy().tryReadString(old_name, oldpath))
return -EFAULT;
}
string new_name;
if (!tc->getVirtProxy().tryReadString(
new_name, p->getSyscallArg(tc, index))) {
if (!tc->getVirtProxy().tryReadString(new_name, newpath))
return -EFAULT;
}
// Adjust path for cwd and redirection
old_name = p->checkPathRedirect(old_name);
@@ -604,17 +563,15 @@ renameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
truncateFunc(SyscallDesc *desc, int num, ThreadContext *tc)
truncateFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr pathname, off_t length)
{
string path;
auto p = tc->getProcessPtr();
int index = 0;
if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
off_t length = p->getSyscallArg(tc, index);
// Adjust path for cwd and redirection
path = p->checkPathRedirect(path);
@@ -623,12 +580,10 @@ truncateFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
ftruncateFunc(SyscallDesc *desc, int num, ThreadContext *tc)
ftruncateFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, off_t length)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
off_t length = p->getSyscallArg(tc, index);
auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*p->fds)[tgt_fd]);
if (!ffdp)
@@ -640,18 +595,14 @@ ftruncateFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
truncate64Func(SyscallDesc *desc, int num, ThreadContext *tc)
truncate64Func(SyscallDesc *desc, int num, ThreadContext *tc,
Addr pathname, int64_t length)
{
int index = 0;
auto process = tc->getProcessPtr();
string path;
if (!tc->getVirtProxy().tryReadString(
path, process->getSyscallArg(tc, index))) {
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
}
int64_t length = process->getSyscallArg(tc, index, 64);
// Adjust path for cwd and redirection
path = process->checkPathRedirect(path);
@@ -697,19 +648,17 @@ umaskFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
chownFunc(SyscallDesc *desc, int num, ThreadContext *tc)
chownFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr pathname, uint32_t owner, uint32_t group)
{
string path;
auto p = tc->getProcessPtr();
int index = 0;
if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
/* XXX endianess */
uint32_t owner = p->getSyscallArg(tc, index);
uid_t hostOwner = owner;
uint32_t group = p->getSyscallArg(tc, index);
gid_t hostGroup = group;
// Adjust path for cwd and redirection
@@ -720,11 +669,10 @@ chownFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
fchownFunc(SyscallDesc *desc, int num, ThreadContext *tc)
fchownFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, uint32_t owner, uint32_t group)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*p->fds)[tgt_fd]);
if (!ffdp)
@@ -732,9 +680,7 @@ fchownFunc(SyscallDesc *desc, int num, ThreadContext *tc)
int sim_fd = ffdp->getSimFD();
/* XXX endianess */
uint32_t owner = p->getSyscallArg(tc, index);
uid_t hostOwner = owner;
uint32_t group = p->getSyscallArg(tc, index);
gid_t hostGroup = group;
int result = fchown(sim_fd, hostOwner, hostGroup);
@@ -748,11 +694,9 @@ fchownFunc(SyscallDesc *desc, int num, ThreadContext *tc)
* for the fd entries that we maintain for checkpoint restoration.
*/
SyscallReturn
dupFunc(SyscallDesc *desc, int num, ThreadContext *tc)
dupFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
auto old_hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*p->fds)[tgt_fd]);
if (!old_hbfdp)
@@ -770,11 +714,10 @@ dupFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
dup2Func(SyscallDesc *desc, int num, ThreadContext *tc)
dup2Func(SyscallDesc *desc, int num, ThreadContext *tc,
int old_tgt_fd, int new_tgt_fd)
{
int index = 0;
auto p = tc->getProcessPtr();
int old_tgt_fd = p->getSyscallArg(tc, index);
auto old_hbp = std::dynamic_pointer_cast<HBFDEntry>((*p->fds)[old_tgt_fd]);
if (!old_hbp)
return -EBADF;
@@ -789,7 +732,6 @@ dup2Func(SyscallDesc *desc, int num, ThreadContext *tc)
if (res_fd == -1)
return -errno;
int new_tgt_fd = p->getSyscallArg(tc, index);
auto new_hbp = std::dynamic_pointer_cast<HBFDEntry>((*p->fds)[new_tgt_fd]);
if (new_hbp)
p->fds->closeFDEntry(new_tgt_fd);
@@ -1002,12 +944,10 @@ getpgrpFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
}
SyscallReturn
setpgidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
setpgidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
int pid, int pgid)
{
int index = 0;
auto process = tc->getProcessPtr();
int pid = process->getSyscallArg(tc, index);
int pgid = process->getSyscallArg(tc, index);
if (pgid < 0)
return -EINVAL;
@@ -1074,12 +1014,10 @@ getgidPseudoFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
SyscallReturn
setuidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
setuidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, int uid)
{
// can't fathom why a benchmark would call this.
int index = 0;
auto process = tc->getProcessPtr();
warn("Ignoring call to setuid(%d)\n", process->getSyscallArg(tc, index));
warn("Ignoring call to setuid(%d)\n", uid);
return 0;
}
@@ -1133,15 +1071,11 @@ getegidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
}
SyscallReturn
fallocateFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
fallocateFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
int tgt_fd, int mode, off_t offset, off_t len)
{
#if defined(__linux__)
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
int mode = p->getSyscallArg(tc, index);
off_t offset = p->getSyscallArg(tc, index);
off_t len = p->getSyscallArg(tc, index);
auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*p->fds)[tgt_fd]);
if (!ffdp)
@@ -1159,52 +1093,42 @@ fallocateFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
}
SyscallReturn
accessImpl(SyscallDesc *desc, int callnum, ThreadContext *tc, int index)
accessFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
Addr pathname, mode_t mode)
{
string path;
auto p = tc->getProcessPtr();
if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
// Adjust path for cwd and redirection
path = p->checkPathRedirect(path);
mode_t mode = p->getSyscallArg(tc, index);
int result = access(path.c_str(), mode);
return (result == -1) ? -errno : result;
}
SyscallReturn
accessFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
{
return accessImpl(desc, callnum, tc, 0);
}
SyscallReturn
mknodFunc(SyscallDesc *desc, int num, ThreadContext *tc)
mknodFunc(SyscallDesc *desc, int num, ThreadContext *tc,
Addr pathname, mode_t mode, dev_t dev)
{
auto p = tc->getProcessPtr();
int index = 0;
std::string path;
if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
path = p->checkPathRedirect(path);
mode_t mode = p->getSyscallArg(tc, index);
dev_t dev = p->getSyscallArg(tc, index);
auto result = mknod(path.c_str(), mode, dev);
return (result == -1) ? -errno : result;
}
SyscallReturn
chdirFunc(SyscallDesc *desc, int num, ThreadContext *tc)
chdirFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname)
{
auto p = tc->getProcessPtr();
int index = 0;
std::string path;
if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
std::string tgt_cwd;
@@ -1227,12 +1151,11 @@ chdirFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
rmdirFunc(SyscallDesc *desc, int num, ThreadContext *tc)
rmdirFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname)
{
auto p = tc->getProcessPtr();
int index = 0;
std::string path;
if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
if (!tc->getVirtProxy().tryReadString(path, pathname))
return -EFAULT;
path = p->checkPathRedirect(path);
@@ -1244,13 +1167,10 @@ rmdirFunc(SyscallDesc *desc, int num, ThreadContext *tc)
#if defined(SYS_getdents) || defined(SYS_getdents64)
template<typename DE, int SYS_NUM>
static SyscallReturn
getdentsImpl(SyscallDesc *desc, int callnum, ThreadContext *tc)
getdentsImpl(SyscallDesc *desc, int callnum, ThreadContext *tc,
int tgt_fd, Addr buf_ptr, unsigned count)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
Addr buf_ptr = p->getSyscallArg(tc, index);
unsigned count = p->getSyscallArg(tc, index);
auto hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*p->fds)[tgt_fd]);
if (!hbfdp)
@@ -1289,7 +1209,8 @@ getdentsImpl(SyscallDesc *desc, int callnum, ThreadContext *tc)
#if defined(SYS_getdents)
SyscallReturn
getdentsFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
getdentsFunc(SyscallDesc *desc, int callnum, ThreadContext *tc,
int tgt_fd, Addr buf_ptr, unsigned count)
{
typedef struct linux_dirent {
unsigned long d_ino;
@@ -1298,13 +1219,15 @@ getdentsFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
char dname[];
} LinDent;
return getdentsImpl<LinDent, SYS_getdents>(desc, callnum, tc);
return getdentsImpl<LinDent, SYS_getdents>(desc, callnum, tc,
tgt_fd, buf_ptr, count);
}
#endif
#if defined(SYS_getdents64)
SyscallReturn
getdents64Func(SyscallDesc *desc, int callnum, ThreadContext *tc)
getdents64Func(SyscallDesc *desc, int callnum, ThreadContext *tc,
int tgt_fd, Addr buf_ptr, unsigned count)
{
typedef struct linux_dirent64 {
ino64_t d_ino;
@@ -1313,17 +1236,16 @@ getdents64Func(SyscallDesc *desc, int callnum, ThreadContext *tc)
char dname[];
} LinDent64;
return getdentsImpl<LinDent64, SYS_getdents64>(desc, callnum, tc);
return getdentsImpl<LinDent64, SYS_getdents64>(desc, callnum, tc,
tgt_fd, buf_ptr, count);
}
#endif
SyscallReturn
shutdownFunc(SyscallDesc *desc, int num, ThreadContext *tc)
shutdownFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, int how)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
int how = p->getSyscallArg(tc, index);
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1336,13 +1258,10 @@ shutdownFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
bindFunc(SyscallDesc *desc, int num, ThreadContext *tc)
bindFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, Addr buf_ptr, int addrlen)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
Addr buf_ptr = p->getSyscallArg(tc, index);
int addrlen = p->getSyscallArg(tc, index);
BufferArg bufSock(buf_ptr, addrlen);
bufSock.copyIn(tc->getVirtProxy());
@@ -1360,12 +1279,10 @@ bindFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
listenFunc(SyscallDesc *desc, int num, ThreadContext *tc)
listenFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, int backlog)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
int backlog = p->getSyscallArg(tc, index);
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1378,13 +1295,10 @@ listenFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
connectFunc(SyscallDesc *desc, int num, ThreadContext *tc)
connectFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, Addr buf_ptr, int addrlen)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
Addr buf_ptr = p->getSyscallArg(tc, index);
int addrlen = p->getSyscallArg(tc, index);
BufferArg addr(buf_ptr, addrlen);
addr.copyIn(tc->getVirtProxy());
@@ -1402,16 +1316,11 @@ connectFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
recvfromFunc(SyscallDesc *desc, int num, ThreadContext *tc)
recvfromFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, Addr bufrPtr, size_t bufrLen, int flags,
Addr addrPtr, Addr addrlenPtr)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
Addr bufrPtr = p->getSyscallArg(tc, index);
size_t bufrLen = p->getSyscallArg(tc, index);
int flags = p->getSyscallArg(tc, index);
Addr addrPtr = p->getSyscallArg(tc, index);
Addr addrlenPtr = p->getSyscallArg(tc, index);
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1467,16 +1376,11 @@ recvfromFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
sendtoFunc(SyscallDesc *desc, int num, ThreadContext *tc)
sendtoFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, Addr bufrPtr, size_t bufrLen, int flags,
Addr addrPtr, socklen_t addrLen)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
Addr bufrPtr = p->getSyscallArg(tc, index);
size_t bufrLen = p->getSyscallArg(tc, index);
int flags = p->getSyscallArg(tc, index);
Addr addrPtr = p->getSyscallArg(tc, index);
socklen_t addrLen = p->getSyscallArg(tc, index);
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1504,13 +1408,10 @@ sendtoFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, Addr msgPtr, int flags)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
Addr msgPtr = p->getSyscallArg(tc, index);
int flags = p->getSyscallArg(tc, index);
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1645,13 +1546,10 @@ recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
sendmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
sendmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, Addr msgPtr, int flags)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
Addr msgPtr = p->getSyscallArg(tc, index);
int flags = p->getSyscallArg(tc, index);
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1715,7 +1613,8 @@ sendmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
getsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc)
getsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, int level, int optname, Addr valPtr, Addr lenPtr)
{
// union of all possible return value types from getsockopt
union val {
@@ -1725,13 +1624,7 @@ getsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc)
struct timeval timeval_val;
} val;
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
int level = p->getSyscallArg(tc, index);
int optname = p->getSyscallArg(tc, index);
Addr valPtr = p->getSyscallArg(tc, index);
Addr lenPtr = p->getSyscallArg(tc, index);
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1758,13 +1651,10 @@ getsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
getsocknameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
getsocknameFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, Addr addrPtr, Addr lenPtr)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
Addr addrPtr = p->getSyscallArg(tc, index);
Addr lenPtr = p->getSyscallArg(tc, index);
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1798,13 +1688,10 @@ getsocknameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
getpeernameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
getpeernameFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, Addr sockAddrPtr, Addr addrlenPtr)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
Addr sockAddrPtr = p->getSyscallArg(tc, index);
Addr addrlenPtr = p->getSyscallArg(tc, index);
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1828,15 +1715,10 @@ getpeernameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
SyscallReturn
setsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc)
setsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc,
int tgt_fd, int level, int optname, Addr valPtr, socklen_t len)
{
int index = 0;
auto p = tc->getProcessPtr();
int tgt_fd = p->getSyscallArg(tc, index);
int level = p->getSyscallArg(tc, index);
int optname = p->getSyscallArg(tc, index);
Addr valPtr = p->getSyscallArg(tc, index);
socklen_t len = p->getSyscallArg(tc, index);
BufferArg valBuf(valPtr, len);
valBuf.copyIn(tc->getVirtProxy());

File diff suppressed because it is too large Load Diff