summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sim/syscall_emul.cc11
-rw-r--r--src/sim/syscallreturn.hh15
2 files changed, 22 insertions, 4 deletions
diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc
index d8df891dd..cb592e338 100644
--- a/src/sim/syscall_emul.cc
+++ b/src/sim/syscall_emul.cc
@@ -71,10 +71,15 @@ SyscallDesc::doSyscall(int callnum, LiveProcess *process, ThreadContext *tc)
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 --git a/src/sim/syscallreturn.hh b/src/sim/syscallreturn.hh
index 547d76610..fdd740775 100644
--- a/src/sim/syscallreturn.hh
+++ b/src/sim/syscallreturn.hh
@@ -64,9 +64,17 @@ class SyscallReturn
/// 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 @@ class SyscallReturn
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 @@ class SyscallReturn
private:
int64_t value;
+
+ bool retryFlag;
};
#endif