changeset 5e0a421e2031 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=5e0a421e2031
description:
        syscall_emul: add retry flag to SyscallReturn

        This hook allows blocking emulated system calls to indicate
        that they would block, but return control to the simulator
        so that the simulation does not hang.  The actual retry
        functionality requires additional support, to be provided
        in a future changeset.

diffstat:

 src/sim/syscall_emul.cc  |  11 ++++++++---
 src/sim/syscallreturn.hh |  15 ++++++++++++++-
 2 files changed, 22 insertions(+), 4 deletions(-)

diffs (63 lines):

diff -r 4e715fe2abbd -r 5e0a421e2031 src/sim/syscall_emul.cc
--- a/src/sim/syscall_emul.cc   Wed Oct 22 15:53:34 2014 -0700
+++ b/src/sim/syscall_emul.cc   Tue Sep 02 16:07:50 2014 -0500
@@ -71,10 +71,15 @@
 
     SyscallReturn retval = (*funcPtr)(this, callnum, process, tc);
 
-    DPRINTFR(SyscallVerbose, "%d: %s: syscall %s returns %d\n",
-             curTick(), tc->getCpuPtr()->name(), name, retval.encodedValue());
+    if (retval.needsRetry()) {
+        DPRINTFS(SyscallVerbose, tc->getCpuPtr(), "syscall %s needs retry\n",
+                 name);
+    } else {
+        DPRINTFS(SyscallVerbose, tc->getCpuPtr(), "syscall %s returns %d\n",
+                 name, retval.encodedValue());
+    }
 
-    if (!(flags & SyscallDesc::SuppressReturnValue))
+    if (!(flags & SyscallDesc::SuppressReturnValue) && !retval.needsRetry())
         process->setSyscallReturn(tc, retval);
 }
 
diff -r 4e715fe2abbd -r 5e0a421e2031 src/sim/syscallreturn.hh
--- a/src/sim/syscallreturn.hh  Wed Oct 22 15:53:34 2014 -0700
+++ b/src/sim/syscallreturn.hh  Tue Sep 02 16:07:50 2014 -0500
@@ -64,9 +64,17 @@
     /// value is expected, e.g., as the return value from a system
     /// call emulation function ('return 0;' or 'return -EFAULT;').
     SyscallReturn(int64_t v)
-        : value(v)
+        : value(v), retryFlag(false)
     {}
 
+    /// Pseudo-constructor to create an instance with the retry flag set.
+    static SyscallReturn retry()
+    {
+        SyscallReturn s(0);
+        s.retryFlag = true;
+        return s;
+    }
+
     ~SyscallReturn() {}
 
     /// Was the system call successful?
@@ -75,6 +83,9 @@
         return (value >= 0 || value <= -4096);
     }
 
+    /// Does the syscall need to be retried?
+    bool needsRetry() const { return retryFlag; }
+
     /// The return value
     int64_t returnValue() const
     {
@@ -98,6 +109,8 @@
   private:
 
     int64_t value;
+
+    bool retryFlag;
 };
 
 #endif
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to