32 #include <sys/syscall.h> 39 #include <unordered_map> 41 #include "arch/utility.hh" 44 #include "config/the_isa.hh" 61 warn(
"Cannot invoke %s on host operating system.", syscall_name);
67 fatal(
"syscall %s (#%d) unimplemented.", desc->
name(), desc->
num());
74 warn(
"ignoring syscall %s(...)", desc->
name());
81 static std::unordered_map<SyscallDesc *, bool> bool_map;
83 bool &warned = bool_map[desc];
85 warn(
"ignoring syscall %s(...)\n" 86 " (further warnings will be suppressed)", desc->
name());
104 futex_map.
wakeup(addr, tgid, 1);
115 *
p->exitGroup =
true;
117 if (
p->childClearTID)
120 bool last_thread =
true;
121 Process *parent =
nullptr, *tg_lead =
nullptr;
133 if (walk->
pid() ==
p->tgid())
145 if (walk->
tgid() ==
p->tgid()) {
158 if (*(
p->exitGroup)) {
174 if (*
p->sigchld && (
p->ppid() != 0) && (walk->
pid() ==
p->ppid()))
190 for (
int i = 0;
i <
p->fds->getSize();
i++) {
192 p->fds->closeFDEntry(
i);
202 int activeContexts = 0;
204 activeContexts +=
system->numRunningContexts();
206 if (activeContexts == 0) {
220 exitSimLoop(
"exiting with last active thread context", status & 0xff);
230 return exitImpl(desc, tc,
false, status);
236 return exitImpl(desc, tc,
true, status);
252 std::shared_ptr<MemState> mem_state =
p->memState;
253 Addr brk_point = mem_state->getBrkPoint();
257 if (new_brk == 0 || (new_brk == brk_point))
260 mem_state->updateBrkRegion(brk_point, new_brk);
263 mem_state->getBrkPoint());
265 return mem_state->getBrkPoint();
274 return process->pid();
281 return p->fds->closeFDEntry(tgt_fd);
286 int tgt_fd, uint64_t offs,
int whence)
290 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
293 int sim_fd = ffdp->getSimFD();
295 off_t result = lseek(sim_fd, offs, whence);
297 return (result == (off_t)-1) ? -errno : result;
303 int tgt_fd, uint64_t offset_high, uint32_t offset_low,
304 Addr result_ptr,
int whence)
308 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
311 int sim_fd = ffdp->getSimFD();
313 uint64_t
offset = (offset_high << 32) | offset_low;
315 uint64_t result = lseek(sim_fd, offset, whence);
318 if (result == (off_t)-1)
321 BufferArg result_buf(result_ptr,
sizeof(result));
322 memcpy(result_buf.
bufferPtr(), &result,
sizeof(result));
343 p->memState->unmapRegion(start, length);
353 Addr buf_ptr,
int name_len)
363 Addr buf_ptr,
unsigned long size)
370 string cwd =
p->tgtCwd;
372 if (cwd.length() >= size) {
376 strncpy((
char *)buf.
bufferPtr(), cwd.c_str(), size);
377 result = cwd.length();
379 if (getcwd((
char *)buf.
bufferPtr(), size)) {
380 result = strlen((
char *)buf.
bufferPtr());
388 return (result == -1) ? -errno : result;
393 Addr pathname,
Addr buf_ptr,
size_t bufsiz)
402 path =
p->checkPathRedirect(path);
407 if (path !=
"/proc/self/exe") {
408 result = readlink(path.c_str(), (
char *)buf.
bufferPtr(), bufsiz);
422 char real_path[PATH_MAX];
423 char *check_real_path = realpath(
p->progName(), real_path);
424 if (!check_real_path) {
425 fatal(
"readlink('/proc/self/exe') unable to resolve path to " 426 "executable: %s",
p->progName());
428 strncpy((
char*)buf.
bufferPtr(), real_path, bufsiz);
429 size_t real_path_len = strlen(real_path);
430 if (real_path_len > bufsiz) {
435 result = real_path_len;
439 warn_once(
"readlink() called on '/proc/self/exe' may yield unexpected " 440 "results in various settings.\n Returning '%s'\n",
446 return (result == -1) ? -errno : result;
458 path =
p->checkPathRedirect(path);
460 int result = unlink(path.c_str());
461 return (result == -1) ? -errno : result;
473 if (!virt_mem.tryReadString(path, pathname))
475 if (!virt_mem.tryReadString(new_path, new_pathname))
478 path =
p->absolutePath(path,
true);
479 new_path =
p->absolutePath(new_path,
true);
481 int result = link(path.c_str(), new_path.c_str());
482 return (result == -1) ? -errno : result;
494 if (!virt_mem.tryReadString(path, pathname))
496 if (!virt_mem.tryReadString(new_path, new_pathname))
499 path =
p->absolutePath(path,
true);
500 new_path =
p->absolutePath(new_path,
true);
502 int result = symlink(path.c_str(), new_path.c_str());
503 return (result == -1) ? -errno : result;
514 path =
p->checkPathRedirect(path);
516 auto result = mkdir(path.c_str(),
mode);
517 return (result == -1) ? -errno : result;
534 old_name =
p->checkPathRedirect(old_name);
535 new_name =
p->checkPathRedirect(new_name);
537 int64_t result = rename(old_name.c_str(), new_name.c_str());
538 return (result == -1) ? -errno : result;
551 path =
p->checkPathRedirect(path);
553 int result = truncate(path.c_str(),
length);
554 return (result == -1) ? -errno : result;
562 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
565 int sim_fd = ffdp->getSimFD();
567 int result = ftruncate(sim_fd, length);
568 return (result == -1) ? -errno : result;
585 int result = truncate(path.c_str(),
length);
587 int result = truncate64(path.c_str(),
length);
589 return (result == -1) ? -errno : result;
594 int tgt_fd, int64_t
length)
598 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
601 int sim_fd = ffdp->getSimFD();
604 int result = ftruncate(sim_fd, length);
606 int result = ftruncate64(sim_fd, length);
608 return (result == -1) ? -errno : result;
617 mode_t oldMask = umask(0);
624 Addr pathname, uint32_t owner, uint32_t group)
633 uid_t hostOwner = owner;
634 gid_t hostGroup = group;
637 path =
p->checkPathRedirect(path);
639 int result = chown(path.c_str(), hostOwner, hostGroup);
640 return (result == -1) ? -errno : result;
645 int tgt_fd, uint32_t owner, uint32_t group)
649 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
652 int sim_fd = ffdp->getSimFD();
655 uid_t hostOwner = owner;
656 gid_t hostGroup = group;
658 int result = fchown(sim_fd, hostOwner, hostGroup);
659 return (result == -1) ? -errno : result;
673 auto old_hbfdp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[tgt_fd]);
676 int sim_fd = old_hbfdp->getSimFD();
678 int result = dup(sim_fd);
682 auto new_hbfdp = std::dynamic_pointer_cast<HBFDEntry>(old_hbfdp->clone());
683 new_hbfdp->setSimFD(result);
684 new_hbfdp->setCOE(
false);
685 return p->fds->allocFD(new_hbfdp);
692 auto old_hbp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[old_tgt_fd]);
695 int old_sim_fd = old_hbp->getSimFD();
702 int res_fd = dup2(old_sim_fd, open(
"/dev/null", O_RDONLY));
706 auto new_hbp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[new_tgt_fd]);
708 p->fds->closeFDEntry(new_tgt_fd);
709 new_hbp = std::dynamic_pointer_cast<HBFDEntry>(old_hbp->clone());
710 new_hbp->setSimFD(res_fd);
711 new_hbp->setCOE(
false);
713 return p->fds->allocFD(new_hbp);
722 auto hbfdp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[tgt_fd]);
725 int sim_fd = hbfdp->getSimFD();
727 int coe = hbfdp->getCOE();
731 return coe & FD_CLOEXEC;
734 int arg = varargs.
get<
int>();
735 arg ? hbfdp->setCOE(
true) : hbfdp->setCOE(
false);
747 int arg = varargs.
get<
int>();
748 int rv = fcntl(sim_fd, cmd, arg);
749 return (rv == -1) ? -errno : rv;
753 warn(
"fcntl: unsupported command %d\n", cmd);
763 auto hbfdp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[tgt_fd]);
766 int sim_fd = hbfdp->getSimFD();
770 warn(
"fcntl64(%d, F_GETLK64) not supported, error returned\n", tgt_fd);
775 warn(
"fcntl64(%d, F_SETLK(W)64) not supported, error returned\n",
782 warn(
"fcntl64(%d, %d) passed through to host\n", tgt_fd, cmd);
783 return fcntl(sim_fd, cmd);
804 int sim_fds[2], tgt_fds[2];
806 int pipe_retval = pipe(sim_fds);
807 if (pipe_retval == -1)
810 auto rend = PipeFDEntry::EndType::read;
811 auto rpfd = std::make_shared<PipeFDEntry>(sim_fds[0], O_WRONLY, rend);
812 tgt_fds[0] =
p->fds->allocFD(rpfd);
813 int sim_fd_rpfd = rpfd->getSimFD();
815 auto wend = PipeFDEntry::EndType::write;
816 auto wpfd = std::make_shared<PipeFDEntry>(sim_fds[1], O_RDONLY, wend);
817 tgt_fds[1] =
p->fds->allocFD(wpfd);
818 int sim_fd_wpfd = wpfd->getSimFD();
824 rpfd->setPipeReadSource(tgt_fds[1]);
838 BufferArg tgt_handle(tgt_addr,
sizeof(
int[2]));
839 int *buf_ptr = (
int*)tgt_handle.
bufferPtr();
840 buf_ptr[0] = tgt_fds[0];
841 buf_ptr[1] = tgt_fds[1];
847 if ((flags != O_CLOEXEC) && (flags != O_NONBLOCK) &&
848 (flags != (O_CLOEXEC | O_NONBLOCK))) {
856 if (flags & O_NONBLOCK) {
863 if (fcntl(sim_fd_rpfd, F_SETFL, O_NONBLOCK)) {
866 if (fcntl(sim_fd_wpfd, F_SETFL, O_NONBLOCK)) {
875 if (flags & O_CLOEXEC) {
888 return process->
pgid();
900 process->
pgid(process->pid());
913 if (walk_ph && walk_ph->
pid() == process->pid())
914 matched_ph = walk_ph;
919 matched_ph->
pgid((pgid == 0) ? matched_ph->
pid() : pgid);
929 return process->
tgid();
936 return process->
pid();
943 return process->
ppid();
950 return process->
uid();
957 return process->
euid();
964 return process->
gid();
971 return process->
egid();
978 #if defined(__linux__) 981 auto ffdp = std::dynamic_pointer_cast<
FileFDEntry>((*
p->fds)[tgt_fd]);
984 int sim_fd = ffdp->getSimFD();
986 int result = fallocate(sim_fd, mode, offset, len);
1006 path =
p->checkPathRedirect(path);
1008 int result = access(path.c_str(),
mode);
1009 return (result == -1) ? -errno : result;
1014 Addr pathname, mode_t
mode, dev_t dev)
1021 path =
p->checkPathRedirect(path);
1023 auto result = mknod(path.c_str(),
mode, dev);
1024 return (result == -1) ? -errno : result;
1035 std::string tgt_cwd;
1040 tgt_cwd = realpath((
p->tgtCwd +
"/" + path).c_str(), buf);
1042 std::string host_cwd =
p->checkPathRedirect(tgt_cwd);
1044 int result = chdir(host_cwd.c_str());
1049 p->hostCwd = host_cwd;
1050 p->tgtCwd = tgt_cwd;
1062 path =
p->checkPathRedirect(path);
1064 auto result = rmdir(path.c_str());
1065 return (result == -1) ? -errno : result;
1068 #if defined(SYS_getdents) || defined(SYS_getdents64) 1069 template<
typename DE,
int SYS_NUM>
1072 int tgt_fd,
Addr buf_ptr,
unsigned count)
1076 auto hbfdp = std::dynamic_pointer_cast<
HBFDEntry>((*
p->fds)[tgt_fd]);
1079 int sim_fd = hbfdp->getSimFD();
1087 unsigned traversed = 0;
1088 while (traversed <
status) {
1091 auto host_reclen = buffer->d_reclen;
1099 buffer->d_ino =
htog(buffer->d_ino, bo);
1100 buffer->d_off =
htog(buffer->d_off, bo);
1101 buffer->d_reclen =
htog(buffer->d_reclen, bo);
1103 traversed += host_reclen;
1111 #if defined(SYS_getdents) 1114 int tgt_fd,
Addr buf_ptr,
unsigned count)
1116 typedef struct linux_dirent {
1117 unsigned long d_ino;
1118 unsigned long d_off;
1119 unsigned short d_reclen;
1123 return getdentsImpl<LinDent, SYS_getdents>(desc, tc,
1124 tgt_fd, buf_ptr,
count);
1128 #if defined(SYS_getdents64) 1131 int tgt_fd,
Addr buf_ptr,
unsigned count)
1133 typedef struct linux_dirent64 {
1136 unsigned short d_reclen;
1140 return getdentsImpl<LinDent64, SYS_getdents64>(desc, tc,
1141 tgt_fd, buf_ptr,
count);
1150 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1153 int sim_fd = sfdp->getSimFD();
1155 int retval = shutdown(sim_fd, how);
1157 return (retval == -1) ? -errno : retval;
1162 int tgt_fd,
Addr buf_ptr,
int addrlen)
1169 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1172 int sim_fd = sfdp->getSimFD();
1174 int status = ::bind(sim_fd,
1178 return (status == -1) ? -errno :
status;
1186 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1189 int sim_fd = sfdp->getSimFD();
1191 int status = listen(sim_fd, backlog);
1193 return (status == -1) ? -errno :
status;
1198 int tgt_fd,
Addr buf_ptr,
int addrlen)
1205 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1208 int sim_fd = sfdp->getSimFD();
1210 int status = connect(sim_fd,
1212 (socklen_t)addrlen);
1214 return (status == -1) ? -errno :
status;
1219 int tgt_fd,
Addr bufrPtr,
size_t bufrLen,
int flags,
1224 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1227 int sim_fd = sfdp->getSimFD();
1233 socklen_t addrLen = 0;
1234 if (addrlenPtr != 0) {
1236 BufferArg addrlenBuf(addrlenPtr,
sizeof(socklen_t));
1238 addrLen = *((socklen_t *)addrlenBuf.
bufferPtr());
1241 struct sockaddr sa, *sap = NULL;
1245 memcpy(&sa, (
struct sockaddr *)addrBuf.
bufferPtr(),
1246 sizeof(
struct sockaddr));
1250 ssize_t recvd_size = recvfrom(sim_fd,
1252 bufrLen, flags, sap, (socklen_t *)&addrLen);
1254 if (recvd_size == -1)
1269 BufferArg addrlenBuf(addrlenPtr,
sizeof(socklen_t));
1270 *(socklen_t *)addrlenBuf.
bufferPtr() = addrLen;
1279 int tgt_fd,
Addr bufrPtr,
size_t bufrLen,
int flags,
1280 Addr addrPtr, socklen_t addrLen)
1284 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1287 int sim_fd = sfdp->getSimFD();
1293 struct sockaddr sa, *sap =
nullptr;
1294 memset(&sa, 0,
sizeof(sockaddr));
1298 memcpy(&sa, (sockaddr*)addrBuf.
bufferPtr(), addrLen);
1302 ssize_t sent_size = sendto(sim_fd,
1304 bufrLen, flags, sap, (socklen_t)addrLen);
1306 return (sent_size == -1) ? -errno : sent_size;
1311 int tgt_fd,
Addr msgPtr,
int flags)
1315 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1318 int sim_fd = sfdp->getSimFD();
1343 BufferArg msgBuf(msgPtr,
sizeof(
struct msghdr));
1345 struct msghdr *msgHdr = (
struct msghdr *)msgBuf.
bufferPtr();
1352 Addr msg_name_phold = 0;
1353 Addr msg_iov_phold = 0;
1354 Addr iovec_base_phold[msgHdr->msg_iovlen];
1355 Addr msg_control_phold = 0;
1361 if (msgHdr->msg_name) {
1362 msg_name_phold = (
Addr)msgHdr->msg_name;
1363 nameBuf =
new BufferArg(msg_name_phold, msgHdr->msg_namelen);
1365 msgHdr->msg_name = nameBuf->
bufferPtr();
1374 BufferArg *iovecBuf[msgHdr->msg_iovlen];
1375 for (
int i = 0;
i < msgHdr->msg_iovlen;
i++) {
1376 iovec_base_phold[
i] = 0;
1380 if (msgHdr->msg_iov) {
1381 msg_iov_phold = (
Addr)msgHdr->msg_iov;
1382 iovBuf =
new BufferArg(msg_iov_phold, msgHdr->msg_iovlen *
1383 sizeof(
struct iovec));
1385 for (
int i = 0;
i < msgHdr->msg_iovlen;
i++) {
1386 if (((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base) {
1387 iovec_base_phold[
i] =
1390 ((
struct iovec *)iovBuf->
bufferPtr())[i].iov_len);
1392 ((
struct iovec *)iovBuf->
bufferPtr())[i].iov_base =
1393 iovecBuf[i]->bufferPtr();
1396 msgHdr->msg_iov = (
struct iovec *)iovBuf->
bufferPtr();
1403 if (msgHdr->msg_control) {
1404 msg_control_phold = (
Addr)msgHdr->msg_control;
1405 controlBuf =
new BufferArg(msg_control_phold,
1406 CMSG_ALIGN(msgHdr->msg_controllen));
1408 msgHdr->msg_control = controlBuf->
bufferPtr();
1411 ssize_t recvd_size = recvmsg(sim_fd, msgHdr, flags);
1416 if (msgHdr->msg_name) {
1419 msgHdr->msg_name = (
void *)msg_name_phold;
1422 if (msgHdr->msg_iov) {
1423 for (
int i = 0;
i< msgHdr->msg_iovlen;
i++) {
1424 if (((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base) {
1427 ((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base =
1428 (
void *)iovec_base_phold[
i];
1433 msgHdr->msg_iov = (
struct iovec *)msg_iov_phold;
1436 if (msgHdr->msg_control) {
1439 msgHdr->msg_control = (
void *)msg_control_phold;
1449 int tgt_fd,
Addr msgPtr,
int flags)
1453 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1456 int sim_fd = sfdp->getSimFD();
1461 BufferArg msgBuf(msgPtr,
sizeof(
struct msghdr));
1463 struct msghdr msgHdr = *((
struct msghdr *)msgBuf.
bufferPtr());
1469 struct iovec *iovPtr = msgHdr.msg_iov;
1470 BufferArg iovBuf((
Addr)iovPtr,
sizeof(
struct iovec) * msgHdr.msg_iovlen);
1472 struct iovec *iov = (
struct iovec *)iovBuf.
bufferPtr();
1473 msgHdr.msg_iov = iov;
1488 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1489 Addr basePtr = (
Addr) iov[iovIndex].iov_base;
1490 bufferArray[iovIndex] =
new BufferArg(basePtr, iov[iovIndex].iov_len);
1492 iov[iovIndex].iov_base = bufferArray[iovIndex]->
bufferPtr();
1495 ssize_t sent_size = sendmsg(sim_fd, &msgHdr, flags);
1496 int local_errno = errno;
1501 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1511 return (sent_size < 0) ? -local_errno : sent_size;
1516 int tgt_fd,
int level,
int optname,
Addr valPtr,
Addr lenPtr)
1522 struct linger linger_val;
1523 struct timeval timeval_val;
1528 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1531 int sim_fd = sfdp->getSimFD();
1533 socklen_t
len =
sizeof(
val);
1534 int status = getsockopt(sim_fd, level, optname, &val, &len);
1554 int tgt_fd,
Addr addrPtr,
Addr lenPtr)
1558 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1561 int sim_fd = sfdp->getSimFD();
1567 BufferArg lenBuf(lenPtr,
sizeof(socklen_t));
1572 int status = getsockname(sim_fd, &sa, &len);
1591 int tgt_fd,
Addr sockAddrPtr,
Addr addrlenPtr)
1595 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1598 int sim_fd = sfdp->getSimFD();
1600 BufferArg bufAddrlen(addrlenPtr,
sizeof(
unsigned));
1604 int retval = getpeername(sim_fd,
1605 (
struct sockaddr *)bufSock.bufferPtr(),
1613 return (retval == -1) ? -errno : retval;
1618 int tgt_fd,
int level,
int optname,
Addr valPtr, socklen_t
len)
1625 auto sfdp = std::dynamic_pointer_cast<
SocketFDEntry>((*
p->fds)[tgt_fd]);
1628 int sim_fd = sfdp->getSimFD();
1630 int status = setsockopt(sim_fd, level, optname,
1633 return (status == -1) ? -errno :
status;
1651 if (node_ptr != 0) {
1657 return error ? -EFAULT : 0;
SyscallReturn getpidFunc(SyscallDesc *desc, ThreadContext *tc)
Target getpid() handler.
virtual void halt()=0
Set the status to Halted.
virtual System * getSystemPtr()=0
SyscallReturn closeFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd)
Target close() handler.
#define fatal(...)
This implements a cprintf based fatal() function.
SyscallReturn ignoreFunc(SyscallDesc *desc, 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.
const std::string & name()
SyscallReturn readlinkFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname, Addr buf_ptr, size_t bufsiz)
Target readlink() handler.
uint64_t childClearTID
Calls a futex wakeup at the address specified by this pointer when this process exits.
Trying to exit and waiting for an event to completely exit.
SyscallReturn linkFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname, Addr new_pathname)
Target link() handler.
bool copyIn(PortProxy &memproxy)
copy data into simulator space (read from target memory)
virtual PortProxy & getVirtProxy()=0
SyscallReturn setsockoptFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int level, int optname, Addr valPtr, socklen_t len)
SyscallReturn recvfromFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, Addr bufrPtr, size_t bufrLen, int flags, Addr addrPtr, Addr addrlenPtr)
virtual Process * getProcessPtr()=0
SyscallReturn sendmsgFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, Addr msgPtr, int flags)
Holds file descriptors for host-backed files; host-backed files are files which were opened on the ph...
SyscallReturn recvmsgFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, Addr msgPtr, int flags)
SyscallReturn pipe2Func(SyscallDesc *desc, ThreadContext *tc, Addr tgt_addr, int flags)
Target pipe() handler.
Overload hash function for BasicBlockRange type.
ByteOrder getGuestByteOrder() const
Get the guest byte order.
T roundUp(const T &val, const U &align)
This function is used to align addresses in memory.
SyscallReturn fcntlFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int cmd, GuestABI::VarArgs< int > varargs)
Target fcntl() handler.
SyscallReturn getpeernameFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, Addr sockAddrPtr, Addr addrlenPtr)
TypedBufferArg is a class template; instances of this template represent typed buffers in target user...
ThreadContext is the external interface to all thread state for anything outside of the CPU...
SyscallReturn ftruncateFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, off_t length)
Target ftruncate() handler.
SyscallReturn sendtoFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, Addr bufrPtr, size_t bufrLen, int flags, Addr addrPtr, socklen_t addrLen)
#define DPRINTF_SYSCALL(FLAGEXT, FMT,...)
This macro is intended to help with readability.
SyscallReturn fallocateFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int mode, off_t offset, off_t len)
SyscallReturn pipeFunc(SyscallDesc *desc, ThreadContext *tc, Addr tgt_addr)
Target pipe() handler.
SyscallReturn getgidFunc(SyscallDesc *desc, ThreadContext *tc)
Target getgid() handler.
SyscallReturn getcwdFunc(SyscallDesc *desc, ThreadContext *tc, Addr buf_ptr, unsigned long size)
Target getcwd() handler.
SyscallReturn fcntl64Func(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int cmd)
Target fcntl64() handler.
SyscallReturn unimplementedFunc(SyscallDesc *desc, ThreadContext *tc)
Handler for unimplemented syscalls that we haven't thought about.
SyscallReturn munmapFunc(SyscallDesc *desc, ThreadContext *tc, Addr start, size_t length)
Target munmap() handler.
SyscallReturn getuidFunc(SyscallDesc *desc, ThreadContext *tc)
SyscallReturn getppidFunc(SyscallDesc *desc, ThreadContext *tc)
Target getppid() handler.
SyscallReturn listenFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int backlog)
T htog(T value, ByteOrder guest_byte_order)
SyscallReturn lseekFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, uint64_t offs, int whence)
Target lseek() handler.
SyscallReturn getsockoptFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int level, int optname, Addr valPtr, Addr lenPtr)
SyscallReturn truncateFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname, off_t length)
Target truncate() handler.
SyscallReturn accessFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname, mode_t mode)
Target access() handler.
int wakeup(Addr addr, uint64_t tgid, int count)
Wakes up at most count waiting threads on a futex.
SyscallReturn symlinkFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname, Addr new_pathname)
Target symlink() handler.
SyscallReturn rmdirFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname)
SyscallReturn getsocknameFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, Addr addrPtr, Addr lenPtr)
SyscallReturn brkFunc(SyscallDesc *desc, ThreadContext *tc, Addr new_brk)
Target brk() handler: set brk address.
std::vector< ThreadContext * > threadContexts
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 fchownFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, uint32_t owner, uint32_t group)
Target fchown() handler.
SyscallReturn ignoreWarnOnceFunc(SyscallDesc *desc, ThreadContext *tc)
Like above, but only prints a warning once per syscall desc it's used with.
static bool readyToExit(Tick delay)
Initiate the exit from the simulation.
SyscallReturn pipePseudoFunc(SyscallDesc *desc, ThreadContext *tc)
Pseudo Funcs - These functions use a different return convension, returning a second value in a regis...
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
SyscallReturn _llseekFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, uint64_t offset_high, uint32_t offset_low, Addr result_ptr, int whence)
Target _llseek() handler.
SyscallReturn bindFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, Addr buf_ptr, int addrlen)
std::list< BasicSignal > signalList
bool startswith(const char *s, const char *prefix)
Return true if 's' starts with the prefix string 'prefix'.
This class provides the wrapper interface for the system call implementations which are defined in th...
SyscallReturn mkdirFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname, mode_t mode)
Target mkdir() handler.
SyscallReturn gethostnameFunc(SyscallDesc *desc, ThreadContext *tc, Addr buf_ptr, int name_len)
Target gethostname() 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 truncate64Func(SyscallDesc *desc, ThreadContext *tc, Addr pathname, int64_t length)
Target truncate64() handler.
This file defines objects used to emulate syscalls from the target application on the host machine...
SyscallReturn getpgrpFunc(SyscallDesc *desc, ThreadContext *tc)
Target getpgrpFunc() handler.
SyscallReturn connectFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, Addr buf_ptr, int addrlen)
std::string checkPathRedirect(const std::string &filename)
Redirect file path if it matches any keys initialized by system object.
bool copyOut(PortProxy &memproxy)
copy data out of simulator space (write to target memory)
SyscallReturn getpagesizeFunc(SyscallDesc *desc, ThreadContext *tc)
Target getpagesize() handler.
SyscallReturn unlinkFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname)
Target unlink() handler.
FutexMap class holds a map of all futexes used in the system.
virtual ContextID contextId() const =0
SyscallReturn exitGroupFunc(SyscallDesc *desc, ThreadContext *tc, int status)
Target exit_group() handler: terminate simulation. (exit all threads)
SyscallReturn chdirFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname)
Target chdir() handler.
BufferArg represents an untyped buffer in target user space that is passed by reference to an (emulat...
SyscallReturn mknodFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname, mode_t mode, dev_t dev)
Target mknod() handler.
SyscallReturn geteuidFunc(SyscallDesc *desc, ThreadContext *tc)
Target geteuid() handler.
SyscallReturn setTidAddressFunc(SyscallDesc *desc, ThreadContext *tc, uint64_t tidPtr)
Target set_tid_address() handler.
SyscallReturn umaskFunc(SyscallDesc *desc, ThreadContext *tc)
Target umask() handler.
static SyscallReturn exitImpl(SyscallDesc *desc, ThreadContext *tc, bool group, int status)
SyscallReturn renameFunc(SyscallDesc *desc, ThreadContext *tc, Addr oldpath, Addr newpath)
Target rename() handler.
Declaration and inline definition of ChunkGenerator object.
This class represents the return value from an emulated system call, including any errno setting...
SyscallReturn getegidFunc(SyscallDesc *desc, ThreadContext *tc)
Target getegid() handler.
void warnUnsupportedOS(std::string syscall_name)
SyscallReturn setpgidFunc(SyscallDesc *desc, ThreadContext *tc, int pid, int pgid)
Target setpgid() handler.
SyscallReturn shutdownFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int how)
Target shutdown() handler.
SyscallReturn dupFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd)
FIXME: The file description is not shared among file descriptors created with dup.
bool tryReadString(std::string &str, Addr addr) const
Reads the string at guest address addr into the std::string str.
SyscallReturn getcpuFunc(SyscallDesc *desc, ThreadContext *tc, Addr cpu_ptr, Addr node_ptr, Addr tcache_ptr)
SyscallReturn dup2Func(SyscallDesc *desc, ThreadContext *tc, int old_tgt_fd, int new_tgt_fd)
Target dup2() handler.
static void exitFutexWake(ThreadContext *tc, Addr addr, uint64_t tgid)
SyscallReturn ftruncate64Func(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int64_t length)
Target ftruncate64() handler.
Addr getPageBytes() const
Get the page bytes for the ISA.
SyscallReturn exitFunc(SyscallDesc *desc, ThreadContext *tc, int status)
Target exit() handler: terminate current context.
SyscallReturn chownFunc(SyscallDesc *desc, ThreadContext *tc, Addr pathname, uint32_t owner, uint32_t group)
Target chown() handler.
SyscallReturn gettidFunc(SyscallDesc *desc, ThreadContext *tc)
Target gettid() handler.
static std::vector< System * > systemList