summaryrefslogtreecommitdiff
path: root/src/sim/syscall_emul.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/sim/syscall_emul.cc')
-rw-r--r--src/sim/syscall_emul.cc112
1 files changed, 59 insertions, 53 deletions
diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc
index 7e8f9062a..eaf90ec76 100644
--- a/src/sim/syscall_emul.cc
+++ b/src/sim/syscall_emul.cc
@@ -90,7 +90,7 @@ exitFutexWake(ThreadContext *tc, Addr addr, uint64_t tgid)
BufferArg ctidBuf(addr, sizeof(long));
long *ctid = (long *)ctidBuf.bufferPtr();
*ctid = 0;
- ctidBuf.copyOut(tc->getMemProxy());
+ ctidBuf.copyOut(tc->getVirtProxy());
FutexMap &futex_map = tc->getSystemPtr()->futexMap;
// Wake one of the waiting threads.
@@ -265,7 +265,7 @@ brkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
// if the address is already there, zero it out
else {
uint8_t zero = 0;
- PortProxy &tp = tc->getMemProxy();
+ PortProxy &tp = tc->getVirtProxy();
// split non-page aligned accesses
Addr next_page = roundUp(gen.addr(), PageBytes);
@@ -354,7 +354,7 @@ _llseekFunc(SyscallDesc *desc, int num, ThreadContext *tc)
// Assuming that the size of loff_t is 64 bits on the target platform
BufferArg result_buf(result_ptr, sizeof(result));
memcpy(result_buf.bufferPtr(), &result, sizeof(result));
- result_buf.copyOut(tc->getMemProxy());
+ result_buf.copyOut(tc->getVirtProxy());
return 0;
}
@@ -382,7 +382,7 @@ gethostnameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
strncpy((char *)name.bufferPtr(), hostname, name_len);
- name.copyOut(tc->getMemProxy());
+ name.copyOut(tc->getVirtProxy());
return 0;
}
@@ -414,7 +414,7 @@ getcwdFunc(SyscallDesc *desc, int num, ThreadContext *tc)
}
}
- buf.copyOut(tc->getMemProxy());
+ buf.copyOut(tc->getVirtProxy());
return (result == -1) ? -errno : result;
}
@@ -431,7 +431,7 @@ readlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc, int index)
string path;
auto p = tc->getProcessPtr();
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
// Adjust path for cwd and redirection
@@ -480,7 +480,7 @@ readlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc, int index)
(char*)buf.bufferPtr());
}
- buf.copyOut(tc->getMemProxy());
+ buf.copyOut(tc->getVirtProxy());
return (result == -1) ? -errno : result;
}
@@ -497,7 +497,7 @@ unlinkHelper(SyscallDesc *desc, int num, ThreadContext *tc, int index)
string path;
auto p = tc->getProcessPtr();
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
path = p->checkPathRedirect(path);
@@ -514,7 +514,7 @@ linkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
auto p = tc->getProcessPtr();
int index = 0;
- auto &virt_mem = tc->getMemProxy();
+ auto &virt_mem = tc->getVirtProxy();
if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
if (!virt_mem.tryReadString(new_path, p->getSyscallArg(tc, index)))
@@ -535,7 +535,7 @@ symlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc)
auto p = tc->getProcessPtr();
int index = 0;
- auto &virt_mem = tc->getMemProxy();
+ auto &virt_mem = tc->getVirtProxy();
if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
if (!virt_mem.tryReadString(new_path, p->getSyscallArg(tc, index)))
@@ -554,7 +554,7 @@ mkdirFunc(SyscallDesc *desc, int num, ThreadContext *tc)
auto p = tc->getProcessPtr();
int index = 0;
std::string path;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
path = p->checkPathRedirect(path);
@@ -571,13 +571,17 @@ renameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
auto p = tc->getProcessPtr();
int index = 0;
- if (!tc->getMemProxy().tryReadString(old_name, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(
+ old_name, p->getSyscallArg(tc, index))) {
return -EFAULT;
+ }
string new_name;
- if (!tc->getMemProxy().tryReadString(new_name, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(
+ new_name, p->getSyscallArg(tc, index))) {
return -EFAULT;
+ }
// Adjust path for cwd and redirection
old_name = p->checkPathRedirect(old_name);
@@ -594,7 +598,7 @@ truncateFunc(SyscallDesc *desc, int num, ThreadContext *tc)
auto p = tc->getProcessPtr();
int index = 0;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
off_t length = p->getSyscallArg(tc, index);
@@ -630,8 +634,10 @@ truncate64Func(SyscallDesc *desc, int num, ThreadContext *tc)
auto process = tc->getProcessPtr();
string path;
- if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(
+ path, process->getSyscallArg(tc, index))) {
return -EFAULT;
+ }
int64_t length = process->getSyscallArg(tc, index, 64);
@@ -685,7 +691,7 @@ chownFunc(SyscallDesc *desc, int num, ThreadContext *tc)
auto p = tc->getProcessPtr();
int index = 0;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
/* XXX endianess */
@@ -903,7 +909,7 @@ pipeImpl(SyscallDesc *desc, int callnum, ThreadContext *tc, bool pseudoPipe)
int *buf_ptr = (int*)tgt_handle.bufferPtr();
buf_ptr[0] = tgt_fds[0];
buf_ptr[1] = tgt_fds[1];
- tgt_handle.copyOut(tc->getMemProxy());
+ tgt_handle.copyOut(tc->getVirtProxy());
return 0;
}
@@ -1081,7 +1087,7 @@ accessFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, int index)
{
string path;
auto p = tc->getProcessPtr();
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
// Adjust path for cwd and redirection
@@ -1105,7 +1111,7 @@ mknodFunc(SyscallDesc *desc, int num, ThreadContext *tc)
auto p = tc->getProcessPtr();
int index = 0;
std::string path;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
path = p->checkPathRedirect(path);
@@ -1122,7 +1128,7 @@ chdirFunc(SyscallDesc *desc, int num, ThreadContext *tc)
auto p = tc->getProcessPtr();
int index = 0;
std::string path;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
std::string tgt_cwd;
@@ -1150,7 +1156,7 @@ rmdirFunc(SyscallDesc *desc, int num, ThreadContext *tc)
auto p = tc->getProcessPtr();
int index = 0;
std::string path;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+ if (!tc->getVirtProxy().tryReadString(path, p->getSyscallArg(tc, index)))
return -EFAULT;
path = p->checkPathRedirect(path);
@@ -1199,7 +1205,7 @@ getdentsImpl(SyscallDesc *desc, int callnum, ThreadContext *tc)
traversed += host_reclen;
}
- buf_arg.copyOut(tc->getMemProxy());
+ buf_arg.copyOut(tc->getVirtProxy());
return status;
}
#endif
@@ -1262,7 +1268,7 @@ bindFunc(SyscallDesc *desc, int num, ThreadContext *tc)
int addrlen = p->getSyscallArg(tc, index);
BufferArg bufSock(buf_ptr, addrlen);
- bufSock.copyIn(tc->getMemProxy());
+ bufSock.copyIn(tc->getVirtProxy());
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1304,7 +1310,7 @@ connectFunc(SyscallDesc *desc, int num, ThreadContext *tc)
int addrlen = p->getSyscallArg(tc, index);
BufferArg addr(buf_ptr, addrlen);
- addr.copyIn(tc->getMemProxy());
+ addr.copyIn(tc->getVirtProxy());
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)
@@ -1343,14 +1349,14 @@ recvfromFunc(SyscallDesc *desc, int num, ThreadContext *tc)
if (addrlenPtr != 0) {
// Read address length parameter.
BufferArg addrlenBuf(addrlenPtr, sizeof(socklen_t));
- addrlenBuf.copyIn(tc->getMemProxy());
+ addrlenBuf.copyIn(tc->getVirtProxy());
addrLen = *((socklen_t *)addrlenBuf.bufferPtr());
}
struct sockaddr sa, *sap = NULL;
if (addrLen != 0) {
BufferArg addrBuf(addrPtr, addrLen);
- addrBuf.copyIn(tc->getMemProxy());
+ addrBuf.copyIn(tc->getVirtProxy());
memcpy(&sa, (struct sockaddr *)addrBuf.bufferPtr(),
sizeof(struct sockaddr));
sap = &sa;
@@ -1364,20 +1370,20 @@ recvfromFunc(SyscallDesc *desc, int num, ThreadContext *tc)
return -errno;
// Pass the received data out.
- bufrBuf.copyOut(tc->getMemProxy());
+ bufrBuf.copyOut(tc->getVirtProxy());
// Copy address to addrPtr and pass it on.
if (sap != NULL) {
BufferArg addrBuf(addrPtr, addrLen);
memcpy(addrBuf.bufferPtr(), sap, sizeof(sa));
- addrBuf.copyOut(tc->getMemProxy());
+ addrBuf.copyOut(tc->getVirtProxy());
}
// Copy len to addrlenPtr and pass it on.
if (addrLen != 0) {
BufferArg addrlenBuf(addrlenPtr, sizeof(socklen_t));
*(socklen_t *)addrlenBuf.bufferPtr() = addrLen;
- addrlenBuf.copyOut(tc->getMemProxy());
+ addrlenBuf.copyOut(tc->getVirtProxy());
}
return recvd_size;
@@ -1402,13 +1408,13 @@ sendtoFunc(SyscallDesc *desc, int num, ThreadContext *tc)
// Reserve buffer space.
BufferArg bufrBuf(bufrPtr, bufrLen);
- bufrBuf.copyIn(tc->getMemProxy());
+ bufrBuf.copyIn(tc->getVirtProxy());
struct sockaddr sa, *sap = nullptr;
memset(&sa, 0, sizeof(sockaddr));
if (addrLen != 0) {
BufferArg addrBuf(addrPtr, addrLen);
- addrBuf.copyIn(tc->getMemProxy());
+ addrBuf.copyIn(tc->getVirtProxy());
memcpy(&sa, (sockaddr*)addrBuf.bufferPtr(), addrLen);
sap = &sa;
}
@@ -1458,7 +1464,7 @@ recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
* copy every field from the structures into our BufferArg classes.
*/
BufferArg msgBuf(msgPtr, sizeof(struct msghdr));
- msgBuf.copyIn(tc->getMemProxy());
+ msgBuf.copyIn(tc->getVirtProxy());
struct msghdr *msgHdr = (struct msghdr *)msgBuf.bufferPtr();
/**
@@ -1478,7 +1484,7 @@ recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
if (msgHdr->msg_name) {
/*1*/msg_name_phold = (Addr)msgHdr->msg_name;
/*2*/nameBuf = new BufferArg(msg_name_phold, msgHdr->msg_namelen);
- /*3*/nameBuf->copyIn(tc->getMemProxy());
+ /*3*/nameBuf->copyIn(tc->getVirtProxy());
/*4*/msgHdr->msg_name = nameBuf->bufferPtr();
}
@@ -1498,14 +1504,14 @@ recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
/*1*/msg_iov_phold = (Addr)msgHdr->msg_iov;
/*2*/iovBuf = new BufferArg(msg_iov_phold, msgHdr->msg_iovlen *
sizeof(struct iovec));
- /*3*/iovBuf->copyIn(tc->getMemProxy());
+ /*3*/iovBuf->copyIn(tc->getVirtProxy());
for (int i = 0; i < msgHdr->msg_iovlen; i++) {
if (((struct iovec *)iovBuf->bufferPtr())[i].iov_base) {
/*1*/iovec_base_phold[i] =
(Addr)((struct iovec *)iovBuf->bufferPtr())[i].iov_base;
/*2*/iovecBuf[i] = new BufferArg(iovec_base_phold[i],
((struct iovec *)iovBuf->bufferPtr())[i].iov_len);
- /*3*/iovecBuf[i]->copyIn(tc->getMemProxy());
+ /*3*/iovecBuf[i]->copyIn(tc->getVirtProxy());
/*4*/((struct iovec *)iovBuf->bufferPtr())[i].iov_base =
iovecBuf[i]->bufferPtr();
}
@@ -1521,7 +1527,7 @@ recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
/*1*/msg_control_phold = (Addr)msgHdr->msg_control;
/*2*/controlBuf = new BufferArg(msg_control_phold,
CMSG_ALIGN(msgHdr->msg_controllen));
- /*3*/controlBuf->copyIn(tc->getMemProxy());
+ /*3*/controlBuf->copyIn(tc->getVirtProxy());
/*4*/msgHdr->msg_control = controlBuf->bufferPtr();
}
@@ -1531,7 +1537,7 @@ recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
return -errno;
if (msgHdr->msg_name) {
- nameBuf->copyOut(tc->getMemProxy());
+ nameBuf->copyOut(tc->getVirtProxy());
delete(nameBuf);
msgHdr->msg_name = (void *)msg_name_phold;
}
@@ -1539,24 +1545,24 @@ recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
if (msgHdr->msg_iov) {
for (int i = 0; i< msgHdr->msg_iovlen; i++) {
if (((struct iovec *)iovBuf->bufferPtr())[i].iov_base) {
- iovecBuf[i]->copyOut(tc->getMemProxy());
+ iovecBuf[i]->copyOut(tc->getVirtProxy());
delete iovecBuf[i];
((struct iovec *)iovBuf->bufferPtr())[i].iov_base =
(void *)iovec_base_phold[i];
}
}
- iovBuf->copyOut(tc->getMemProxy());
+ iovBuf->copyOut(tc->getVirtProxy());
delete iovBuf;
msgHdr->msg_iov = (struct iovec *)msg_iov_phold;
}
if (msgHdr->msg_control) {
- controlBuf->copyOut(tc->getMemProxy());
+ controlBuf->copyOut(tc->getVirtProxy());
delete(controlBuf);
msgHdr->msg_control = (void *)msg_control_phold;
}
- msgBuf.copyOut(tc->getMemProxy());
+ msgBuf.copyOut(tc->getVirtProxy());
return recvd_size;
}
@@ -1579,7 +1585,7 @@ sendmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
* Reserve buffer space.
*/
BufferArg msgBuf(msgPtr, sizeof(struct msghdr));
- msgBuf.copyIn(tc->getMemProxy());
+ msgBuf.copyIn(tc->getVirtProxy());
struct msghdr msgHdr = *((struct msghdr *)msgBuf.bufferPtr());
/**
@@ -1588,7 +1594,7 @@ sendmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
*/
struct iovec *iovPtr = msgHdr.msg_iov;
BufferArg iovBuf((Addr)iovPtr, sizeof(struct iovec) * msgHdr.msg_iovlen);
- iovBuf.copyIn(tc->getMemProxy());
+ iovBuf.copyIn(tc->getVirtProxy());
struct iovec *iov = (struct iovec *)iovBuf.bufferPtr();
msgHdr.msg_iov = iov;
@@ -1608,7 +1614,7 @@ sendmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc)
for (int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
Addr basePtr = (Addr) iov[iovIndex].iov_base;
bufferArray[iovIndex] = new BufferArg(basePtr, iov[iovIndex].iov_len);
- bufferArray[iovIndex]->copyIn(tc->getMemProxy());
+ bufferArray[iovIndex]->copyIn(tc->getVirtProxy());
iov[iovIndex].iov_base = bufferArray[iovIndex]->bufferPtr();
}
@@ -1664,12 +1670,12 @@ getsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc)
// copy val to valPtr and pass it on
BufferArg valBuf(valPtr, sizeof(val));
memcpy(valBuf.bufferPtr(), &val, sizeof(val));
- valBuf.copyOut(tc->getMemProxy());
+ valBuf.copyOut(tc->getVirtProxy());
// copy len to lenPtr and pass it on
BufferArg lenBuf(lenPtr, sizeof(len));
memcpy(lenBuf.bufferPtr(), &len, sizeof(len));
- lenBuf.copyOut(tc->getMemProxy());
+ lenBuf.copyOut(tc->getVirtProxy());
return status;
}
@@ -1693,7 +1699,7 @@ getsocknameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
// Read in the value of len from the passed pointer.
BufferArg lenBuf(lenPtr, sizeof(socklen_t));
- lenBuf.copyIn(tc->getMemProxy());
+ lenBuf.copyIn(tc->getVirtProxy());
socklen_t len = *(socklen_t *)lenBuf.bufferPtr();
struct sockaddr sa;
@@ -1705,11 +1711,11 @@ getsocknameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
// Copy address to addrPtr and pass it on.
BufferArg addrBuf(addrPtr, sizeof(sa));
memcpy(addrBuf.bufferPtr(), &sa, sizeof(sa));
- addrBuf.copyOut(tc->getMemProxy());
+ addrBuf.copyOut(tc->getVirtProxy());
// Copy len to lenPtr and pass it on.
*(socklen_t *)lenBuf.bufferPtr() = len;
- lenBuf.copyOut(tc->getMemProxy());
+ lenBuf.copyOut(tc->getVirtProxy());
return status;
}
@@ -1729,7 +1735,7 @@ getpeernameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
int sim_fd = sfdp->getSimFD();
BufferArg bufAddrlen(addrlenPtr, sizeof(unsigned));
- bufAddrlen.copyIn(tc->getMemProxy());
+ bufAddrlen.copyIn(tc->getVirtProxy());
BufferArg bufSock(sockAddrPtr, *(unsigned *)bufAddrlen.bufferPtr());
int retval = getpeername(sim_fd,
@@ -1737,8 +1743,8 @@ getpeernameFunc(SyscallDesc *desc, int num, ThreadContext *tc)
(unsigned *)bufAddrlen.bufferPtr());
if (retval != -1) {
- bufSock.copyOut(tc->getMemProxy());
- bufAddrlen.copyOut(tc->getMemProxy());
+ bufSock.copyOut(tc->getVirtProxy());
+ bufAddrlen.copyOut(tc->getVirtProxy());
}
return (retval == -1) ? -errno : retval;
@@ -1756,7 +1762,7 @@ setsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc)
socklen_t len = p->getSyscallArg(tc, index);
BufferArg valBuf(valPtr, len);
- valBuf.copyIn(tc->getMemProxy());
+ valBuf.copyIn(tc->getVirtProxy());
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
if (!sfdp)