diff options
author | Brandon Potter <brandon.potter@amd.com> | 2018-04-18 14:48:19 -0400 |
---|---|---|
committer | Anthony Gutierrez <anthony.gutierrez@amd.com> | 2019-01-22 01:56:17 +0000 |
commit | a2ed7d5575fb7e847314bb87b92c73459149f2d0 (patch) | |
tree | b632738c83cf8fb429d54706bb5c16e5c45c9643 /src/sim/syscall_emul.cc | |
parent | 2c9f7ebca51eaf8fafd1f854ec0475cb18e9e20c (diff) | |
download | gem5-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.cc')
-rw-r--r-- | src/sim/syscall_emul.cc | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc index e79e79c62..3b35d34e9 100644 --- a/src/sim/syscall_emul.cc +++ b/src/sim/syscall_emul.cc @@ -1224,3 +1224,83 @@ getdents64Func(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc) return getdentsImpl<LinDent64, SYS_getdents64>(desc, callnum, p, tc); } #endif + +SyscallReturn +shutdownFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc) +{ + int index = 0; + int tgt_fd = p->getSyscallArg(tc, index); + int how = p->getSyscallArg(tc, index); + + auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]); + if (!sfdp) + return -EBADF; + int sim_fd = sfdp->getSimFD(); + + int retval = shutdown(sim_fd, how); + + return (retval == -1) ? -errno : retval; +} + +SyscallReturn +bindFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc) +{ + int index = 0; + int tgt_fd = p->getSyscallArg(tc, index); + Addr buf_ptr = p->getSyscallArg(tc, index); + int addrlen = p->getSyscallArg(tc, index); + + BufferArg bufSock(buf_ptr, addrlen); + bufSock.copyIn(tc->getMemProxy()); + + auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]); + if (!sfdp) + return -EBADF; + int sim_fd = sfdp->getSimFD(); + + int status = ::bind(sim_fd, + (struct sockaddr *)bufSock.bufferPtr(), + addrlen); + + return (status == -1) ? -errno : status; +} + +SyscallReturn +listenFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc) +{ + int index = 0; + int tgt_fd = p->getSyscallArg(tc, index); + int backlog = p->getSyscallArg(tc, index); + + auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]); + if (!sfdp) + return -EBADF; + int sim_fd = sfdp->getSimFD(); + + int status = listen(sim_fd, backlog); + + return (status == -1) ? -errno : status; +} + +SyscallReturn +connectFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc) +{ + int index = 0; + int tgt_fd = p->getSyscallArg(tc, index); + Addr buf_ptr = p->getSyscallArg(tc, index); + int addrlen = p->getSyscallArg(tc, index); + + BufferArg addr(buf_ptr, addrlen); + addr.copyIn(tc->getMemProxy()); + + auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]); + if (!sfdp) + return -EBADF; + int sim_fd = sfdp->getSimFD(); + + int status = connect(sim_fd, + (struct sockaddr *)addr.bufferPtr(), + (socklen_t)addrlen); + + return (status == -1) ? -errno : status; +} |