[3/3] sim: syscall: handle killing the sim itself

Message ID 20210622234154.28963-3-vapier@gentoo.org
State New
Headers show
Series
  • [1/3] sim: callback: add a kill interface
Related show

Commit Message

Rustam Kovhaev via Gdb-patches June 22, 2021, 11:41 p.m.
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/sim-syscall.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

-- 
2.31.1

Patch

diff --git a/sim/common/sim-syscall.c b/sim/common/sim-syscall.c
index be3ff8f82e2c..1bc646703f4a 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 syscall to sim syscall, 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;