[1/3] sim: callback: add a kill interface

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

Commit Message

Eli Zaretskii via Gdb-patches June 22, 2021, 11:41 p.m.
This will make it easier to emulate the syscall.  If the kill target
is the sim itself, don't do anything.  This forces the higher layers
to make a decision as to how to handle this event: like halting the
overall engine process.
---
 include/sim/callback.h |  1 +
 sim/common/callback.c  | 11 +++++++++++
 sim/common/syscall.c   | 18 ++++++++++++++++++
 3 files changed, 30 insertions(+)

-- 
2.31.1

Patch

diff --git a/include/sim/callback.h b/include/sim/callback.h
index a6c536b1be1c..8d61ebb879e8 100644
--- a/include/sim/callback.h
+++ b/include/sim/callback.h
@@ -92,6 +92,7 @@  struct host_callback_struct
   int (*ftruncate) (host_callback *, int, int64_t);
   int (*truncate) (host_callback *, const char *, int64_t);
   int (*getpid) (host_callback *);
+  int (*kill) (host_callback *, int, int);
   int (*pipe) (host_callback *, int *);
 
   /* Called by the framework when a read call has emptied a pipe buffer.  */
diff --git a/sim/common/callback.c b/sim/common/callback.c
index 06d76b477245..c0ace6e4c8e5 100644
--- a/sim/common/callback.c
+++ b/sim/common/callback.c
@@ -569,6 +569,16 @@  os_getpid (host_callback *p)
   return result;
 }
 
+static int
+os_kill (host_callback *p, int pid, int signum)
+{
+  int result;
+
+  result = kill (pid, signum);
+  p->last_errno = errno;
+  return result;
+}
+
 static int
 os_pipe (host_callback *p, int *filedes)
 {
@@ -752,6 +762,7 @@  host_callback default_callback =
   os_truncate,
 
   os_getpid,
+  os_kill,
 
   os_pipe,
   os_pipe_empty,
diff --git a/sim/common/syscall.c b/sim/common/syscall.c
index 7ef34b95e9cf..6efddcfecde8 100644
--- a/sim/common/syscall.c
+++ b/sim/common/syscall.c
@@ -583,6 +583,24 @@  cb_syscall (host_callback *cb, CB_SYSCALL *sc)
       result = (*cb->getpid) (cb);
       break;
 
+    case CB_SYS_kill:
+      /* If killing self, leave it to the caller to process so it can send the
+	 signal to the engine.  */
+      if (sc->arg1 == (*cb->getpid) (cb))
+	{
+	  result = -1;
+	  errcode = ENOSYS;
+	}
+      else
+	{
+	  int signum = cb_target_to_host_signal (cb, sc->arg2);
+
+	  result = (*cb->kill) (cb, sc->arg1, signum);
+	  cb->last_errno = errno;
+	  goto ErrorFinish;
+	}
+      break;
+
     case CB_SYS_time :
       {
 	/* FIXME: May wish to change CB_SYS_time to something else.