All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Vivier <laurent@vivier.eu>
To: Richard Henderson <richard.henderson@linaro.org>, qemu-devel@nongnu.org
Subject: Re: [PATCH v2 2/2] linux-user/m68k: Handle EXCP_ADDRESS in cpu_loop
Date: Wed, 15 Mar 2023 19:16:49 +0100	[thread overview]
Message-ID: <4f55ec67-2a20-9d99-1934-f7b20f3094fe@vivier.eu> (raw)
In-Reply-To: <20230309201604.3885359-3-richard.henderson@linaro.org>

Le 09/03/2023 à 21:16, Richard Henderson a écrit :
> This exception can be raised by illegal instructions.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   linux-user/m68k/cpu_loop.c     |  5 ++++-
>   tests/tcg/m68k/excp-address.c  | 32 ++++++++++++++++++++++++++++++++
>   tests/tcg/m68k/Makefile.target |  1 +
>   3 files changed, 37 insertions(+), 1 deletion(-)
>   create mode 100644 tests/tcg/m68k/excp-address.c
> 
> diff --git a/linux-user/m68k/cpu_loop.c b/linux-user/m68k/cpu_loop.c
> index caead1cb74..84b5d290c0 100644
> --- a/linux-user/m68k/cpu_loop.c
> +++ b/linux-user/m68k/cpu_loop.c
> @@ -35,7 +35,10 @@ void cpu_loop(CPUM68KState *env)
>           cpu_exec_end(cs);
>           process_queued_cpu_work(cs);
>   
> -        switch(trapnr) {
> +        switch (trapnr) {
> +        case EXCP_ADDRESS:
> +            force_sig_fault(TARGET_SIGBUS, TARGET_BUS_ADRALN, env->pc);
> +            break;
>           case EXCP_ILLEGAL:
>           case EXCP_LINEA:
>           case EXCP_LINEF:
> diff --git a/tests/tcg/m68k/excp-address.c b/tests/tcg/m68k/excp-address.c
> new file mode 100644
> index 0000000000..1dbdddef58
> --- /dev/null
> +++ b/tests/tcg/m68k/excp-address.c
> @@ -0,0 +1,32 @@
> +/*
> + * Test m68k address exception
> + */
> +
> +#define _GNU_SOURCE 1
> +#include <signal.h>
> +#include <stdlib.h>
> +
> +static void sig_handler(int sig, siginfo_t *si, void *puc)
> +{
> +    exit(0);
> +}
> +
> +int main(int argc, char **argv)
> +{
> +    struct sigaction act = {
> +        .sa_sigaction = sig_handler,
> +        .sa_flags = SA_SIGINFO
> +    };
> +
> +    sigaction(SIGBUS, &act, NULL);
> +
> +    /*
> +     * addl %d0,#0 -- with immediate as destination is illegal.
> +     * Buggy qemu interpreted the insn as 5 words: 2 for immediate source
> +     * and another 2 for immediate destination.  Provide all that padding
> +     * so that abort gets called.
> +     */
> +    asm volatile(".word 0xd1bc,0,0,0,0");
> +
> +    abort();
> +}
> diff --git a/tests/tcg/m68k/Makefile.target b/tests/tcg/m68k/Makefile.target
> index 1163c7ef03..d3b0bc48a3 100644
> --- a/tests/tcg/m68k/Makefile.target
> +++ b/tests/tcg/m68k/Makefile.target
> @@ -4,6 +4,7 @@
>   #
>   
>   VPATH += $(SRC_PATH)/tests/tcg/m68k
> +TESTS += excp-address
>   TESTS += trap
>   
>   # On m68k Linux supports 4k and 8k pages (but 8k is currently broken)

Reviewed-by: Laurent Vivier <laurent@vivier.eu>

I've tested tests/tcg/m68k/excp-address.c on a real hardware (Q800), and the result differs from the 
one from QEMU:

On Q800 (etch m68k, kernel 5.14.0):

$ ./excp-address
Illegal instruction
$ strace ./excp-address
...
rt_sigaction(SIGBUS, {0x80000478, [], SA_SIGINFO}, NULL, 8) = 0
--- SIGILL (Illegal instruction) @ 0 (0) ---
+++ killed by SIGILL +++

With QEMU, we have:

# QEMU_STRACE= ./excp-address
...
677354 rt_sigaction(SIGBUS,0x40800454,NULL) = 0
--- SIGBUS {si_signo=SIGBUS, si_code=1, si_addr=0x800004ce} ---
677354 exit_group(0)

Thanks,
Laurent


  reply	other threads:[~2023-03-15 18:17 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-09 20:16 [PATCH v2 0/2] target/m68k: Reject immediate as destination Richard Henderson
2023-03-09 20:16 ` [PATCH v2 1/2] target/m68k: Reject immediate as destination in gen_ea_mode Richard Henderson
2023-03-10 10:03   ` Laurent Vivier
2023-03-15 16:41   ` Laurent Vivier
2023-03-09 20:16 ` [PATCH v2 2/2] linux-user/m68k: Handle EXCP_ADDRESS in cpu_loop Richard Henderson
2023-03-15 18:16   ` Laurent Vivier [this message]
2023-03-16 14:23     ` Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4f55ec67-2a20-9d99-1934-f7b20f3094fe@vivier.eu \
    --to=laurent@vivier.eu \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.