Message ID | 20181019174958.26616-3-peter.maydell@linaro.org |
---|---|
State | New |
Headers | show |
Series | linux-user: Don't call gdb_handlesig unnecessarily | expand |
On 19/10/2018 19:49, Peter Maydell wrote: > The nios2 main loop code's code does some odd > things with gdb_handlesig() that no other target > CPU does: it has some signals that are delivered > to gdb and only to gdb. Stop doing this, and instead > behave like all the other targets: > * a trap instruction becomes a SIGTRAP > * an unhandled exception type returned from cpu_exec() > causes us to abort(), not to try to hand gdb a SIGILL > > This fixes in passing Coverity issue CID 1390853, > which was a complaint that the old code failed to > check the return value from gdb_handlesig(). > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> > --- > Disclaimer: compile tested, and the change makes conceptual > sense, but I have no nios2 test environment. I'll push a slightly modified version of this patch: gdbsig is now unused and my compiler complains about that. Thanks, Laurent > --- > linux-user/nios2/cpu_loop.c | 14 +++++--------- > 1 file changed, 5 insertions(+), 9 deletions(-) > > diff --git a/linux-user/nios2/cpu_loop.c b/linux-user/nios2/cpu_loop.c > index dac7a061813..973dd54d791 100644 > --- a/linux-user/nios2/cpu_loop.c > +++ b/linux-user/nios2/cpu_loop.c > @@ -68,7 +68,10 @@ void cpu_loop(CPUNios2State *env) > env->regs[R_EA] = env->regs[R_PC] + 4; > env->regs[R_PC] = cpu->exception_addr; > > - gdbsig = TARGET_SIGTRAP; > + info.si_signo = TARGET_SIGTRAP; > + info.si_errno = 0; > + info.si_code = TARGET_TRAP_BRKPT; > + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); > break; > } > case 0xaa: > @@ -106,14 +109,7 @@ kuser_fail: > default: > EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x - aborting\n", > trapnr); > - gdbsig = TARGET_SIGILL; > - break; > - } > - if (gdbsig) { > - gdb_handlesig(cs, gdbsig); > - if (gdbsig != TARGET_SIGTRAP) { > - exit(EXIT_FAILURE); > - } > + abort(); > } > > process_pending_signals(env); >
diff --git a/linux-user/nios2/cpu_loop.c b/linux-user/nios2/cpu_loop.c index dac7a061813..973dd54d791 100644 --- a/linux-user/nios2/cpu_loop.c +++ b/linux-user/nios2/cpu_loop.c @@ -68,7 +68,10 @@ void cpu_loop(CPUNios2State *env) env->regs[R_EA] = env->regs[R_PC] + 4; env->regs[R_PC] = cpu->exception_addr; - gdbsig = TARGET_SIGTRAP; + info.si_signo = TARGET_SIGTRAP; + info.si_errno = 0; + info.si_code = TARGET_TRAP_BRKPT; + queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); break; } case 0xaa: @@ -106,14 +109,7 @@ kuser_fail: default: EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x - aborting\n", trapnr); - gdbsig = TARGET_SIGILL; - break; - } - if (gdbsig) { - gdb_handlesig(cs, gdbsig); - if (gdbsig != TARGET_SIGTRAP) { - exit(EXIT_FAILURE); - } + abort(); } process_pending_signals(env);
The nios2 main loop code's code does some odd things with gdb_handlesig() that no other target CPU does: it has some signals that are delivered to gdb and only to gdb. Stop doing this, and instead behave like all the other targets: * a trap instruction becomes a SIGTRAP * an unhandled exception type returned from cpu_exec() causes us to abort(), not to try to hand gdb a SIGILL This fixes in passing Coverity issue CID 1390853, which was a complaint that the old code failed to check the return value from gdb_handlesig(). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> --- Disclaimer: compile tested, and the change makes conceptual sense, but I have no nios2 test environment. --- linux-user/nios2/cpu_loop.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)