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());
110 long *ctid = (
long *)ctidBuf.
bufferPtr();
127 *
p->exitGroup =
true;
129 if (
p->childClearTID)
132 bool last_thread =
true;
133 Process *parent =
nullptr, *tg_lead =
nullptr;
136 if (!(walk = sys->
threads[
i]->getProcessPtr()))
145 if (walk->
pid() ==
p->tgid())
158 if (walk->
tgid() ==
p->tgid()) {
171 if (*(
p->exitGroup)) {
187 if (*
p->sigchld && (
p->ppid() != 0) && (walk->
pid() ==
p->ppid()))
203 for (
int i = 0;
i <
p->fds->getSize();
i++) {
205 p->fds->closeFDEntry(
i);
213 if (!
p->vforkContexts.empty()) {
225 int activeContexts = 0;
227 activeContexts +=
system->threads.numRunning();
229 if (activeContexts == 0) {
275 std::shared_ptr<MemState> mem_state =
p->
memState;
276 Addr brk_point = mem_state->getBrkPoint();
280 if (new_brk == 0 || (new_brk == brk_point))
283 mem_state->updateBrkRegion(brk_point, new_brk);
286 mem_state->getBrkPoint());
288 return mem_state->getBrkPoint();
297 return process->pid();
304 return p->
fds->closeFDEntry(tgt_fd);
310 int tgt_fd, uint32_t offset_high, uint32_t offset_low,
311 VPtr<> result_ptr,
int whence)
315 auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*
p->fds)[tgt_fd]);
318 int sim_fd = ffdp->getSimFD();
320 uint64_t
offset = ((uint64_t) offset_high << 32) | offset_low;
322 uint64_t result = lseek(sim_fd,
offset, whence);
325 if (result == (off_t)-1)
328 BufferArg result_buf(result_ptr,
sizeof(result));
329 std::memcpy(result_buf.
bufferPtr(), &result,
sizeof(result));
339 VPtr<> buf_ptr,
int name_len)
363 int result = unlink(path.c_str());
364 return (result == -1) ? -errno : result;
372 std::string new_path;
381 path =
p->absolutePath(path,
true);
382 new_path =
p->absolutePath(new_path,
true);
384 int result = link(path.c_str(), new_path.c_str());
385 return (result == -1) ? -errno : result;
393 std::string new_path;
402 path =
p->absolutePath(path,
true);
403 new_path =
p->absolutePath(new_path,
true);
405 int result = symlink(path.c_str(), new_path.c_str());
406 return (result == -1) ? -errno : result;
425 auto result = mkdir(path.c_str(),
mode);
426 return (result == -1) ? -errno : result;
434 std::string old_name;
438 std::string new_name;
442 return renameImpl(desc, tc, old_name, new_name);
447 std::string old_name, std::string new_name)
453 new_name =
p->checkPathRedirect(new_name);
455 int64_t result = rename(old_name.c_str(), new_name.c_str());
456 return (result == -1) ? -errno : result;
462 VPtr<> pathname, int64_t length)
474 int result = truncate(path.c_str(), length);
476 int result = truncate64(path.c_str(), length);
478 return (result == -1) ? -errno : result;
483 int tgt_fd, int64_t length)
487 auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*
p->fds)[tgt_fd]);
490 int sim_fd = ffdp->getSimFD();
493 int result = ftruncate(sim_fd, length);
495 int result = ftruncate64(sim_fd, length);
497 return (result == -1) ? -errno : result;
506 mode_t oldMask = umask(0);
513 VPtr<> pathname, uint32_t owner, uint32_t group)
519 return chownImpl(desc, tc, path, owner, group);
524 std::string path, uint32_t owner, uint32_t group)
529 uid_t hostOwner = owner;
530 gid_t hostGroup = group;
535 int result = chown(path.c_str(), hostOwner, hostGroup);
536 return (result == -1) ? -errno : result;
541 int tgt_fd, uint32_t owner, uint32_t group)
545 auto ffdp = std::dynamic_pointer_cast<FileFDEntry>((*
p->fds)[tgt_fd]);
548 int sim_fd = ffdp->getSimFD();
551 uid_t hostOwner = owner;
552 gid_t hostGroup = group;
554 int result = fchown(sim_fd, hostOwner, hostGroup);
555 return (result == -1) ? -errno : result;
569 auto old_hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[tgt_fd]);
572 int sim_fd = old_hbfdp->getSimFD();
574 int result = dup(sim_fd);
578 auto new_hbfdp = std::dynamic_pointer_cast<HBFDEntry>(old_hbfdp->clone());
579 new_hbfdp->setSimFD(result);
580 new_hbfdp->setCOE(
false);
581 return p->fds->allocFD(new_hbfdp);
588 auto old_hbp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[old_tgt_fd]);
591 int old_sim_fd = old_hbp->getSimFD();
598 int res_fd = dup2(old_sim_fd, open(
"/dev/null", O_RDONLY));
602 auto new_hbp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[new_tgt_fd]);
604 p->fds->closeFDEntry(new_tgt_fd);
605 new_hbp = std::dynamic_pointer_cast<HBFDEntry>(old_hbp->clone());
606 new_hbp->setSimFD(res_fd);
607 new_hbp->setCOE(
false);
609 return p->fds->allocFD(new_hbp);
618 auto hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[tgt_fd]);
621 int sim_fd = hbfdp->getSimFD();
623 int coe = hbfdp->getCOE();
627 return coe & FD_CLOEXEC;
630 int arg = varargs.
get<
int>();
631 arg ? hbfdp->setCOE(
true) : hbfdp->setCOE(
false);
643 int arg = varargs.
get<
int>();
644 int rv = fcntl(sim_fd, cmd, arg);
645 return (rv == -1) ? -errno : rv;
649 warn(
"fcntl: unsupported command %d\n", cmd);
659 auto hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[tgt_fd]);
662 int sim_fd = hbfdp->getSimFD();
666 warn(
"fcntl64(%d, F_GETLK64) not supported, error returned\n", tgt_fd);
671 warn(
"fcntl64(%d, F_SETLK(W)64) not supported, error returned\n",
678 warn(
"fcntl64(%d, %d) passed through to host\n", tgt_fd, cmd);
679 return fcntl(sim_fd, cmd);
700 int sim_fds[2], tgt_fds[2];
702 int pipe_retval = pipe(sim_fds);
703 if (pipe_retval == -1)
707 auto rpfd = std::make_shared<PipeFDEntry>(sim_fds[0], O_WRONLY, rend);
708 tgt_fds[0] =
p->fds->allocFD(rpfd);
709 int sim_fd_rpfd = rpfd->getSimFD();
712 auto wpfd = std::make_shared<PipeFDEntry>(sim_fds[1], O_RDONLY, wend);
713 tgt_fds[1] =
p->fds->allocFD(wpfd);
714 int sim_fd_wpfd = wpfd->getSimFD();
720 rpfd->setPipeReadSource(tgt_fds[1]);
734 BufferArg tgt_handle(tgt_addr,
sizeof(
int[2]));
735 int *buf_ptr = (
int*)tgt_handle.
bufferPtr();
736 buf_ptr[0] = tgt_fds[0];
737 buf_ptr[1] = tgt_fds[1];
743 if ((
flags != O_CLOEXEC) && (
flags != O_NONBLOCK) &&
744 (
flags != (O_CLOEXEC | O_NONBLOCK))) {
752 if (
flags & O_NONBLOCK) {
759 if (fcntl(sim_fd_rpfd, F_SETFL, O_NONBLOCK)) {
762 if (fcntl(sim_fd_wpfd, F_SETFL, O_NONBLOCK)) {
771 if (
flags & O_CLOEXEC) {
784 return process->
pgid();
796 process->
pgid(process->pid());
804 for (
auto *tc: sysh->
threads) {
809 if (walk_ph && walk_ph->
pid() == process->pid())
810 matched_ph = walk_ph;
815 matched_ph->
pgid((pgid == 0) ? matched_ph->
pid() : pgid);
825 return process->
tgid();
832 return process->
pid();
839 return process->
ppid();
846 return process->
uid();
853 return process->
euid();
860 return process->
gid();
867 return process->
egid();
883 std::string path, mode_t
mode)
889 int result = access(path.c_str(),
mode);
890 return (result == -1) ? -errno : result;
906 std::string path, mode_t
mode, dev_t dev)
911 auto result = mknod(path.c_str(),
mode, dev);
912 return (result == -1) ? -errno : result;
928 if (!realpath((
p->tgtCwd +
"/" + path).c_str(), buf))
934 int result = chdir(host_cwd.c_str());
939 p->hostCwd = host_cwd;
960 auto result = rmdir(path.c_str());
961 return (result == -1) ? -errno : result;
964#if defined(SYS_getdents) || defined(SYS_getdents64)
965template<
typename DE,
int SYS_NUM>
967getdentsImpl(SyscallDesc *desc, ThreadContext *tc,
968 int tgt_fd, VPtr<> buf_ptr,
unsigned count)
970 auto p = tc->getProcessPtr();
972 auto hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*
p->fds)[tgt_fd]);
975 int sim_fd = hbfdp->getSimFD();
977 BufferArg buf_arg(buf_ptr,
count);
978 auto status = syscall(SYS_NUM, sim_fd, buf_arg.bufferPtr(),
count);
983 unsigned traversed = 0;
984 while (traversed <
status) {
985 DE *buffer = (DE*)((
Addr)buf_arg.bufferPtr() + traversed);
987 auto host_reclen = buffer->d_reclen;
994 const ByteOrder
bo = tc->getSystemPtr()->getGuestByteOrder();
995 buffer->d_ino =
htog(buffer->d_ino,
bo);
996 buffer->d_off =
htog(buffer->d_off,
bo);
997 buffer->d_reclen =
htog(buffer->d_reclen,
bo);
999 traversed += host_reclen;
1002 buf_arg.copyOut(SETranslatingPortProxy(tc));
1007#if defined(SYS_getdents)
1009getdentsFunc(SyscallDesc *desc, ThreadContext *tc,
1010 int tgt_fd, VPtr<> buf_ptr,
unsigned count)
1012 typedef struct linux_dirent
1014 unsigned long d_ino;
1015 unsigned long d_off;
1016 unsigned short d_reclen;
1020 return getdentsImpl<LinDent, SYS_getdents>(desc, tc,
1021 tgt_fd, buf_ptr,
count);
1025#if defined(SYS_getdents64)
1027getdents64Func(SyscallDesc *desc, ThreadContext *tc,
1028 int tgt_fd, VPtr<> buf_ptr,
unsigned count)
1030 typedef struct linux_dirent64
1034 unsigned short d_reclen;
1038 return getdentsImpl<LinDent64, SYS_getdents64>(desc, tc,
1039 tgt_fd, buf_ptr,
count);
1048 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1051 int sim_fd = sfdp->getSimFD();
1053 int retval = shutdown(sim_fd, how);
1055 return (retval == -1) ? -errno : retval;
1060 int tgt_fd,
VPtr<> buf_ptr,
int addrlen)
1067 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1070 int sim_fd = sfdp->getSimFD();
1072 int status = ::bind(sim_fd,
1084 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1087 int sim_fd = sfdp->getSimFD();
1089 int status = listen(sim_fd, backlog);
1096 int tgt_fd,
VPtr<> buf_ptr,
int addrlen)
1103 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1106 int sim_fd = sfdp->getSimFD();
1108 int status = connect(sim_fd,
1109 (
struct sockaddr *)
addr.bufferPtr(),
1110 (socklen_t)addrlen);
1122 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1125 int sim_fd = sfdp->getSimFD();
1152 BufferArg msgBuf(msgPtr,
sizeof(
struct msghdr));
1154 struct msghdr *msgHdr = (
struct msghdr *)msgBuf.
bufferPtr();
1161 Addr msg_name_phold = 0;
1162 Addr msg_iov_phold = 0;
1163 Addr iovec_base_phold[msgHdr->msg_iovlen];
1164 Addr msg_control_phold = 0;
1170 if (msgHdr->msg_name) {
1171 msg_name_phold = (
Addr)msgHdr->msg_name;
1172 nameBuf =
new BufferArg(msg_name_phold, msgHdr->msg_namelen);
1174 msgHdr->msg_name = nameBuf->
bufferPtr();
1183 BufferArg *iovecBuf[msgHdr->msg_iovlen];
1184 for (
int i = 0;
i < msgHdr->msg_iovlen;
i++) {
1185 iovec_base_phold[
i] = 0;
1189 if (msgHdr->msg_iov) {
1190 msg_iov_phold = (
Addr)msgHdr->msg_iov;
1191 iovBuf =
new BufferArg(msg_iov_phold, msgHdr->msg_iovlen *
1192 sizeof(
struct iovec));
1194 for (
int i = 0;
i < msgHdr->msg_iovlen;
i++) {
1195 if (((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base) {
1196 iovec_base_phold[
i] =
1199 ((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_len);
1201 ((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base =
1202 iovecBuf[
i]->bufferPtr();
1205 msgHdr->msg_iov = (
struct iovec *)iovBuf->
bufferPtr();
1212 if (msgHdr->msg_control) {
1213 msg_control_phold = (
Addr)msgHdr->msg_control;
1214 controlBuf =
new BufferArg(msg_control_phold,
1215 CMSG_ALIGN(msgHdr->msg_controllen));
1216 controlBuf->
copyIn(proxy);
1217 msgHdr->msg_control = controlBuf->
bufferPtr();
1220 ssize_t recvd_size = recvmsg(sim_fd, msgHdr,
flags);
1225 if (msgHdr->msg_name) {
1228 msgHdr->msg_name = (
void *)msg_name_phold;
1231 if (msgHdr->msg_iov) {
1232 for (
int i = 0;
i< msgHdr->msg_iovlen;
i++) {
1233 if (((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base) {
1236 ((
struct iovec *)iovBuf->
bufferPtr())[
i].iov_base =
1237 (
void *)iovec_base_phold[
i];
1242 msgHdr->msg_iov = (
struct iovec *)msg_iov_phold;
1245 if (msgHdr->msg_control) {
1248 msgHdr->msg_control = (
void *)msg_control_phold;
1262 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1265 int sim_fd = sfdp->getSimFD();
1272 BufferArg msgBuf(msgPtr,
sizeof(
struct msghdr));
1274 struct msghdr msgHdr = *((
struct msghdr *)msgBuf.
bufferPtr());
1280 struct iovec *iovPtr = msgHdr.msg_iov;
1281 BufferArg iovBuf((
Addr)iovPtr,
sizeof(
struct iovec) * msgHdr.msg_iovlen);
1283 struct iovec *iov = (
struct iovec *)iovBuf.
bufferPtr();
1284 msgHdr.msg_iov = iov;
1299 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1300 Addr basePtr = (
Addr) iov[iovIndex].iov_base;
1301 bufferArray[iovIndex] =
new BufferArg(basePtr, iov[iovIndex].iov_len);
1302 bufferArray[iovIndex]->
copyIn(proxy);
1303 iov[iovIndex].iov_base = bufferArray[iovIndex]->
bufferPtr();
1306 ssize_t sent_size = sendmsg(sim_fd, &msgHdr,
flags);
1307 int local_errno = errno;
1312 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1322 return (sent_size < 0) ? -local_errno : sent_size;
1327 int tgt_fd,
int level,
int optname,
VPtr<> valPtr,
1335 struct linger linger_val;
1336 struct timeval timeval_val;
1341 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1344 int sim_fd = sfdp->getSimFD();
1346 socklen_t
len =
sizeof(
val);
1373 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1376 int sim_fd = sfdp->getSimFD();
1384 BufferArg lenBuf(lenPtr,
sizeof(socklen_t));
1412 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1415 int sim_fd = sfdp->getSimFD();
1419 BufferArg bufAddrlen(addrlenPtr,
sizeof(
unsigned));
1420 bufAddrlen.
copyIn(proxy);
1423 int retval = getpeername(sim_fd,
1432 return (retval == -1) ? -errno : retval;
1437 int tgt_fd,
int level,
int optname,
VPtr<> valPtr,
1445 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1448 int sim_fd = sfdp->getSimFD();
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::shared_ptr< MemState > memState
std::shared_ptr< FDArray > fds
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.
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)
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.
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 (...
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 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 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()