summaryrefslogtreecommitdiff
path: root/src/sim/syscall_emul.cc
diff options
context:
space:
mode:
authorSteve Reinhardt <steve.reinhardt@amd.com>2014-09-02 16:07:50 -0500
committerSteve Reinhardt <steve.reinhardt@amd.com>2014-09-02 16:07:50 -0500
commit6ab4eddb9f5fbd30db0dccbef4a60c46b7053de3 (patch)
tree475fdf0cb41ce8b1ec463509fa6527e6c4046932 /src/sim/syscall_emul.cc
parent9ac7f14fc021075af458404096e76225b1ea59df (diff)
downloadgem5-6ab4eddb9f5fbd30db0dccbef4a60c46b7053de3.tar.xz
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 (limited to 'src/sim/syscall_emul.cc')
-rw-r--r--src/sim/syscall_emul.cc11
1 files changed, 8 insertions, 3 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);
}