44#include <sys/syscall.h>
51#include <unordered_map>
73 warn(
"Cannot invoke %s on host operating system.", syscall_name);
79 fatal(
"syscall %s (#%d) unimplemented.", desc->
name(), desc->
num());
86 warn(
"ignoring syscall %s(...)", desc->
name());
93 static std::unordered_map<SyscallDesc *, bool> bool_map;
95 bool &warned = bool_map[desc];
97 warn(
"ignoring syscall %s(...)\n"
98 " (further warnings will be suppressed)", desc->
name());
108 warn(
"ignoring syscall %s(...) returning -ENOSYS", desc->
name());
117 long *ctid = (
long *)ctidBuf.
bufferPtr();
134 *
p->exitGroup =
true;
136 if (
p->childClearTID)
139 bool last_thread =
true;
140 Process *parent =
nullptr, *tg_lead =
nullptr;
143 if (!(walk = sys->
threads[
i]->getProcessPtr()))
152 if (walk->
pid() ==
p->tgid())
165 if (walk->
tgid() ==
p->tgid()) {
178 if (*(
p->exitGroup)) {
194 if (*
p->sigchld && (
p->ppid() != 0) && (walk->
pid() ==
p->ppid()))
210 for (
int i = 0;
i <
p->fds->getSize();
i++) {
212 p->fds->closeFDEntry(
i);
220 if (!
p->vforkContexts.empty()) {
232 int activeContexts = 0;
234 activeContexts +=
system->threads.numRunning();
236 if (activeContexts == 0) {
282 std::shared_ptr<MemState> mem_state =
p->memState;
283 Addr brk_point = mem_state->getBrkPoint();
287 if (new_brk == 0 || (new_brk == brk_point))
290 mem_state->updateBrkRegion(brk_point, new_brk);
293 mem_state->getBrkPoint());
295 return mem_state->getBrkPoint();
304 return process->pid();
311 return p->fds->closeFDEntry(tgt_fd);
317 int tgt_fd, uint32_t offset_high, uint32_t offset_low,
318 VPtr<> result_ptr,
int whence)
322 auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*
p->fds)[tgt_fd]);
325 int sim_fd = ffdp->getSimFD();
327 uint64_t
offset = ((uint64_t) offset_high << 32) | offset_low;
329 uint64_t result = lseek(sim_fd,
offset, whence);
332 if (result == (off_t)-1)
335 BufferArg result_buf(result_ptr,
sizeof(result));
336 std::memcpy(result_buf.
bufferPtr(), &result,
sizeof(result));
346 VPtr<> buf_ptr,
int name_len)
368 path =
p->checkPathRedirect(path);
370 int result = unlink(path.c_str());
371 return (result == -1) ? -errno : result;
379 std::string new_path;
388 path =
p->absolutePath(path,
true);
389 new_path =
p->absolutePath(new_path,
true);
391 int result = link(path.c_str(), new_path.c_str());
392 return (result == -1) ? -errno : result;
400 std::string new_path;
409 path =
p->absolutePath(path,
true);
410 new_path =
p->absolutePath(new_path,
true);
412 int result = symlink(path.c_str(), new_path.c_str());
413 return (result == -1) ? -errno : result;
430 path =
p->checkPathRedirect(path);
432 auto result = mkdir(path.c_str(),
mode);
433 return (result == -1) ? -errno : result;
441 std::string old_name;
445 std::string new_name;
449 return renameImpl(desc, tc, old_name, new_name);
454 std::string old_name, std::string new_name)
459 old_name =
p->checkPathRedirect(old_name);
460 new_name =
p->checkPathRedirect(new_name);
462 int64_t result = rename(old_name.c_str(), new_name.c_str());
463 return (result == -1) ? -errno : result;
469 VPtr<> pathname, int64_t length)
481 int result = truncate(path.c_str(), length);
483 int result = truncate64(path.c_str(), length);
485 return (result == -1) ? -errno : result;
490 int tgt_fd, int64_t length)
494 auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*
p->fds)[tgt_fd]);
497 int sim_fd = ffdp->getSimFD();
500 int result = ftruncate(sim_fd, length);
502 int result = ftruncate64(sim_fd, length);
504 return (result == -1) ? -errno : result;
513 mode_t oldMask = umask(0);
520 VPtr<> pathname, uint32_t owner, uint32_t group)
526 return chownImpl(desc, tc, path, owner, group);
531 std::string path, uint32_t owner, uint32_t group)
536 uid_t hostOwner = owner;
537 gid_t hostGroup = group;
540 path =
p->checkPathRedirect(path);
542 int result = chown(path.c_str(), hostOwner, hostGroup);
543 return (result == -1) ? -errno : result;
548 int tgt_fd, uint32_t owner, uint32_t group)
552 auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*
p->fds)[tgt_fd]);
555 int sim_fd = ffdp->getSimFD();
558 uid_t hostOwner = owner;
559 gid_t hostGroup = group;
561 int result = fchown(sim_fd, hostOwner, hostGroup);
562 return (result == -1) ? -errno : result;
576 auto old_hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[tgt_fd]);
579 int sim_fd = old_hbfdp->getSimFD();
581 int result = dup(sim_fd);
585 auto new_hbfdp = std::dynamic_pointer_cast<HBFDEntry>(old_hbfdp->clone());
586 new_hbfdp->setSimFD(result);
587 new_hbfdp->setCOE(
false);
588 return p->fds->allocFD(new_hbfdp);
595 auto old_hbp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[old_tgt_fd]);
598 int old_sim_fd = old_hbp->getSimFD();
605 int res_fd = dup2(old_sim_fd, open(
"/dev/null", O_RDONLY));
609 auto new_hbp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[new_tgt_fd]);
611 p->fds->closeFDEntry(new_tgt_fd);
612 new_hbp = std::dynamic_pointer_cast<HBFDEntry>(old_hbp->clone());
613 new_hbp->setSimFD(res_fd);
614 new_hbp->setCOE(
false);
616 return p->fds->allocFD(new_hbp);
625 auto hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[tgt_fd]);
628 int sim_fd = hbfdp->getSimFD();
630 int coe = hbfdp->getCOE();
634 return coe & FD_CLOEXEC;
637 int arg = varargs.
get<
int>();
638 arg ? hbfdp->setCOE(
true) : hbfdp->setCOE(
false);
650 int arg = varargs.
get<
int>();
651 int rv = fcntl(sim_fd, cmd, arg);
652 return (rv == -1) ? -errno : rv;
656 warn(
"fcntl: unsupported command %d\n", cmd);
666 auto hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[tgt_fd]);
669 int sim_fd = hbfdp->getSimFD();
673 warn(
"fcntl64(%d, F_GETLK64) not supported, error returned\n", tgt_fd);
678 warn(
"fcntl64(%d, F_SETLK(W)64) not supported, error returned\n",
685 warn(
"fcntl64(%d, %d) passed through to host\n", tgt_fd, cmd);
686 return fcntl(sim_fd, cmd);
707 int sim_fds[2], tgt_fds[2];
709 int pipe_retval = pipe(sim_fds);
710 if (pipe_retval == -1)
714 auto rpfd = std::make_shared<PipeFDEntry>(sim_fds[0], O_WRONLY, rend);
715 tgt_fds[0] =
p->fds->allocFD(rpfd);
716 int sim_fd_rpfd = rpfd->getSimFD();
719 auto wpfd = std::make_shared<PipeFDEntry>(sim_fds[1], O_RDONLY, wend);
720 tgt_fds[1] =
p->fds->allocFD(wpfd);
721 int sim_fd_wpfd = wpfd->getSimFD();
727 rpfd->setPipeReadSource(tgt_fds[1]);
741 BufferArg tgt_handle(tgt_addr,
sizeof(
int[2]));
742 int *buf_ptr = (
int*)tgt_handle.
bufferPtr();
743 buf_ptr[0] = tgt_fds[0];
744 buf_ptr[1] = tgt_fds[1];
750 if ((flags != O_CLOEXEC) && (flags != O_NONBLOCK) &&
751 (flags != (O_CLOEXEC | O_NONBLOCK))) {
759 if (flags & O_NONBLOCK) {
766 if (fcntl(sim_fd_rpfd, F_SETFL, O_NONBLOCK)) {
769 if (fcntl(sim_fd_wpfd, F_SETFL, O_NONBLOCK)) {
778 if (flags & O_CLOEXEC) {
791 return process->
pgid();
803 process->pgid(process->pid());
811 for (
auto *tc: sysh->
threads) {
816 if (walk_ph && walk_ph->
pid() == process->pid())
817 matched_ph = walk_ph;
822 matched_ph->
pgid((pgid == 0) ? matched_ph->
pid() : pgid);
832 return process->
tgid();
839 return process->
pid();
846 return process->
ppid();
853 return process->
uid();
860 return process->
euid();
867 return process->
gid();
874 return process->
egid();
890 std::string path, mode_t
mode)
894 path =
p->checkPathRedirect(path);
896 int result = access(path.c_str(),
mode);
897 return (result == -1) ? -errno : result;
913 std::string path, mode_t
mode, dev_t dev)
916 path =
p->checkPathRedirect(path);
918 auto result = mknod(path.c_str(),
mode, dev);
919 return (result == -1) ? -errno : result;
935 if (!realpath((
p->tgtCwd +
"/" + path).c_str(), buf))
939 std::string host_cwd =
p->checkPathRedirect(tgt_cwd);
941 int result = chdir(host_cwd.c_str());
946 p->hostCwd = host_cwd;
965 path =
p->checkPathRedirect(path);
967 auto result = rmdir(path.c_str());
968 return (result == -1) ? -errno : result;
971#if defined(SYS_getdents) || defined(SYS_getdents64)
972template<
typename DE,
int SYS_NUM>
974getdentsImpl(SyscallDesc *desc, ThreadContext *tc,
977 auto p = tc->getProcessPtr();
979 auto hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[tgt_fd]);
982 int sim_fd = hbfdp->getSimFD();
984 BufferArg buf_arg(buf_ptr,
count);
985 auto status = syscall(SYS_NUM, sim_fd, buf_arg.bufferPtr(),
count);
990 unsigned traversed = 0;
991 while (traversed <
status) {
992 DE *buffer = (DE*)((
Addr)buf_arg.bufferPtr() + traversed);
994 auto host_reclen = buffer->d_reclen;
1001 const ByteOrder
bo = tc->getSystemPtr()->getGuestByteOrder();
1002 buffer->d_ino =
htog(buffer->d_ino,
bo);
1003 buffer->d_off =
htog(buffer->d_off,
bo);
1004 buffer->d_reclen =
htog(buffer->d_reclen,
bo);
1006 traversed += host_reclen;
1014#if defined(SYS_getdents)
1019 typedef struct linux_dirent
1021 unsigned long d_ino;
1022 unsigned long d_off;
1023 unsigned short d_reclen;
1027 return getdentsImpl<LinDent, SYS_getdents>(desc, tc,
1028 tgt_fd, buf_ptr,
count);
1032#if defined(SYS_getdents64)
1037 typedef struct linux_dirent64
1041 unsigned short d_reclen;
1045 return getdentsImpl<LinDent64, SYS_getdents64>(desc, tc,
1046 tgt_fd, buf_ptr,
count);
1055 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1058 int sim_fd = sfdp->getSimFD();
1060 int retval = shutdown(sim_fd, how);
1062 return (retval == -1) ? -errno : retval;
1067 int tgt_fd,
VPtr<> buf_ptr,
int addrlen)
1074 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1077 int sim_fd = sfdp->getSimFD();
1079 int status = ::bind(sim_fd,
1091 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1094 int sim_fd = sfdp->getSimFD();
1096 int status = listen(sim_fd, backlog);
1103 int tgt_fd,
VPtr<> buf_ptr,
int addrlen)
1110 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1113 int sim_fd = sfdp->getSimFD();
1115 int status = connect(sim_fd,
1116 (
struct sockaddr *)
addr.bufferPtr(),
1117 (socklen_t)addrlen);
1125 int tgt_fd,
VPtr<> msgPtr,
int flags)
1129 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1132 int sim_fd = sfdp->getSimFD();
1159 BufferArg msgBuf(msgPtr,
sizeof(
struct msghdr));
1161 struct msghdr *msgHdr = (
struct msghdr *)msgBuf.
bufferPtr();
1168 Addr msg_name_phold = 0;
1169 Addr msg_iov_phold = 0;
1170 auto iovec_base_phold = std::make_unique<Addr[]>(msgHdr->msg_iovlen);
1171 Addr msg_control_phold = 0;
1177 if (msgHdr->msg_name) {
1178 msg_name_phold = (
Addr)msgHdr->msg_name;
1179 nameBuf =
new BufferArg(msg_name_phold, msgHdr->msg_namelen);
1181 msgHdr->msg_name = nameBuf->
bufferPtr();
1190 auto iovecBuf = std::make_unique<BufferArg *[]>(msgHdr->msg_iovlen);
1191 for (
int i = 0;
i < msgHdr->msg_iovlen;
i++) {
1192 iovec_base_phold[
i] = 0;
1196 if (msgHdr->msg_iov) {
1197 msg_iov_phold = (
Addr)msgHdr->msg_iov;
1198 iovBuf =
new BufferArg(msg_iov_phold, msgHdr->msg_iovlen *
1199 sizeof(
struct iovec));
1201 for (
int i = 0;
i < msgHdr->msg_iovlen;
i++) {
1202 auto iov = ((
struct iovec *)iovBuf->
bufferPtr())[
i];
1204 iovec_base_phold[
i] = (
Addr)iov.iov_base;
1206 iovec_base_phold[
i], iov.iov_len);
1207 iovecBuf[
i]->copyIn(proxy);
1208 iov.iov_base = iovecBuf[
i]->bufferPtr();
1211 msgHdr->msg_iov = (
struct iovec *)iovBuf->
bufferPtr();
1218 if (msgHdr->msg_control) {
1219 msg_control_phold = (
Addr)msgHdr->msg_control;
1220 controlBuf =
new BufferArg(msg_control_phold,
1221 CMSG_ALIGN(msgHdr->msg_controllen));
1222 controlBuf->
copyIn(proxy);
1223 msgHdr->msg_control = controlBuf->
bufferPtr();
1226 ssize_t recvd_size = recvmsg(sim_fd, msgHdr, flags);
1231 if (msgHdr->msg_name) {
1234 msgHdr->msg_name = (
void *)msg_name_phold;
1237 if (msgHdr->msg_iov) {
1238 for (
int i = 0;
i< msgHdr->msg_iovlen;
i++) {
1239 auto iov = ((
struct iovec *)iovBuf->
bufferPtr())[
i];
1241 iovecBuf[
i]->copyOut(proxy);
1243 iov.iov_base = (
void *)iovec_base_phold[
i];
1248 msgHdr->msg_iov = (
struct iovec *)msg_iov_phold;
1251 if (msgHdr->msg_control) {
1254 msgHdr->msg_control = (
void *)msg_control_phold;
1264 int tgt_fd,
VPtr<> msgPtr,
int flags)
1268 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1271 int sim_fd = sfdp->getSimFD();
1278 BufferArg msgBuf(msgPtr,
sizeof(
struct msghdr));
1280 struct msghdr msgHdr = *((
struct msghdr *)msgBuf.
bufferPtr());
1286 struct iovec *iovPtr = msgHdr.msg_iov;
1287 BufferArg iovBuf((
Addr)iovPtr,
sizeof(
struct iovec) * msgHdr.msg_iovlen);
1289 struct iovec *iov = (
struct iovec *)iovBuf.
bufferPtr();
1290 msgHdr.msg_iov = iov;
1305 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1306 Addr basePtr = (
Addr) iov[iovIndex].iov_base;
1307 bufferArray[iovIndex] =
new BufferArg(basePtr, iov[iovIndex].iov_len);
1308 bufferArray[iovIndex]->
copyIn(proxy);
1309 iov[iovIndex].iov_base = bufferArray[iovIndex]->
bufferPtr();
1312 ssize_t sent_size = sendmsg(sim_fd, &msgHdr, flags);
1313 int local_errno = errno;
1318 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1328 return (sent_size < 0) ? -local_errno : sent_size;
1333 int tgt_fd,
int level,
int optname,
VPtr<> valPtr,
1341 struct linger linger_val;
1342 struct timeval timeval_val;
1347 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1350 int sim_fd = sfdp->getSimFD();
1352 socklen_t
len =
sizeof(
val);
1379 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1382 int sim_fd = sfdp->getSimFD();
1390 BufferArg lenBuf(lenPtr,
sizeof(socklen_t));
1418 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1421 int sim_fd = sfdp->getSimFD();
1425 BufferArg bufAddrlen(addrlenPtr,
sizeof(
unsigned));
1426 bufAddrlen.
copyIn(proxy);
1429 int retval = getpeername(sim_fd,
1438 return (retval == -1) ? -errno : retval;
1443 int tgt_fd,
int level,
int optname,
VPtr<> valPtr,
1451 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1454 int sim_fd = sfdp->getSimFD();
1481 if (!paramPtr || pid < 0)
1484 warn_once(
"sched_getparam: pretending sched_priority is 0 for all PIDs\n");
Declaration and inline definition of ChunkGenerator object.
bool copyIn(const PortProxy &memproxy)
copy data into simulator space (read from target memory)
bool copyOut(const PortProxy &memproxy)
copy data out of simulator space (write to target memory)
BufferArg represents an untyped buffer in target user space that is passed by reference to an (emulat...
void * bufferPtr()
Return a pointer to the internal simulator-space buffer.
static bool readyToExit(Tick delay)
Initiate the exit from the simulation.
FutexMap class holds a map of all futexes used in the system.
int wakeup(Addr addr, uint64_t tgid, int count)
Wakes up at most count waiting threads on a futex.
bool tryReadString(std::string &str, Addr addr) const
Reads the string at guest address addr into the std::string str.
std::string checkPathRedirect(const std::string &filename)
Redirect file path if it matches any keys initialized by system object.
EmulationPageTable * pTable
uint64_t childClearTID
Calls a futex wakeup at the address specified by this pointer when this process exits.
This class provides the wrapper interface for the system call implementations which are defined in th...
This class represents the return value from an emulated system call, including any errno setting.
std::list< BasicSignal > signalList
ByteOrder getGuestByteOrder() const
Get the guest byte order.
static std::vector< System * > systemList
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual void activate()=0
Set the status to Active.
virtual System * getSystemPtr()=0
virtual void halt()=0
Set the status to Halted.
@ Halted
Permanently shut down.
@ Halting
Trying to exit and waiting for an event to completely exit.
@ Suspended
Temporarily inactive.
virtual Status status() const =0
virtual Process * getProcessPtr()=0
virtual ContextID contextId() const =0
#define fatal(...)
This implements a cprintf based fatal() function.
Copyright (c) 2024 Arm Limited All rights reserved.
SyscallReturn linkFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname, VPtr<> new_pathname)
Target link() handler.
SyscallReturn getppidFunc(SyscallDesc *desc, ThreadContext *tc)
Target getppid() handler.
SyscallReturn exitGroupFunc(SyscallDesc *desc, ThreadContext *tc, int status)
Target exit_group() handler: terminate simulation. (exit all threads)
SyscallReturn gettidFunc(SyscallDesc *desc, ThreadContext *tc)
Target gettid() handler.
SyscallReturn recvmsgFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, VPtr<> msgPtr, int flags)
void warnUnsupportedOS(std::string syscall_name)
SyscallReturn brkFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> new_brk)
Target brk() handler: set brk address.
SyscallReturn pipe2Func(SyscallDesc *desc, ThreadContext *tc, VPtr<> tgt_addr, int flags)
Target pipe() handler.
SyscallReturn getpidFunc(SyscallDesc *desc, ThreadContext *tc)
Target getpid() handler.
bool startswith(const char *s, const char *prefix)
Return true if 's' starts with the prefix string 'prefix'.
SyscallReturn chdirFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname)
Target chdir() handler.
SyscallReturn truncate64Func(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname, int64_t length)
Target truncate64() handler.
SyscallReturn getuidFunc(SyscallDesc *desc, ThreadContext *tc)
SyscallReturn pipePseudoFunc(SyscallDesc *desc, ThreadContext *tc)
Pseudo Funcs - These functions use a different return convension, returning a second value in a regis...
static void exitFutexWake(ThreadContext *tc, VPtr<> addr, uint64_t tgid)
SyscallReturn chownFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname, uint32_t owner, uint32_t group)
Target chown() handler.
SyscallReturn renameImpl(SyscallDesc *desc, ThreadContext *tc, std::string old_name, std::string new_name)
SyscallReturn _llseekFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, uint32_t offset_high, uint32_t offset_low, VPtr<> result_ptr, int whence)
Target _llseek() handler.
SyscallReturn mknodImpl(SyscallDesc *desc, ThreadContext *tc, std::string path, mode_t mode, dev_t dev)
SyscallReturn renameFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> oldpath, VPtr<> newpath)
Target rename() handler.
SyscallReturn mknodFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname, mode_t mode, dev_t dev)
Target mknod() handler.
SyscallReturn setpgidFunc(SyscallDesc *desc, ThreadContext *tc, int pid, int pgid)
Target setpgid() handler.
SyscallReturn geteuidFunc(SyscallDesc *desc, ThreadContext *tc)
Target geteuid() handler.
SyscallReturn symlinkFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname, VPtr<> new_pathname)
Target symlink() handler.
ProxyPtr< T, SETranslatingPortProxy > VPtr
SyscallReturn unlinkFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname)
Target unlink() handler.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
SyscallReturn accessImpl(SyscallDesc *desc, ThreadContext *tc, std::string path, mode_t mode)
SyscallReturn chownImpl(SyscallDesc *desc, ThreadContext *tc, std::string path, uint32_t owner, uint32_t group)
SyscallReturn pipeFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> tgt_addr)
Target pipe() handler.
SyscallReturn getsockoptFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int level, int optname, VPtr<> valPtr, VPtr<> lenPtr)
void exitSimLoop(const std::string &message, int exit_code, Tick when, Tick repeat, bool serialize)
The "old style" exitSimLoop functions.
SyscallReturn fcntl64Func(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int cmd)
Target fcntl64() handler.
SyscallReturn ignoreWarnOnceFunc(SyscallDesc *desc, ThreadContext *tc)
Like above, but only prints a warning once per syscall desc it's used with.
SyscallReturn setsockoptFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int level, int optname, VPtr<> valPtr, socklen_t len)
SyscallReturn getpagesizeFunc(SyscallDesc *desc, ThreadContext *tc)
Target getpagesize() handler.
SyscallReturn rmdirFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname)
SyscallReturn mkdirFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname, mode_t mode)
Target mkdir() handler.
SyscallReturn getpgrpFunc(SyscallDesc *desc, ThreadContext *tc)
Target getpgrpFunc() handler.
SyscallReturn unlinkImpl(SyscallDesc *desc, ThreadContext *tc, std::string path)
SyscallReturn dupFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd)
FIXME: The file description is not shared among file descriptors created with dup.
SyscallReturn listenFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int backlog)
SyscallReturn ftruncate64Func(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int64_t length)
Target ftruncate64() handler.
SyscallReturn fchownFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, uint32_t owner, uint32_t group)
Target fchown() handler.
SyscallReturn setTidAddressFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> tidPtr)
Target set_tid_address() handler.
SyscallReturn fcntlFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int cmd, guest_abi::VarArgs< int > varargs)
Target fcntl() handler.
T htog(T value, ByteOrder guest_byte_order)
SyscallReturn bindFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, VPtr<> buf_ptr, int addrlen)
SyscallReturn getegidFunc(SyscallDesc *desc, ThreadContext *tc)
Target getegid() handler.
SyscallReturn shutdownFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, int how)
Target shutdown() handler.
SyscallReturn getcpuFunc(SyscallDesc *desc, ThreadContext *tc, VPtr< uint32_t > cpu, VPtr< uint32_t > node, VPtr< uint32_t > tcache)
SyscallReturn getsocknameFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, VPtr<> addrPtr, VPtr<> lenPtr)
SyscallReturn mkdirImpl(SyscallDesc *desc, ThreadContext *tc, std::string path, mode_t mode)
SyscallReturn getpeernameFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, VPtr<> sockAddrPtr, VPtr<> addrlenPtr)
SyscallReturn unimplementedFunc(SyscallDesc *desc, ThreadContext *tc)
Handler for unimplemented syscalls that we haven't thought about.
SyscallReturn ignoreWithEnosysFunc(SyscallDesc *desc, ThreadContext *tc)
Handler for unimplemented syscalls that return -ENOSYS to the target program.
SyscallReturn gethostnameFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> buf_ptr, int name_len)
Target gethostname() handler.
SyscallReturn accessFunc(SyscallDesc *desc, ThreadContext *tc, VPtr<> pathname, mode_t mode)
Target access() handler.
SyscallReturn sendmsgFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, VPtr<> msgPtr, int flags)
SyscallReturn ignoreFunc(SyscallDesc *desc, ThreadContext *tc)
Handler for unimplemented syscalls that we never intend to implement (signal handling,...
SyscallReturn rmdirImpl(SyscallDesc *desc, ThreadContext *tc, std::string path)
static SyscallReturn exitImpl(SyscallDesc *desc, ThreadContext *tc, bool group, int status)
SyscallReturn connectFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd, VPtr<> buf_ptr, int addrlen)
SyscallReturn sched_getparamFunc(SyscallDesc *desc, ThreadContext *tc, int pid, VPtr< int > paramPtr)
SyscallReturn exitFunc(SyscallDesc *desc, ThreadContext *tc, int status)
Target exit() handler: terminate current context.
SyscallReturn dup2Func(SyscallDesc *desc, ThreadContext *tc, int old_tgt_fd, int new_tgt_fd)
Target dup2() handler.
SyscallReturn getgidFunc(SyscallDesc *desc, ThreadContext *tc)
Target getgid() handler.
SyscallReturn closeFunc(SyscallDesc *desc, ThreadContext *tc, int tgt_fd)
Target close() handler.
SyscallReturn umaskFunc(SyscallDesc *desc, ThreadContext *tc)
Target umask() handler.
Declarations of a non-full system Page Table.
#define DPRINTF_SYSCALL(FLAGEXT, FMT,...)
This macro is intended to help with readability.
This file defines objects used to emulate syscalls from the target application on the host machine.
const std::string & name()