From e72736aaf0508dd545ae9949c31ed91ba41d761b Mon Sep 17 00:00:00 2001 From: "Severin Wischmann ext:(%2C%20Ioannis%20Ilkos%20%3Cioannis.ilkos09%40imperial.ac.uk%3E)" Date: Mon, 20 Oct 2014 16:43:48 -0500 Subject: x86: syscall: implementation of exit_group On exit_group syscall, we used to exit the simulator. But now we will only halt the execution of threads that belong to the group. Committed by: Nilay Vaish --- src/sim/syscall_emul.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/sim/syscall_emul.cc') diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc index 13ea784e5..d8df891dd 100644 --- a/src/sim/syscall_emul.cc +++ b/src/sim/syscall_emul.cc @@ -135,11 +135,17 @@ SyscallReturn exitGroupFunc(SyscallDesc *desc, int callnum, LiveProcess *process, ThreadContext *tc) { - // really should just halt all thread contexts belonging to this - // process in case there's another process running... - int index = 0; - exitSimLoop("target called exit()", - process->getSyscallArg(tc, index) & 0xff); + // halt all threads belonging to this process + for (auto i: process->contextIds) { + process->system->getThreadContext(i)->halt(); + } + + if (!process->system->numRunningContexts()) { + // all threads belonged to this process... exit simulator + int index = 0; + exitSimLoop("target called exit()", + process->getSyscallArg(tc, index) & 0xff); + } return 1; } -- cgit v1.2.3