summaryrefslogtreecommitdiff
path: root/src/sim/syscall_emul.cc
diff options
context:
space:
mode:
authorJavier Setoain <javier.setoain@arm.com>2019-01-09 14:24:31 +0000
committerAndreas Sandberg <andreas.sandberg@arm.com>2019-01-10 17:56:24 +0000
commitf3a438e58d836ec283af6eef8bb34b57958303d6 (patch)
tree77518cc8c11deeed861448a8785f3f25d0796157 /src/sim/syscall_emul.cc
parentb25900fd3ce31e95187d3a9520939a2faa1bb5c7 (diff)
downloadgem5-f3a438e58d836ec283af6eef8bb34b57958303d6.tar.xz
sim-se, arch-arm: Add support for getdents64
Change-Id: Ib27950144d4c9802ffb842db98aec9e433ccbfc5 Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Cc: Giacomo Travaglini <giacomo.travaglini@arm.com> Cc: Javier Setoain <javier.setoain@arm.com> Cc: Brandon Potter <Brandon.Potter@amd.com> Reviewed-on: https://gem5-review.googlesource.com/c/15438 Maintainer: Brandon Potter <Brandon.Potter@amd.com> Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/sim/syscall_emul.cc')
-rw-r--r--src/sim/syscall_emul.cc48
1 files changed, 36 insertions, 12 deletions
diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc
index 3d17b5d75..e79e79c62 100644
--- a/src/sim/syscall_emul.cc
+++ b/src/sim/syscall_emul.cc
@@ -1151,9 +1151,10 @@ rmdirFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc)
return (result == -1) ? -errno : result;
}
-#if defined(SYS_getdents)
-SyscallReturn
-getdentsFunc(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc)
+#if defined(SYS_getdents) || defined(SYS_getdents64)
+template<typename DE, int SYS_NUM>
+static SyscallReturn
+getdentsImpl(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc)
{
int index = 0;
int tgt_fd = p->getSyscallArg(tc, index);
@@ -1166,21 +1167,14 @@ getdentsFunc(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc)
int sim_fd = hbfdp->getSimFD();
BufferArg buf_arg(buf_ptr, count);
- auto status = syscall(SYS_getdents, sim_fd, buf_arg.bufferPtr(), count);
+ auto status = syscall(SYS_NUM, sim_fd, buf_arg.bufferPtr(), count);
if (status == -1)
return -errno;
- typedef struct linux_dirent {
- unsigned long d_ino;
- unsigned long d_off;
- unsigned short d_reclen;
- char dname[];
- } LinDent;
-
unsigned traversed = 0;
while (traversed < status) {
- LinDent *buffer = (LinDent*)((Addr)buf_arg.bufferPtr() + traversed);
+ DE *buffer = (DE*)((Addr)buf_arg.bufferPtr() + traversed);
auto host_reclen = buffer->d_reclen;
@@ -1200,3 +1194,33 @@ getdentsFunc(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc)
return status;
}
#endif
+
+#if defined(SYS_getdents)
+SyscallReturn
+getdentsFunc(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc)
+{
+ typedef struct linux_dirent {
+ unsigned long d_ino;
+ unsigned long d_off;
+ unsigned short d_reclen;
+ char dname[];
+ } LinDent;
+
+ return getdentsImpl<LinDent, SYS_getdents>(desc, callnum, p, tc);
+}
+#endif
+
+#if defined(SYS_getdents64)
+SyscallReturn
+getdents64Func(SyscallDesc *desc, int callnum, Process *p, ThreadContext *tc)
+{
+ typedef struct linux_dirent64 {
+ ino64_t d_ino;
+ off64_t d_off;
+ unsigned short d_reclen;
+ char dname[];
+ } LinDent64;
+
+ return getdentsImpl<LinDent64, SYS_getdents64>(desc, callnum, p, tc);
+}
+#endif