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)
361 path =
p->checkPathRedirect(path);
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;
423 path =
p->checkPathRedirect(path);
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)
452 old_name =
p->checkPathRedirect(old_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;
533 path =
p->checkPathRedirect(path);
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)
887 path =
p->checkPathRedirect(path);
889 int result = access(path.c_str(),
mode);
890 return (result == -1) ? -errno : result;
906 std::string path, mode_t
mode, dev_t dev)
909 path =
p->checkPathRedirect(path);
911 auto result = mknod(path.c_str(),
mode, dev);
912 return (result == -1) ? -errno : result;
928 if (!realpath((
p->tgtCwd +
"/" + path).c_str(), buf))
932 std::string host_cwd =
p->checkPathRedirect(tgt_cwd);
934 int result = chdir(host_cwd.c_str());
939 p->hostCwd = host_cwd;
958 path =
p->checkPathRedirect(path);
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,
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;
1007#if defined(SYS_getdents)
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)
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);
1118 int tgt_fd,
VPtr<> msgPtr,
int flags)
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 auto iovec_base_phold = std::make_unique<Addr[]>(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 auto iovecBuf = std::make_unique<BufferArg *[]>(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 auto iov = ((
struct iovec *)iovBuf->
bufferPtr())[
i];
1197 iovec_base_phold[
i] = (
Addr)iov.iov_base;
1199 iovec_base_phold[
i], iov.iov_len);
1200 iovecBuf[
i]->copyIn(proxy);
1201 iov.iov_base = iovecBuf[
i]->bufferPtr();
1204 msgHdr->msg_iov = (
struct iovec *)iovBuf->
bufferPtr();
1211 if (msgHdr->msg_control) {
1212 msg_control_phold = (
Addr)msgHdr->msg_control;
1213 controlBuf =
new BufferArg(msg_control_phold,
1214 CMSG_ALIGN(msgHdr->msg_controllen));
1215 controlBuf->
copyIn(proxy);
1216 msgHdr->msg_control = controlBuf->
bufferPtr();
1219 ssize_t recvd_size = recvmsg(sim_fd, msgHdr, flags);
1224 if (msgHdr->msg_name) {
1227 msgHdr->msg_name = (
void *)msg_name_phold;
1230 if (msgHdr->msg_iov) {
1231 for (
int i = 0;
i< msgHdr->msg_iovlen;
i++) {
1232 auto iov = ((
struct iovec *)iovBuf->
bufferPtr())[
i];
1234 iovecBuf[
i]->copyOut(proxy);
1236 iov.iov_base = (
void *)iovec_base_phold[
i];
1241 msgHdr->msg_iov = (
struct iovec *)msg_iov_phold;
1244 if (msgHdr->msg_control) {
1247 msgHdr->msg_control = (
void *)msg_control_phold;
1257 int tgt_fd,
VPtr<> msgPtr,
int flags)
1261 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1264 int sim_fd = sfdp->getSimFD();
1271 BufferArg msgBuf(msgPtr,
sizeof(
struct msghdr));
1273 struct msghdr msgHdr = *((
struct msghdr *)msgBuf.
bufferPtr());
1279 struct iovec *iovPtr = msgHdr.msg_iov;
1280 BufferArg iovBuf((
Addr)iovPtr,
sizeof(
struct iovec) * msgHdr.msg_iovlen);
1282 struct iovec *iov = (
struct iovec *)iovBuf.
bufferPtr();
1283 msgHdr.msg_iov = iov;
1298 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1299 Addr basePtr = (
Addr) iov[iovIndex].iov_base;
1300 bufferArray[iovIndex] =
new BufferArg(basePtr, iov[iovIndex].iov_len);
1301 bufferArray[iovIndex]->
copyIn(proxy);
1302 iov[iovIndex].iov_base = bufferArray[iovIndex]->
bufferPtr();
1305 ssize_t sent_size = sendmsg(sim_fd, &msgHdr, flags);
1306 int local_errno = errno;
1311 for (
int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
1321 return (sent_size < 0) ? -local_errno : sent_size;
1326 int tgt_fd,
int level,
int optname,
VPtr<> valPtr,
1334 struct linger linger_val;
1335 struct timeval timeval_val;
1340 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1343 int sim_fd = sfdp->getSimFD();
1345 socklen_t
len =
sizeof(
val);
1372 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1375 int sim_fd = sfdp->getSimFD();
1383 BufferArg lenBuf(lenPtr,
sizeof(socklen_t));
1411 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1414 int sim_fd = sfdp->getSimFD();
1418 BufferArg bufAddrlen(addrlenPtr,
sizeof(
unsigned));
1419 bufAddrlen.
copyIn(proxy);
1422 int retval = getpeername(sim_fd,
1431 return (retval == -1) ? -errno : retval;
1436 int tgt_fd,
int level,
int optname,
VPtr<> valPtr,
1444 auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*
p->fds)[tgt_fd]);
1447 int sim_fd = sfdp->getSimFD();
1474 if (!paramPtr || pid < 0)
1477 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 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()