diff options
Diffstat (limited to 'src/sim/syscall_emul.cc')
-rw-r--r-- | src/sim/syscall_emul.cc | 112 |
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) |