diff options
author | Mike Frysinger <vapier@gentoo.org> | 2021-06-20 23:50:35 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2021-06-23 20:11:45 -0400 |
commit | 2f631626f1d8a354d3c5f9d2fce15b47d05d1455 (patch) | |
tree | 7011d11a990c8da9bd7c3525a32cf70b81a1dc2c | |
parent | e91488f739f0dbb93bfd9d96164c25d9674846c4 (diff) | |
download | gdb-2f631626f1d8a354d3c5f9d2fce15b47d05d1455.zip gdb-2f631626f1d8a354d3c5f9d2fce15b47d05d1455.tar.gz gdb-2f631626f1d8a354d3c5f9d2fce15b47d05d1455.tar.bz2 |
sim: syscall: handle killing the sim itself
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.
-rw-r--r-- | sim/common/ChangeLog | 4 | ||||
-rw-r--r-- | sim/common/sim-syscall.c | 16 |
2 files changed, 18 insertions, 2 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog index c32e747..18d37bd 100644 --- a/sim/common/ChangeLog +++ b/sim/common/ChangeLog @@ -1,5 +1,9 @@ 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. (default_callback): Add os_kill. * syscall.c (cb_syscall): Handle CB_SYS_kill. diff --git a/sim/common/sim-syscall.c b/sim/common/sim-syscall.c index be3ff8f..f24d761 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 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; |