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

Reply via email to