Andreas Sandberg has submitted this change and it was merged. (
https://gem5-review.googlesource.com/c/public/gem5/+/15438 )
Change subject: sim-se, arch-arm: Add support for getdents64
......................................................................
sim-se, arch-arm: Add support for getdents64
Change-Id: Ib27950144d4c9802ffb842db98aec9e433ccbfc5
Signed-off-by: Andreas Sandberg <[email protected]>
Cc: Giacomo Travaglini <[email protected]>
Cc: Javier Setoain <[email protected]>
Cc: Brandon Potter <[email protected]>
Reviewed-on: https://gem5-review.googlesource.com/c/15438
Maintainer: Brandon Potter <[email protected]>
Reviewed-by: Jason Lowe-Power <[email protected]>
---
M src/arch/arm/linux/process.cc
M src/sim/syscall_emul.cc
M src/sim/syscall_emul.hh
3 files changed, 52 insertions(+), 12 deletions(-)
Approvals:
Jason Lowe-Power: Looks good to me, approved
Andreas Sandberg: Looks good to me, approved
Brandon Potter: Looks good to me, approved
diff --git a/src/arch/arm/linux/process.cc b/src/arch/arm/linux/process.cc
index cb62e6e..61caa45 100644
--- a/src/arch/arm/linux/process.cc
+++ b/src/arch/arm/linux/process.cc
@@ -46,6 +46,8 @@
#include "arch/arm/linux/process.hh"
+#include <sys/syscall.h>
+
#include "arch/arm/isa_traits.hh"
#include "arch/arm/linux/linux.hh"
#include "base/trace.hh"
@@ -342,7 +344,11 @@
/* 214 */ SyscallDesc("setgid", unimplementedFunc),
/* 215 */ SyscallDesc("setfsuid", unimplementedFunc),
/* 216 */ SyscallDesc("setfsgid", unimplementedFunc),
+#if defined(SYS_getdents64)
+ /* 217 */ SyscallDesc("getdents64", getdents64Func),
+#else
/* 217 */ SyscallDesc("getdents64", unimplementedFunc),
+#endif
/* 218 */ SyscallDesc("pivot_root", unimplementedFunc),
/* 219 */ SyscallDesc("mincore", unimplementedFunc),
/* 220 */ SyscallDesc("madvise", ignoreFunc),
@@ -555,7 +561,11 @@
/* 58 */ SyscallDesc("vhangup", unimplementedFunc),
/* 59 */ SyscallDesc("pipe2", unimplementedFunc),
/* 60 */ SyscallDesc("quotactl", unimplementedFunc),
+#if defined(SYS_getdents64)
+ /* 61 */ SyscallDesc("getdents64", getdents64Func),
+#else
/* 61 */ SyscallDesc("getdents64", unimplementedFunc),
+#endif
/* 62 */ SyscallDesc("llseek", lseekFunc),
/* 63 */ SyscallDesc("read", readFunc),
/* 64 */ SyscallDesc("write", writeFunc),
diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc
index 3d17b5d..e79e79c 100644
--- a/src/sim/syscall_emul.cc
+++ b/src/sim/syscall_emul.cc
@@ -1151,9 +1151,10 @@
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 @@
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 @@
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
diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh
index 343fb27..91e115d 100644
--- a/src/sim/syscall_emul.hh
+++ b/src/sim/syscall_emul.hh
@@ -309,6 +309,12 @@
Process *p, ThreadContext *tc);
#endif
+#if defined(SYS_getdents64)
+// Target getdents() handler.
+SyscallReturn getdents64Func(SyscallDesc *desc, int num,
+ Process *p, ThreadContext *tc);
+#endif
+
// Target getuid() handler.
SyscallReturn getuidFunc(SyscallDesc *desc, int num,
Process *p, ThreadContext *tc);
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/15438
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: Ib27950144d4c9802ffb842db98aec9e433ccbfc5
Gerrit-Change-Number: 15438
Gerrit-PatchSet: 4
Gerrit-Owner: Andreas Sandberg <[email protected]>
Gerrit-Reviewer: Andreas Sandberg <[email protected]>
Gerrit-Reviewer: Brandon Potter <[email protected]>
Gerrit-Reviewer: Jason Lowe-Power <[email protected]>
Gerrit-CC: Giacomo Travaglini <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev