From: Mike Frysinger Date: Mon, 21 Jun 2021 03:06:10 +0000 (-0400) Subject: sim: callback: add a kill interface X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d394a6efed4723b86f8e4f09fc23f6d03a7ad835;p=binutils-gdb.git sim: callback: add a kill interface 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. --- diff --git a/include/sim/ChangeLog b/include/sim/ChangeLog index b98631b37e5..3faea582894 100644 --- a/include/sim/ChangeLog +++ b/include/sim/ChangeLog @@ -1,3 +1,7 @@ +2021-06-23 Mike Frysinger + + * sim/callback.h (struct host_callback_struct): Add kill. + 2021-06-22 Mike Frysinger * sim/callback.h (struct host_callback_struct): Add getpid. diff --git a/include/sim/callback.h b/include/sim/callback.h index a6c536b1be1..8d61ebb879e 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/ChangeLog b/sim/common/ChangeLog index bb1a967c298..c32e7475a80 100644 --- a/sim/common/ChangeLog +++ b/sim/common/ChangeLog @@ -1,3 +1,9 @@ +2021-06-23 Mike Frysinger + + * callback.c (os_kill): New function. + (default_callback): Add os_kill. + * syscall.c (cb_syscall): Handle CB_SYS_kill. + 2021-06-23 Mike Frysinger * Make-common.in (srcdir): Change to abs_srcdir. diff --git a/sim/common/callback.c b/sim/common/callback.c index 06d76b47724..c0ace6e4c8e 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 7ef34b95e9c..6efddcfecde 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.