35 #include <sys/syscall.h> 42 #include <unordered_map> 44 #include "arch/utility.hh" 47 #include "config/the_isa.hh" 64 warn(
"Cannot invoke %s on host operating system.", syscall_name);
70 fatal(
"syscall %s (#%d) unimplemented.", desc->
name(), callnum);
79 warn(
"ignoring syscall %s(...)", desc->
name());
86 static std::unordered_map<SyscallDesc *, bool> bool_map;
88 bool &warned = bool_map[desc];
90 warn(
"ignoring syscall %s(...)\n" 91 " (further warnings will be suppressed)", desc->
name());
103 long *ctid = (
long *)ctidBuf.
bufferPtr();
109 futex_map.
wakeup(addr, tgid, 1);
121 *
p->exitGroup =
true;
123 if (
p->childClearTID)
126 bool last_thread =
true;
127 Process *parent =
nullptr, *tg_lead =
nullptr;
139 if (walk->
pid() ==
p->tgid())
151 if (walk->
tgid() ==
p->tgid()) {
164 if (*(
p->exitGroup)) {
180 if (*
p->sigchld && (
p->ppid() != 0) && (walk->
pid() ==
p->ppid()))
196 for (
int i = 0;
i <
p->fds->getSize();
i++) {
198 p->fds->closeFDEntry(
i);
208 int activeContexts = 0;
210 activeContexts +=
system->numRunningContexts();
212 if (activeContexts == 0) {
226 exitSimLoop(
"exiting with last active thread context", status & 0xff);
236 return exitImpl(desc, callnum, tc,
false, status);
242 return exitImpl(desc, callnum, tc,
true, status);
259 std::shared_ptr<MemState> mem_state =
p->memState;
260 Addr brk_point = mem_state->getBrkPoint();
267 if (new_brk > brk_point) {
272 if (!
p->pTable->translate(gen.addr()))
282 uint32_t size_needed = next_page - gen.addr();
284 if (gen.addr() +
PageBytes > next_page &&
285 next_page < new_brk &&
286 p->pTable->translate(next_page)) {
294 mem_state->setBrkPoint(new_brk);
296 mem_state->getBrkPoint());
297 return mem_state->getBrkPoint();
307 return process->pid();
314 return p->fds->closeFDEntry(tgt_fd);
319 int tgt_fd, uint64_t offs,
int whence)
323 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
326 int sim_fd = ffdp->getSimFD();
328 off_t result = lseek(sim_fd, offs, whence);
330 return (result == (off_t)-1) ? -errno : result;
336 int tgt_fd, uint64_t offset_high, uint32_t offset_low,
337 Addr result_ptr,
int whence)
341 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
344 int sim_fd = ffdp->getSimFD();
346 uint64_t
offset = (offset_high << 32) | offset_low;
348 uint64_t result = lseek(sim_fd, offset, whence);
351 if (result == (off_t)-1)
354 BufferArg result_buf(result_ptr,
sizeof(result));
355 memcpy(result_buf.
bufferPtr(), &result,
sizeof(result));
375 Addr buf_ptr,
int name_len)
385 Addr buf_ptr,
unsigned long size)
392 string cwd =
p->tgtCwd;
394 if (cwd.length() >= size) {
398 strncpy((
char *)buf.
bufferPtr(), cwd.c_str(), size);
399 result = cwd.length();
401 if (getcwd((
char *)buf.
bufferPtr(), size)) {
402 result = strlen((
char *)buf.
bufferPtr());
410 return (result == -1) ? -errno : result;
415 Addr pathname,
Addr buf_ptr,
size_t bufsiz)
424 path =
p->checkPathRedirect(path);
429 if (path !=
"/proc/self/exe") {
430 result = readlink(path.c_str(), (
char *)buf.
bufferPtr(), bufsiz);
444 char real_path[PATH_MAX];
445 char *check_real_path = realpath(
p->progName(), real_path);
446 if (!check_real_path) {
447 fatal(
"readlink('/proc/self/exe') unable to resolve path to " 448 "executable: %s",
p->progName());
450 strncpy((
char*)buf.
bufferPtr(), real_path, bufsiz);
451 size_t real_path_len = strlen(real_path);
452 if (real_path_len > bufsiz) {
457 result = real_path_len;
461 warn_once(
"readlink() called on '/proc/self/exe' may yield unexpected " 462 "results in various settings.\n Returning '%s'\n",
468 return (result == -1) ? -errno : result;
480 path =
p->checkPathRedirect(path);
482 int result = unlink(path.c_str());
483 return (result == -1) ? -errno : result;
495 if (!virt_mem.tryReadString(path, pathname))
497 if (!virt_mem.tryReadString(new_path, new_pathname))
500 path =
p->absolutePath(path,
true);
501 new_path =
p->absolutePath(new_path,
true);
503 int result = link(path.c_str(), new_path.c_str());
504 return (result == -1) ? -errno : result;
516 if (!virt_mem.tryReadString(path, pathname))
518 if (!virt_mem.tryReadString(new_path, new_pathname))
521 path =
p->absolutePath(path,
true);
522 new_path =
p->absolutePath(new_path,
true);
524 int result = symlink(path.c_str(), new_path.c_str());
525 return (result == -1) ? -errno : result;
537 path =
p->checkPathRedirect(path);
539 auto result = mkdir(path.c_str(),
mode);
540 return (result == -1) ? -errno : result;
558 old_name =
p->checkPathRedirect(old_name);
559 new_name =
p->checkPathRedirect(new_name);
561 int64_t result = rename(old_name.c_str(), new_name.c_str());
562 return (result == -1) ? -errno : result;
576 path =
p->checkPathRedirect(path);
578 int result = truncate(path.c_str(),
length);
579 return (result == -1) ? -errno : result;
588 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
591 int sim_fd = ffdp->getSimFD();
593 int result = ftruncate(sim_fd, length);
594 return (result == -1) ? -errno : result;
611 int result = truncate(path.c_str(),
length);
613 int result = truncate64(path.c_str(),
length);
615 return (result == -1) ? -errno : result;
623 int tgt_fd =
p->getSyscallArg(tc, index);
624 int64_t
length =
p->getSyscallArg(tc, index, 64);
626 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
629 int sim_fd = ffdp->getSimFD();
632 int result = ftruncate(sim_fd, length);
634 int result = ftruncate64(sim_fd, length);
636 return (result == -1) ? -errno : result;
645 mode_t oldMask = umask(0);
652 Addr pathname, uint32_t owner, uint32_t group)
661 uid_t hostOwner = owner;
662 gid_t hostGroup = group;
665 path =
p->checkPathRedirect(path);
667 int result = chown(path.c_str(), hostOwner, hostGroup);
668 return (result == -1) ? -errno : result;
673 int tgt_fd, uint32_t owner, uint32_t group)
677 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
680 int sim_fd = ffdp->getSimFD();
683 uid_t hostOwner = owner;
684 gid_t hostGroup = group;
686 int result = fchown(sim_fd, hostOwner, hostGroup);
687 return (result == -1) ? -errno : result;
701 auto old_hbfdp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[tgt_fd]);
704 int sim_fd = old_hbfdp->getSimFD();
706 int result = dup(sim_fd);
710 auto new_hbfdp = std::dynamic_pointer_cast<HBFDEntry>(old_hbfdp->clone());
711 new_hbfdp->setSimFD(result);
712 new_hbfdp->setCOE(
false);
713 return p->fds->allocFD(new_hbfdp);
718 int old_tgt_fd,
int new_tgt_fd)
721 auto old_hbp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[old_tgt_fd]);
724 int old_sim_fd = old_hbp->getSimFD();
731 int res_fd = dup2(old_sim_fd, open(
"/dev/null", O_RDONLY));
735 auto new_hbp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[new_tgt_fd]);
737 p->fds->closeFDEntry(new_tgt_fd);
738 new_hbp = std::dynamic_pointer_cast<HBFDEntry>(old_hbp->clone());
739 new_hbp->setSimFD(res_fd);
740 new_hbp->setCOE(
false);
742 return p->fds->allocFD(new_hbp);
751 int tgt_fd =
p->getSyscallArg(tc, index);
752 int cmd =
p->getSyscallArg(tc, index);
754 auto hbfdp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[tgt_fd]);
757 int sim_fd = hbfdp->getSimFD();
759 int coe = hbfdp->getCOE();
763 return coe & FD_CLOEXEC;
766 arg =
p->getSyscallArg(tc, index);
767 arg ? hbfdp->setCOE(
true) : hbfdp->setCOE(
false);
779 arg =
p->getSyscallArg(tc, index);
780 int rv = fcntl(sim_fd, cmd, arg);
781 return (rv == -1) ? -errno : rv;
785 warn(
"fcntl: unsupported command %d\n", cmd);
795 int tgt_fd =
p->getSyscallArg(tc, index);
797 auto hbfdp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[tgt_fd]);
800 int sim_fd = hbfdp->getSimFD();
802 int cmd =
p->getSyscallArg(tc, index);
805 warn(
"fcntl64(%d, F_GETLK64) not supported, error returned\n", tgt_fd);
810 warn(
"fcntl64(%d, F_SETLK(W)64) not supported, error returned\n",
817 warn(
"fcntl64(%d, %d) passed through to host\n", tgt_fd, cmd);
818 return fcntl(sim_fd, cmd);
831 tgt_addr =
p->getSyscallArg(tc, index);
833 flags =
p->getSyscallArg(tc, index);
837 int sim_fds[2], tgt_fds[2];
839 int pipe_retval = pipe(sim_fds);
840 if (pipe_retval == -1)
843 auto rend = PipeFDEntry::EndType::read;
844 auto rpfd = std::make_shared<PipeFDEntry>(sim_fds[0], O_WRONLY, rend);
845 tgt_fds[0] =
p->fds->allocFD(rpfd);
846 int sim_fd_rpfd = rpfd->getSimFD();
848 auto wend = PipeFDEntry::EndType::write;
849 auto wpfd = std::make_shared<PipeFDEntry>(sim_fds[1], O_RDONLY, wend);
850 tgt_fds[1] =
p->fds->allocFD(wpfd);
851 int sim_fd_wpfd = wpfd->getSimFD();
857 rpfd->setPipeReadSource(tgt_fds[1]);
872 BufferArg tgt_handle(tgt_addr,
sizeof(
int[2]));
873 int *buf_ptr = (
int*)tgt_handle.
bufferPtr();
874 buf_ptr[0] = tgt_fds[0];
875 buf_ptr[1] = tgt_fds[1];
879 if (is_pipe2 && flags) {
882 if ((flags != O_CLOEXEC) && (flags != O_NONBLOCK) &&
883 (flags != (O_CLOEXEC | O_NONBLOCK))) {
891 if (flags & O_NONBLOCK) {
898 if (fcntl(sim_fd_rpfd, F_SETFL, O_NONBLOCK)) {
901 if (fcntl(sim_fd_wpfd, F_SETFL, O_NONBLOCK)) {
910 if (flags & O_CLOEXEC) {
922 return pipeImpl(desc, callnum, tc,
true);
928 return pipeImpl(desc, callnum, tc,
false);
936 return pipeImpl(desc, callnum, tc,
false,
true);
943 return process->
pgid();
956 process->
pgid(process->pid());
969 if (walk_ph && walk_ph->
pid() == process->pid())
970 matched_ph = walk_ph;
975 matched_ph->
pgid((pgid == 0) ? matched_ph->
pid() : pgid);
989 return process->pid();
1002 return process->uid();
1012 return process->gid();
1020 return process->
tgid();
1027 return process->
pid();
1034 return process->
ppid();
1041 return process->
uid();
1048 return process->
euid();
1055 return process->
gid();
1062 return process->
egid();
1069 #if defined(__linux__) 1072 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
1075 int sim_fd = ffdp->getSimFD();
1077 int result = fallocate(sim_fd, mode, offset, len);
1097 path =
p->checkPathRedirect(path);
1099 int result = access(path.c_str(),
mode);
1100 return (result == -1) ? -errno : result;
1105 Addr pathname, mode_t
mode, dev_t dev)
1112 path =
p->checkPathRedirect(path);
1114 auto result = mknod(path.c_str(),
mode, dev);
1115 return (result == -1) ? -errno : result;
1126 std::string tgt_cwd;
1131 tgt_cwd = realpath((
p->tgtCwd +
"/" + path).c_str(), buf);
1133 std::string host_cwd =
p->checkPathRedirect(tgt_cwd);
1135 int result = chdir(host_cwd.c_str());
1140 p->hostCwd = host_cwd;
1141 p->tgtCwd = tgt_cwd;
1153 path =
p->checkPathRedirect(path);
1155 auto result = rmdir(path.c_str());
1156 return (result == -1) ? -errno : result;
1159 #if defined(SYS_getdents) || defined(SYS_getdents64) 1160 template<
typename DE,
int SYS_NUM>
1163 int tgt_fd,
Addr buf_ptr,
unsigned count)
1167 auto hbfdp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[tgt_fd]);
1170 int sim_fd = hbfdp->getSimFD();
1178 unsigned traversed = 0;
1179 while (traversed <
status) {
1182 auto host_reclen = buffer->d_reclen;
1190 buffer->d_ino =
htog(buffer->d_ino, bo);
1191 buffer->d_off =
htog(buffer->d_off, bo);
1192 buffer->d_reclen =
htog(buffer->d_reclen, bo);
1194 traversed += host_reclen;
1202 #if defined(SYS_getdents) 1205 int tgt_fd,
Addr buf_ptr,
unsigned count)
1207 typedef struct linux_dirent {
1208 unsigned long d_ino;
1209 unsigned long d_off;
1210 unsigned short d_reclen;
1214 return getdentsImpl<LinDent, SYS_getdents>(desc, callnum, tc,
1215 tgt_fd, buf_ptr,
count);
1219 #if defined(SYS_getdents64) 1222 int tgt_fd,
Addr buf_ptr,
unsigned count)
1224 typedef struct linux_dirent64 {
1227 unsigned short d_reclen;
1231 return getdentsImpl<LinDent64, SYS_getdents64>(desc, callnum, tc,
1232 tgt_fd, buf_ptr,
count);
1238 int tgt_fd,
int how)
1242 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1245 int sim_fd = sfdp->getSimFD();
1247 int retval = shutdown(sim_fd, how);
1249 return (retval == -1) ? -errno : retval;
1254 int tgt_fd,
Addr buf_ptr,
int addrlen)
1261 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1264 int sim_fd = sfdp->getSimFD();
1266 int status = ::bind(sim_fd,
1270 return (status == -1) ? -errno :
status;
1275 int tgt_fd,
int backlog)
1279 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1282 int sim_fd = sfdp->getSimFD();
1284 int status = listen(sim_fd, backlog);
1286 return (status == -1) ? -errno :
status;
1291 int tgt_fd,
Addr buf_ptr,
int addrlen)
1298 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1301 int sim_fd = sfdp->getSimFD();
1303 int status = connect(sim_fd,
1305 (socklen_t)addrlen);
1307 return (status == -1) ? -errno :
status;
1312 int tgt_fd,
Addr bufrPtr,
size_t bufrLen,
int flags,
1317 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1320 int sim_fd = sfdp->getSimFD();
1326 socklen_t addrLen = 0;
1327 if (addrlenPtr != 0) {
1329 BufferArg addrlenBuf(addrlenPtr,
sizeof(socklen_t));
1331 addrLen = *((socklen_t *)addrlenBuf.
bufferPtr());
1334 struct sockaddr sa, *sap = NULL;
1338 memcpy(&sa, (
struct sockaddr *)addrBuf.
bufferPtr(),
1339 sizeof(
struct sockaddr));
1343 ssize_t recvd_size = recvfrom(sim_fd,
1345 bufrLen, flags, sap, (socklen_t *)&addrLen);
1347 if (recvd_size == -1)
1362 BufferArg addrlenBuf(addrlenPtr,
sizeof(socklen_t));
1363 *(socklen_t *)addrlenBuf.
bufferPtr() = addrLen;
1372 int tgt_fd,
Addr bufrPtr,
size_t bufrLen,
int flags,
1373 Addr addrPtr, socklen_t addrLen)
1377 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1380 int sim_fd = sfdp->getSimFD();
1386 struct sockaddr sa, *sap =
nullptr;
1387 memset(&sa, 0,
sizeof(sockaddr));
1391 memcpy(&sa, (sockaddr*)addrBuf.
bufferPtr(), addrLen);
1395 ssize_t sent_size = sendto(sim_fd,
1397 bufrLen, flags, sap, (socklen_t)addrLen);
1399 return (sent_size == -1) ? -errno : sent_size;
1404 int tgt_fd,
Addr msgPtr,
int flags)
1408 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1411 int sim_fd = sfdp->getSimFD();
1436 BufferArg msgBuf(msgPtr,
sizeof(
struct msghdr));
1438 struct msghdr *msgHdr = (
struct msghdr *)msgBuf.
bufferPtr();
1445 Addr msg_name_phold = 0;
1446 Addr msg_iov_phold = 0;
1447 Addr iovec_base_phold[msgHdr->msg_iovlen];
1448 Addr msg_control_phold = 0;
1454 if (msgHdr->msg_name) {
1455 msg_name_phold = (
Addr)msgHdr->msg_name;
1456 nameBuf =
new BufferArg(msg_name_phold, msgHdr->msg_namelen);
1458 msgHdr->msg_name = nameBuf->
bufferPtr();
1467 BufferArg *iovecBuf[msgHdr->msg_iovlen];
1468 for (
int i = 0;
i < msgHdr->msg_iovlen;
i++) {
1469 iovec_base_phold[
i] = 0;
1473 if (msgHdr->msg_iov) {
1474 msg_iov_phold = (
Addr)msgHdr->msg_iov;
1475 iovBuf =
new BufferArg(msg_iov_phold, msgHdr->msg_iovlen *
1476 sizeof(
struct iovec));
1478 for (
int i = 0;
i < msgHdr->msg_iovlen;
i++) {
1479 if (((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base) {
1480 iovec_base_phold[
i] =
1483 ((
struct iovec *)iovBuf->
bufferPtr())[i].iov_len);
1485 ((
struct iovec *)iovBuf->
bufferPtr())[i].iov_base =
1486 iovecBuf[i]->bufferPtr();
1489 msgHdr->msg_iov = (
struct iovec *)iovBuf->
bufferPtr();
1496 if (msgHdr->msg_control) {
1497 msg_control_phold = (
Addr)msgHdr->msg_control;
1498 controlBuf =
new BufferArg(msg_control_phold,
1499 CMSG_ALIGN(msgHdr->msg_controllen));
1501 msgHdr->msg_control = controlBuf->
bufferPtr();
1504 ssize_t recvd_size = recvmsg(sim_fd, msgHdr, flags);
1509 if (msgHdr->msg_name) {
1512 msgHdr->msg_name = (
void *)msg_name_phold;
1515 if (msgHdr->msg_iov) {
1516 for (
int i = 0;
i< msgHdr->msg_iovlen;
i++) {
1517 if (((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base) {
1520 ((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base =
1521 (
void *)iovec_base_phold[
i];
1526 msgHdr->msg_iov = (
struct iovec *)msg_iov_phold;
1529 if (msgHdr->msg_control) {
1532 msgHdr->msg_control = (
void *)msg_control_phold;
1542 int tgt_fd,
Addr msgPtr,
int flags)
1546 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1549 int sim_fd = sfdp->getSimFD();
1554 BufferArg msgBuf(msgPtr,
sizeof(
struct msghdr));
1556 struct msghdr msgHdr = *((
struct msghdr *)msgBuf.
bufferPtr());
1562 struct iovec *iovPtr = msgHdr.msg_iov;
1563 BufferArg iovBuf((
Addr)iovPtr,
sizeof(
struct iovec) * msgHdr.msg_iovlen);
1565 struct iovec *iov = (
struct iovec *)iovBuf.
bufferPtr();
1566 msgHdr.msg_iov = iov;
1581 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1582 Addr basePtr = (
Addr) iov[iovIndex].iov_base;
1583 bufferArray[iovIndex] =
new BufferArg(basePtr, iov[iovIndex].iov_len);
1585 iov[iovIndex].iov_base = bufferArray[iovIndex]->
bufferPtr();
1588 ssize_t sent_size = sendmsg(sim_fd, &msgHdr, flags);
1589 int local_errno = errno;
1594 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1604 return (sent_size < 0) ? -local_errno : sent_size;
1609 int tgt_fd,
int level,
int optname,
Addr valPtr,
Addr lenPtr)
1615 struct linger linger_val;
1616 struct timeval timeval_val;
1621 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1624 int sim_fd = sfdp->getSimFD();
1626 socklen_t
len =
sizeof(
val);
1627 int status = getsockopt(sim_fd, level, optname, &val, &len);
1647 int tgt_fd,
Addr addrPtr,
Addr lenPtr)
1651 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1654 int sim_fd = sfdp->getSimFD();
1660 BufferArg lenBuf(lenPtr,
sizeof(socklen_t));
1665 int status = getsockname(sim_fd, &sa, &len);
1684 int tgt_fd,
Addr sockAddrPtr,
Addr addrlenPtr)
1688 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1691 int sim_fd = sfdp->getSimFD();
1693 BufferArg bufAddrlen(addrlenPtr,
sizeof(
unsigned));
1697 int retval = getpeername(sim_fd,
1698 (
struct sockaddr *)bufSock.bufferPtr(),
1706 return (retval == -1) ? -errno : retval;
1711 int tgt_fd,
int level,
int optname,
Addr valPtr, socklen_t
len)
1718 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1721 int sim_fd = sfdp->getSimFD();
1723 int status = setsockopt(sim_fd, level, optname,
1726 return (status == -1) ? -errno :
status;
virtual void halt()=0
Set the status to Halted.
virtual System * getSystemPtr()=0
#define fatal(...)
This implements a cprintf based fatal() function.
const std::string & name()
uint64_t childClearTID
Calls a futex wakeup at the address specified by this pointer when this process exits.
SyscallReturn geteuidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target geteuid() handler.
SyscallReturn ignoreFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Handler for unimplemented syscalls that we never intend to implement (signal handling, etc.) and should not affect the correct behavior of the program.
Trying to exit and waiting for an event to completely exit.
SyscallReturn dup2Func(SyscallDesc *desc, int num, ThreadContext *tc, int old_tgt_fd, int new_tgt_fd)
Target dup2() handler.
SyscallReturn getcwdFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr buf_ptr, unsigned long size)
Target getcwd() handler.
static SyscallReturn exitImpl(SyscallDesc *desc, int callnum, ThreadContext *tc, bool group, int status)
bool copyIn(PortProxy &memproxy)
copy data into simulator space (read from target memory)
virtual PortProxy & getVirtProxy()=0
virtual Process * getProcessPtr()=0
Holds file descriptors for host-backed files; host-backed files are files which were opened on the ph...
SyscallReturn fcntlFunc(SyscallDesc *desc, int num, ThreadContext *tc)
Target fcntl() handler.
Overload hash function for BasicBlockRange type.
ByteOrder getGuestByteOrder() const
Get the guest byte order.
SyscallReturn getuidPseudoFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target getuidPseudo() handler.
SyscallReturn getgidPseudoFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target getgidPseudo() handler.
T roundUp(const T &val, const U &align)
This function is used to align addresses in memory.
SyscallReturn fallocateFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, int tgt_fd, int mode, off_t offset, off_t len)
ThreadContext is the external interface to all thread state for anything outside of the CPU...
#define DPRINTF_SYSCALL(FLAGEXT, FMT,...)
This macro is intended to help with readability.
SyscallReturn sendtoFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, Addr bufrPtr, size_t bufrLen, int flags, Addr addrPtr, socklen_t addrLen)
SyscallReturn closeFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd)
Target close() handler.
SyscallReturn gethostnameFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr buf_ptr, int name_len)
Target gethostname() handler.
SyscallReturn getegidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target getegid() handler.
SyscallReturn renameFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr oldpath, Addr newpath)
Target rename() handler.
SyscallReturn umaskFunc(SyscallDesc *desc, int num, ThreadContext *tc)
Target umask() handler.
SyscallReturn pipe2Func(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target pipe() handler.
SyscallReturn munmapFunc(SyscallDesc *desc, int num, ThreadContext *tc)
Target munmap() handler.
SyscallReturn chdirFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname)
Target chdir() handler.
SyscallReturn getuidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
SyscallReturn getpeernameFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, Addr sockAddrPtr, Addr addrlenPtr)
SyscallReturn unlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname)
Target unlink() handler.
SyscallReturn fchownFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, uint32_t owner, uint32_t group)
Target fchown() handler.
SyscallReturn exitGroupFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, int status)
Target exit_group() handler: terminate simulation. (exit all threads)
T htog(T value, ByteOrder guest_byte_order)
SyscallReturn mkdirFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname, mode_t mode)
Target mkdir() handler.
SyscallReturn getsocknameFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, Addr addrPtr, Addr lenPtr)
SyscallReturn _llseekFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, uint64_t offset_high, uint32_t offset_low, Addr result_ptr, int whence)
Target _llseek() handler.
void memsetBlob(Addr addr, uint8_t v, int size) const
Same as tryMemsetBlob, but insists on success.
int wakeup(Addr addr, uint64_t tgid, int count)
Wakes up at most count waiting threads on a futex.
SyscallReturn shutdownFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, int how)
Target shutdown() handler.
This class takes an arbitrary memory region (address/length pair) and generates a series of appropria...
SyscallReturn getpidPseudoFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target getpidPseudo() handler.
SyscallReturn recvfromFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, Addr bufrPtr, size_t bufrLen, int flags, Addr addrPtr, Addr addrlenPtr)
SyscallReturn setsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, int level, int optname, Addr valPtr, socklen_t len)
SyscallReturn readlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname, Addr buf_ptr, size_t bufsiz)
Target readlink() handler.
SyscallReturn mknodFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname, mode_t mode, dev_t dev)
Target mknod() handler.
std::vector< ThreadContext * > threadContexts
SyscallReturn rmdirFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname)
Extends the base class to include a host-backed file descriptor field that records the integer used t...
unsigned numContexts() const
void * bufferPtr()
Return a pointer to the internal simulator-space buffer.
SyscallReturn ftruncateFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, off_t length)
Target ftruncate() handler.
T roundDown(const T &val, const U &align)
This function is used to align addresses in memory.
SyscallReturn getppidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target getppid() handler.
const RegIndex SyscallPseudoReturnReg
static bool readyToExit(Tick delay)
Initiate the exit from the simulation.
SyscallReturn brkFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr new_brk)
Target brk() handler: set brk address.
SyscallReturn pipeImpl(SyscallDesc *desc, int callnum, ThreadContext *tc, bool pseudo_pipe, bool is_pipe2)
Internal pipe() handler.
virtual void setIntReg(RegIndex reg_idx, RegVal val)=0
SyscallReturn ignoreWarnOnceFunc(SyscallDesc *desc, int num, ThreadContext *tc)
Like above, but only prints a warning once per syscall desc it's used with.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
SyscallReturn dupFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd)
FIXME: The file description is not shared among file descriptors created with dup.
SyscallReturn unimplementedFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Handler for unimplemented syscalls that we haven't thought about.
bool done() const
Are we done? That is, did the last call to next() advance past the end of the region?
SyscallReturn getgidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target getgid() handler.
SyscallReturn linkFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname, Addr new_pathname)
Target link() handler.
SyscallReturn sendmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, Addr msgPtr, int flags)
std::list< BasicSignal > signalList
bool startswith(const char *s, const char *prefix)
Return true if 's' starts with the prefix string 'prefix'.
SyscallReturn getpagesizeFunc(SyscallDesc *desc, int num, ThreadContext *tc)
Target getpagesize() handler.
SyscallReturn listenFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, int backlog)
SyscallReturn getpgrpFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target getpgrpFunc() handler.
This class provides the wrapper interface for the system call implementations which are defined in th...
SyscallReturn gettidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target gettid() handler.
This object is a proxy for a port or other object which implements the functional response protocol...
SyscallReturn truncateFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname, off_t length)
Target truncate() handler.
SyscallReturn fcntl64Func(SyscallDesc *desc, int num, ThreadContext *tc)
Target fcntl64() handler.
SyscallReturn getsockoptFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, int level, int optname, Addr valPtr, Addr lenPtr)
SyscallReturn lseekFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, uint64_t offs, int whence)
Target lseek() handler.
SyscallReturn pipeFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target pipe() handler.
void exitSimLoop(const std::string &message, int exit_code, Tick when, Tick repeat, bool serialize)
Schedule an event to exit the simulation loop (returning to Python) at the end of the current cycle (...
Declarations of a non-full system Page Table.
SyscallReturn accessFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, Addr pathname, mode_t mode)
Target access() handler.
SyscallReturn symlinkFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname, Addr new_pathname)
Target symlink() handler.
This file defines objects used to emulate syscalls from the target application on the host machine...
SyscallReturn setTidAddressFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, uint64_t tidPtr)
Target set_tid_address() handler.
std::string checkPathRedirect(const std::string &filename)
Redirect file path if it matches any keys initialized by system object.
SyscallReturn connectFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, Addr buf_ptr, int addrlen)
bool copyOut(PortProxy &memproxy)
copy data out of simulator space (write to target memory)
SyscallReturn setpgidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, int pid, int pgid)
Target setpgid() handler.
FutexMap class holds a map of all futexes used in the system.
SyscallReturn chownFunc(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname, uint32_t owner, uint32_t group)
Target chown() handler.
SyscallReturn recvmsgFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, Addr msgPtr, int flags)
BufferArg represents an untyped buffer in target user space that is passed by reference to an (emulat...
SyscallReturn truncate64Func(SyscallDesc *desc, int num, ThreadContext *tc, Addr pathname, int64_t length)
Target truncate64() handler.
SyscallReturn bindFunc(SyscallDesc *desc, int num, ThreadContext *tc, int tgt_fd, Addr buf_ptr, int addrlen)
SyscallReturn pipePseudoFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Pseudo Funcs - These functions use a different return convension, returning a second value in a regis...
Declaration and inline definition of ChunkGenerator object.
This class represents the return value from an emulated system call, including any errno setting...
void warnUnsupportedOS(std::string syscall_name)
bool tryReadString(std::string &str, Addr addr) const
Reads the string at guest address addr into the std::string str.
static void exitFutexWake(ThreadContext *tc, Addr addr, uint64_t tgid)
SyscallReturn getpidFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
Target getpid() handler.
SyscallReturn exitFunc(SyscallDesc *desc, int callnum, ThreadContext *tc, int status)
Target exit() handler: terminate current context.
SyscallReturn ftruncate64Func(SyscallDesc *desc, int num, ThreadContext *tc)
Target ftruncate64() handler.
static std::vector< System * > systemList