On 05.07.21 23:04, Ilya Leoshkevich wrote:
> For SIGILL, SIGFPE and SIGTRAP the PSW must point after the
> instruction, and at the instruction for other signals. Currently under
> qemu-user for SIGFILL and SIGFPE it points at the instruction.
>
> Fix by advancing psw.addr for these signals.
>
> Buglink: https://gitlab.com/qemu-project/qemu/-/issues/319
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> Co-developed-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
> ---
> linux-user/s390x/cpu_loop.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/linux-user/s390x/cpu_loop.c b/linux-user/s390x/cpu_loop.c
> index 30568139df..6e7dfb290a 100644
> --- a/linux-user/s390x/cpu_loop.c
> +++ b/linux-user/s390x/cpu_loop.c
> @@ -64,7 +64,13 @@ void cpu_loop(CPUS390XState *env)
> case EXCP_DEBUG:
> sig = TARGET_SIGTRAP;
> n = TARGET_TRAP_BRKPT;
> - goto do_signal_pc;
> + /*
> + * For SIGTRAP the PSW must point after the instruction, which it
> + * already does thanks to s390x_tr_tb_stop(). si_addr doesn't need
> + * to be filled.
> + */
> + addr = 0;
> + goto do_signal;
> case EXCP_PGM:
> n = env->int_pgm_code;
> switch (n) {
> @@ -133,6 +139,10 @@ void cpu_loop(CPUS390XState *env)
>
> do_signal_pc:
> addr = env->psw.addr;
> + /*
> + * For SIGILL and SIGFPE the PSW must point after the instruction.
> + */
> + env->psw.addr += env->int_pgm_ilen;
> do_signal:
> info.si_signo = sig;
> info.si_errno = 0;
>
Reviewed-by: David Hildenbrand <david@redhat.com>
--
Thanks,
David / dhildenb