changeset 8e928c0f98d1 in /z/repo/gem5 details: http://repo.gem5.org/gem5?cmd=changeset;node=8e928c0f98d1 description: syscall_emul: [patch 11/22] extend functionality of fcntl
This changeset adds the ability to set a close-on-exec flag for a given file descriptor. It also reworks some of the logic surrounding setting and retrieving flags from the file description. diffstat: src/arch/x86/linux/process.cc | 2 +- src/sim/syscall_emul.cc | 47 +++++++++++++++++++++--------------------- src/sim/syscall_emul.hh | 2 +- 3 files changed, 25 insertions(+), 26 deletions(-) diffs (98 lines): diff -r 663bac0bb1c9 -r 8e928c0f98d1 src/arch/x86/linux/process.cc --- a/src/arch/x86/linux/process.cc Thu Feb 23 13:27:48 2017 -0500 +++ b/src/arch/x86/linux/process.cc Mon Jul 20 09:15:21 2015 -0500 @@ -598,7 +598,7 @@ /* 52 */ SyscallDesc("umount2", unimplementedFunc), /* 53 */ SyscallDesc("lock", unimplementedFunc), /* 54 */ SyscallDesc("ioctl", ioctlFunc<X86Linux32>), - /* 55 */ SyscallDesc("fcntl", unimplementedFunc), + /* 55 */ SyscallDesc("fcntl", fcntlFunc), /* 56 */ SyscallDesc("mpx", unimplementedFunc), /* 57 */ SyscallDesc("setpgid", unimplementedFunc), /* 58 */ SyscallDesc("ulimit", unimplementedFunc), diff -r 663bac0bb1c9 -r 8e928c0f98d1 src/sim/syscall_emul.cc --- a/src/sim/syscall_emul.cc Thu Feb 23 13:27:48 2017 -0500 +++ b/src/sim/syscall_emul.cc Mon Jul 20 09:15:21 2015 -0500 @@ -620,47 +620,46 @@ return (result == -1) ? -local_errno : p->fds->allocFD(new_fdep); } - SyscallReturn fcntlFunc(SyscallDesc *desc, int num, Process *p, ThreadContext *tc) { + int arg; int index = 0; int tgt_fd = p->getSyscallArg(tc, index); + int cmd = p->getSyscallArg(tc, index); auto hbfdp = std::dynamic_pointer_cast<HBFDEntry>((*p->fds)[tgt_fd]); if (!hbfdp) return -EBADF; int sim_fd = hbfdp->getSimFD(); - int cmd = p->getSyscallArg(tc, index); + int coe = hbfdp->getCOE(); + switch (cmd) { - case 0: // F_DUPFD - // if we really wanted to support this, we'd need to do it - // in the target fd space. - warn("fcntl(%d, F_DUPFD) not supported, error returned\n", tgt_fd); - return -EMFILE; + case F_GETFD: + return coe & FD_CLOEXEC; - case 1: // F_GETFD (get close-on-exec flag) - case 2: // F_SETFD (set close-on-exec flag) + case F_SETFD: { + arg = p->getSyscallArg(tc, index); + arg ? hbfdp->setCOE(true) : hbfdp->setCOE(false); return 0; + } - case 3: // F_GETFL (get file flags) - case 4: // F_SETFL (set file flags) - // not sure if this is totally valid, but we'll pass it through - // to the underlying OS - warn("fcntl(%d, %d) passed through to host\n", tgt_fd, cmd); - return fcntl(sim_fd, cmd); - // return 0; - - case 7: // F_GETLK (get lock) - case 8: // F_SETLK (set lock) - case 9: // F_SETLKW (set lock and wait) - // don't mess with file locking... just act like it's OK - warn("File lock call (fcntl(%d, %d)) ignored.\n", tgt_fd, cmd); - return 0; + // Rely on the host to maintain the file status flags for this file + // description rather than maintain it ourselves. Admittedly, this + // is suboptimal (and possibly error prone), but it is difficult to + // maintain the flags by tracking them across the different descriptors + // (that refer to this file description) caused by clone, dup, and + // subsequent fcntls. + case F_GETFL: + case F_SETFL: { + arg = p->getSyscallArg(tc, index); + int rv = fcntl(sim_fd, cmd, arg); + return (rv == -1) ? -errno : rv; + } default: - warn("Unknown fcntl command %d\n", cmd); + warn("fcntl: unsupported command %d\n", cmd); return 0; } } diff -r 663bac0bb1c9 -r 8e928c0f98d1 src/sim/syscall_emul.hh --- a/src/sim/syscall_emul.hh Thu Feb 23 13:27:48 2017 -0500 +++ b/src/sim/syscall_emul.hh Mon Jul 20 09:15:21 2015 -0500 @@ -230,7 +230,7 @@ SyscallReturn dupFunc(SyscallDesc *desc, int num, Process *process, ThreadContext *tc); -/// Target fnctl() handler. +/// Target fcntl() handler. SyscallReturn fcntlFunc(SyscallDesc *desc, int num, Process *process, ThreadContext *tc); _______________________________________________ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev