From e9d957592a2467be72ca1eb6c885e8b80b374f0b Mon Sep 17 00:00:00 2001 From: Brandon Potter Date: Wed, 18 Apr 2018 15:02:34 -0400 Subject: sim-se add readv and modifies writev Change-Id: I6cbce4389d5697da34058dc910306394e48c6582 Reviewed-on: https://gem5-review.googlesource.com/c/12117 Reviewed-by: Anthony Gutierrez Maintainer: Anthony Gutierrez --- src/sim/syscall_emul.hh | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) (limited to 'src/sim/syscall_emul.hh') diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index c52589f3a..ceeacd39b 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -1531,6 +1531,44 @@ fstatfsFunc(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc) return 0; } +/// Target readv() handler. +template +SyscallReturn +readvFunc(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc) +{ + int index = 0; + int tgt_fd = p->getSyscallArg(tc, index); + + auto ffdp = std::dynamic_pointer_cast((*p->fds)[tgt_fd]); + if (!ffdp) + return -EBADF; + int sim_fd = ffdp->getSimFD(); + + SETranslatingPortProxy &prox = tc->getMemProxy(); + uint64_t tiov_base = p->getSyscallArg(tc, index); + size_t count = p->getSyscallArg(tc, index); + typename OS::tgt_iovec tiov[count]; + struct iovec hiov[count]; + for (size_t i = 0; i < count; ++i) { + prox.readBlob(tiov_base + (i * sizeof(typename OS::tgt_iovec)), + (uint8_t*)&tiov[i], sizeof(typename OS::tgt_iovec)); + hiov[i].iov_len = TheISA::gtoh(tiov[i].iov_len); + hiov[i].iov_base = new char [hiov[i].iov_len]; + } + + int result = readv(sim_fd, hiov, count); + int local_errno = errno; + + for (size_t i = 0; i < count; ++i) { + if (result != -1) { + prox.writeBlob(TheISA::htog(tiov[i].iov_base), + (uint8_t*)hiov[i].iov_base, hiov[i].iov_len); + } + delete [] (char *)hiov[i].iov_base; + } + + return (result == -1) ? -local_errno : result; +} /// Target writev() handler. template @@ -1565,10 +1603,7 @@ writevFunc(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc) for (size_t i = 0; i < count; ++i) delete [] (char *)hiov[i].iov_base; - if (result < 0) - return -errno; - - return result; + return (result == -1) ? -errno : result; } /// Real mmap handler. -- cgit v1.2.3