sim: syscall: handle killing the sim itself
authorMike Frysinger <vapier@gentoo.org>
Mon, 21 Jun 2021 03:50:35 +0000 (23:50 -0400)
committerMike Frysinger <vapier@gentoo.org>
Thu, 24 Jun 2021 00:11:45 +0000 (20:11 -0400)
If code tries to send a signal to itself, the callback layer ignores
it and forces the caller to handle it.  This allows the sim to turn
that into an engine halt rather than actually killing the sim.

sim/common/ChangeLog
sim/common/sim-syscall.c

index c32e7475a80c64f4bfedbbbd26cd449b8b4d2eb4..18d37bd17c650b65459d401132dacf6f0e31c319 100644 (file)
@@ -1,3 +1,7 @@
+2021-06-23  Mike Frysinger  <vapier@gentoo.org>
+
+       * sim-syscall.c (sim_syscall_multi): Handle CB_SYS_kill.
+
 2021-06-23  Mike Frysinger  <vapier@gentoo.org>
 
        * callback.c (os_kill): New function.
index be3ff8f82e2c7de3eb955e4ab1981d09f07aeb68..f24d761ee8fec2e36b7086464b9410228cdd3010 100644 (file)
@@ -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;