From a3fe4c06620439aa317f257d3bcdde34508d3d43 Mon Sep 17 00:00:00 2001 From: Michael Adler Date: Mon, 20 Oct 2014 16:44:53 -0500 Subject: sim: implement getdents/getdents64 in user mode Has been tested only for alpha. Committed by: Nilay Vaish --- src/sim/syscall_emul.cc | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/sim/syscall_emul.cc') diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc index d8df891dd..7eeacd319 100644 --- a/src/sim/syscall_emul.cc +++ b/src/sim/syscall_emul.cc @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -867,6 +868,41 @@ cloneFunc(SyscallDesc *desc, int callnum, LiveProcess *process, } } +SyscallReturn +getdentsFunc(SyscallDesc *desc, int num, LiveProcess *p, + ThreadContext *tc) +{ + int index = 0; + int fd = p->sim_fd(p->getSyscallArg(tc, index)); + Addr bufPtr = p->getSyscallArg(tc, index); + int nbytes = p->getSyscallArg(tc, index); + BufferArg bufArg(bufPtr, nbytes); + + int bytes_read = syscall(SYS_getdents, fd, bufArg.bufferPtr(), nbytes); + + if (bytes_read != -1) + bufArg.copyOut(tc->getMemProxy()); + + return bytes_read; +} + +SyscallReturn +getdents64Func(SyscallDesc *desc, int num, LiveProcess *p, + ThreadContext *tc) +{ + int index = 0; + int fd = p->sim_fd(p->getSyscallArg(tc, index)); + Addr bufPtr = p->getSyscallArg(tc, index); + int nbytes = p->getSyscallArg(tc, index); + BufferArg bufArg(bufPtr, nbytes); + + int bytes_read = syscall(SYS_getdents64, fd, bufArg.bufferPtr(), nbytes); + + if (bytes_read != -1) + bufArg.copyOut(tc->getMemProxy()); + + return bytes_read; +} SyscallReturn accessFunc(SyscallDesc *desc, int callnum, LiveProcess *p, ThreadContext *tc, int index) -- cgit v1.2.3