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.
This commit is contained in:
Mike Frysinger 2021-06-20 23:06:10 -04:00
parent 02ddf7223d
commit d394a6efed
5 changed files with 40 additions and 0 deletions

View file

@ -1,3 +1,7 @@
2021-06-23 Mike Frysinger <vapier@gentoo.org>
* sim/callback.h (struct host_callback_struct): Add kill.
2021-06-22 Mike Frysinger <vapier@gentoo.org>
* sim/callback.h (struct host_callback_struct): Add getpid.

View file

@ -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. */

View file

@ -1,3 +1,9 @@
2021-06-23 Mike Frysinger <vapier@gentoo.org>
* callback.c (os_kill): New function.
(default_callback): Add os_kill.
* syscall.c (cb_syscall): Handle CB_SYS_kill.
2021-06-23 Mike Frysinger <vapier@gentoo.org>
* Make-common.in (srcdir): Change to abs_srcdir.

View file

@ -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,

View file

@ -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.