summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrandon Potter <brandon.potter@amd.com>2018-04-18 15:02:34 -0400
committerAnthony Gutierrez <anthony.gutierrez@amd.com>2019-01-22 02:14:47 +0000
commite9d957592a2467be72ca1eb6c885e8b80b374f0b (patch)
treeb5a2e6ece2e65145238323f93785267e08867370
parent7936e63336a736ca7d857e4fb7578895b249382e (diff)
downloadgem5-e9d957592a2467be72ca1eb6c885e8b80b374f0b.tar.xz
sim-se add readv and modifies writev
Change-Id: I6cbce4389d5697da34058dc910306394e48c6582 Reviewed-on: https://gem5-review.googlesource.com/c/12117 Reviewed-by: Anthony Gutierrez <anthony.gutierrez@amd.com> Maintainer: Anthony Gutierrez <anthony.gutierrez@amd.com>
-rw-r--r--src/arch/x86/linux/process.cc4
-rw-r--r--src/sim/syscall_emul.hh43
2 files changed, 41 insertions, 6 deletions
diff --git a/src/arch/x86/linux/process.cc b/src/arch/x86/linux/process.cc
index 2fe99e0be..6a9aea85b 100644
--- a/src/arch/x86/linux/process.cc
+++ b/src/arch/x86/linux/process.cc
@@ -241,7 +241,7 @@ static SyscallDesc syscallDescs64[] = {
/* 16 */ SyscallDesc("ioctl", ioctlFunc<X86Linux64>),
/* 17 */ SyscallDesc("pread64", unimplementedFunc),
/* 18 */ SyscallDesc("pwrite64", pwrite64Func<X86Linux64>),
- /* 19 */ SyscallDesc("readv", unimplementedFunc),
+ /* 19 */ SyscallDesc("readv", readvFunc<X86Linux64>),
/* 20 */ SyscallDesc("writev", writevFunc<X86Linux64>),
/* 21 */ SyscallDesc("access", ignoreFunc),
/* 22 */ SyscallDesc("pipe", pipeFunc),
@@ -704,7 +704,7 @@ static SyscallDesc syscallDescs32[] = {
/* 142 */ SyscallDesc("_newselect", unimplementedFunc),
/* 143 */ SyscallDesc("flock", unimplementedFunc),
/* 144 */ SyscallDesc("msync", unimplementedFunc),
- /* 145 */ SyscallDesc("readv", unimplementedFunc),
+ /* 145 */ SyscallDesc("readv", readvFunc<X86Linux32>),
/* 146 */ SyscallDesc("writev", writevFunc<X86Linux32>),
/* 147 */ SyscallDesc("getsid", unimplementedFunc),
/* 148 */ SyscallDesc("fdatasync", unimplementedFunc),
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 <class OS>
+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<FileFDEntry>((*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 <class OS>
@@ -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.