# HG changeset patch # Parent 5ab4fbb86527e49358ff827b3a9f581349d79faa syscall_emu: Added getdents and getdents64 syscalls. diff -r 5ab4fbb86527 -r 7ff9fdfdb108 src/arch/x86/linux/process.cc --- a/src/arch/x86/linux/process.cc Tue Jul 12 17:14:13 2016 +0200 +++ b/src/arch/x86/linux/process.cc Tue Jul 12 17:16:30 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("getdents64", getdents64Func), /* 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 5ab4fbb86527 -r 7ff9fdfdb108 src/sim/syscall_emul.hh --- a/src/sim/syscall_emul.hh Tue Jul 12 17:14:13 2016 +0200 +++ b/src/sim/syscall_emul.hh Tue Jul 12 17:16:30 2016 +0200 @@ -303,6 +303,14 @@ 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 5ab4fbb86527 -r 7ff9fdfdb108 src/sim/syscall_emul.cc --- a/src/sim/syscall_emul.cc Tue Jul 12 17:14:13 2016 +0200 +++ b/src/sim/syscall_emul.cc Tue Jul 12 17:16:30 2016 +0200 @@ -350,6 +350,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;