# HG changeset patch # Parent ba45735a726a4582e63561ab3dc741d7f0890447 diff -r ba45735a726a -r 896913445051 src/arch/x86/linux/process.cc --- a/src/arch/x86/linux/process.cc Thu Aug 04 12:32:21 2016 -0400 +++ b/src/arch/x86/linux/process.cc Sun Aug 07 18:30:18 2016 +0200 @@ -296,7 +296,7 @@ /* 75 */ SyscallDesc("fdatasync", unimplementedFunc), /* 76 */ SyscallDesc("truncate", truncateFunc), /* 77 */ SyscallDesc("ftruncate", ftruncateFunc), - /* 78 */ SyscallDesc("getdents", unimplementedFunc), + /* 78 */ SyscallDesc("getdents", getdentsFunc), /* 79 */ SyscallDesc("getcwd", getcwdFunc), /* 80 */ SyscallDesc("chdir", unimplementedFunc), /* 81 */ SyscallDesc("fchdir", unimplementedFunc), @@ -435,7 +435,7 @@ /* 214 */ SyscallDesc("epoll_ctl_old", unimplementedFunc), /* 215 */ SyscallDesc("epoll_wait_old", unimplementedFunc), /* 216 */ SyscallDesc("remap_file_pages", unimplementedFunc), - /* 217 */ SyscallDesc("getdents64", unimplementedFunc), + /* 217 */ SyscallDesc("getdents", getdentsFunc), /* 218 */ SyscallDesc("set_tid_address", unimplementedFunc), /* 219 */ SyscallDesc("restart_syscall", unimplementedFunc), /* 220 */ SyscallDesc("semtimedop", unimplementedFunc), @@ -682,7 +682,7 @@ /* 138 */ SyscallDesc("setfsuid", unimplementedFunc), /* 139 */ SyscallDesc("setfsgid", unimplementedFunc), /* 140 */ SyscallDesc("_llseek", _llseekFunc), - /* 141 */ SyscallDesc("getdents", unimplementedFunc), + /* 141 */ SyscallDesc("getdents", getdentsFunc), /* 142 */ SyscallDesc("_newselect", unimplementedFunc), /* 143 */ SyscallDesc("flock", unimplementedFunc), /* 144 */ SyscallDesc("msync", unimplementedFunc), @@ -762,7 +762,7 @@ /* 218 */ SyscallDesc("mincore", unimplementedFunc), /* 219 */ SyscallDesc("madvise", unimplementedFunc), /* 220 */ SyscallDesc("madvise1", unimplementedFunc), - /* 221 */ SyscallDesc("getdents64", unimplementedFunc), + /* 221 */ SyscallDesc("getdents64", getdents64Func), /* 222 */ SyscallDesc("fcntl64", unimplementedFunc), /* 223 */ SyscallDesc("unused", unimplementedFunc), /* 224 */ SyscallDesc("gettid", unimplementedFunc), diff -r ba45735a726a -r 896913445051 src/sim/syscall_emul.hh --- a/src/sim/syscall_emul.hh Thu Aug 04 12:32:21 2016 -0400 +++ b/src/sim/syscall_emul.hh Sun Aug 07 18:30:18 2016 +0200 @@ -302,7 +302,15 @@ /// Target clone() handler. SyscallReturn cloneFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc); + + /// Target getdents() handler. + SyscallReturn getdentsFunc(SyscallDesc *desc, int num, + LiveProcess *p, ThreadContext *tc); + /// Target getdents64() handler. + SyscallReturn getdents64Func(SyscallDesc *desc, int num, + LiveProcess *p, ThreadContext *tc); + /// Target access() handler SyscallReturn accessFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc); diff -r ba45735a726a -r 896913445051 src/sim/syscall_emul.cc --- a/src/sim/syscall_emul.cc Thu Aug 04 12:32:21 2016 -0400 +++ b/src/sim/syscall_emul.cc Sun Aug 07 18:30:18 2016 +0200 @@ -349,6 +349,41 @@ } SyscallReturn +getdentsFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) +{ + int index = 0; + int fd = p->sim_fd(p->getSyscallArg(tc, index)); + assert(fd >= 0); + Addr bufPtr = p->getSyscallArg(tc, index); + int nbytes = p->getSyscallArg(tc, index); + BufferArg bufArg(bufPtr, nbytes); + + int nread = syscall(SYS_getdents, fd, bufArg.bufferPtr(), nbytes); + + if(nread > 0) + bufArg.copyOut(tc->getMemProxy()); + + return (nread == -1) ? -errno : nread; +} + +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 nread = syscall(SYS_getdents64, fd, bufArg.bufferPtr(), nbytes); + + if(nread > 0) + bufArg.copyOut(tc->getMemProxy()); + + return (nread == -1) ? -errno : nread; +} + +SyscallReturn getcwdFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) { int result = 0;