summaryrefslogtreecommitdiff
path: root/src/sim/syscall_emul.hh
diff options
context:
space:
mode:
authorBrandon Potter <brandon.potter@amd.com>2018-04-18 14:48:19 -0400
committerAnthony Gutierrez <anthony.gutierrez@amd.com>2019-01-22 01:56:17 +0000
commita2ed7d5575fb7e847314bb87b92c73459149f2d0 (patch)
treeb632738c83cf8fb429d54706bb5c16e5c45c9643 /src/sim/syscall_emul.hh
parent2c9f7ebca51eaf8fafd1f854ec0475cb18e9e20c (diff)
downloadgem5-a2ed7d5575fb7e847314bb87b92c73459149f2d0.tar.xz
sim-se: add socket-based functionality
Add socket, socketpair, bind, list, connect and shutdown system calls. Change-Id: I635af3fca410f96fe28f8fe497e3d457a9dbc470 Reviewed-on: https://gem5-review.googlesource.com/c/12113 Reviewed-by: Anthony Gutierrez <anthony.gutierrez@amd.com> Maintainer: Anthony Gutierrez <anthony.gutierrez@amd.com>
Diffstat (limited to 'src/sim/syscall_emul.hh')
-rw-r--r--src/sim/syscall_emul.hh61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh
index 3f06869aa..9329f7a5b 100644
--- a/src/sim/syscall_emul.hh
+++ b/src/sim/syscall_emul.hh
@@ -79,6 +79,7 @@
#endif
#include <fcntl.h>
#include <sys/mman.h>
+#include <sys/socket.h>
#include <sys/stat.h>
#if (NO_STATFS == 0)
#include <sys/statfs.h>
@@ -181,6 +182,10 @@ SyscallReturn _llseekFunc(SyscallDesc *desc, int num,
SyscallReturn munmapFunc(SyscallDesc *desc, int num,
Process *p, ThreadContext *tc);
+/// Target shutdown() handler.
+SyscallReturn shutdownFunc(SyscallDesc *desc, int num,
+ Process *p, ThreadContext *tc);
+
/// Target gethostname() handler.
SyscallReturn gethostnameFunc(SyscallDesc *desc, int num,
Process *p, ThreadContext *tc);
@@ -303,6 +308,18 @@ SyscallReturn pipeImpl(SyscallDesc *desc, int num, Process *p,
SyscallReturn getpidFunc(SyscallDesc *desc, int num,
Process *p, ThreadContext *tc);
+// Target bind() handler.
+SyscallReturn bindFunc(SyscallDesc *desc, int num,
+ Process *p, ThreadContext *tc);
+
+// Target listen() handler.
+SyscallReturn listenFunc(SyscallDesc *desc, int num,
+ Process *p, ThreadContext *tc);
+
+// Target connect() handler.
+SyscallReturn connectFunc(SyscallDesc *desc, int num,
+ Process *p, ThreadContext *tc);
+
#if defined(SYS_getdents)
// Target getdents() handler.
SyscallReturn getdentsFunc(SyscallDesc *desc, int num,
@@ -2080,5 +2097,49 @@ tgkillFunc(SyscallDesc *desc, int num, Process *process, ThreadContext *tc)
return 0;
}
+template <class OS>
+SyscallReturn
+socketFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc)
+{
+ int index = 0;
+ int domain = p->getSyscallArg(tc, index);
+ int type = p->getSyscallArg(tc, index);
+ int prot = p->getSyscallArg(tc, index);
+
+ int sim_fd = socket(domain, type, prot);
+ if (sim_fd == -1)
+ return -errno;
+
+ auto sfdp = std::make_shared<SocketFDEntry>(sim_fd, domain, type, prot);
+ int tgt_fd = p->fds->allocFD(sfdp);
+
+ return tgt_fd;
+}
+
+template <class OS>
+SyscallReturn
+socketpairFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc)
+{
+ int index = 0;
+ int domain = p->getSyscallArg(tc, index);
+ int type = p->getSyscallArg(tc, index);
+ int prot = p->getSyscallArg(tc, index);
+ Addr svPtr = p->getSyscallArg(tc, index);
+
+ BufferArg svBuf((Addr)svPtr, 2 * sizeof(int));
+ int status = socketpair(domain, type, prot, (int *)svBuf.bufferPtr());
+ if (status == -1)
+ return -errno;
+
+ int *fds = (int *)svBuf.bufferPtr();
+
+ auto sfdp1 = std::make_shared<SocketFDEntry>(fds[0], domain, type, prot);
+ fds[0] = p->fds->allocFD(sfdp1);
+ auto sfdp2 = std::make_shared<SocketFDEntry>(fds[1], domain, type, prot);
+ fds[1] = p->fds->allocFD(sfdp2);
+ svBuf.copyOut(tc->getMemProxy());
+
+ return status;
+}
#endif // __SIM_SYSCALL_EMUL_HH__