summaryrefslogtreecommitdiff
path: root/sim/common/sim-syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'sim/common/sim-syscall.c')
-rw-r--r--sim/common/sim-syscall.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/sim/common/sim-syscall.c b/sim/common/sim-syscall.c
index be3ff8f82e2..f24d761ee8f 100644
--- a/sim/common/sim-syscall.c
+++ b/sim/common/sim-syscall.c
@@ -97,8 +97,20 @@ sim_syscall_multi (SIM_CPU *cpu, int func, long arg1, long arg2, long arg3,
TRACE_SYSCALL (cpu, "%s[%i](%#lx, %#lx, %#lx) = %li",
syscall, func, arg1, arg2, arg3, sc.result);
- if (cb_target_to_host_syscall (cb, func) == CB_SYS_exit)
- sim_engine_halt (sd, cpu, NULL, sim_pc_get (cpu), sim_exited, arg1);
+ /* Handle syscalls that affect engine behavior. */
+ switch (cb_target_to_host_syscall (cb, func))
+ {
+ case CB_SYS_exit:
+ sim_engine_halt (sd, cpu, NULL, sim_pc_get (cpu), sim_exited, arg1);
+ break;
+
+ case CB_SYS_kill:
+ /* TODO: Need to translate target signal to sim signal, but the sim
+ doesn't yet have such a mapping layer. */
+ if (arg1 == (*cb->getpid) (cb))
+ sim_engine_halt (sd, cpu, NULL, sim_pc_get (cpu), sim_signalled, arg2);
+ break;
+ }
*result = sc.result;
*result2 = sc.result2;