qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/1] accel/tcg/user-exec: support computing is_write for mips


From: Peter Maydell
Subject: Re: [PATCH 1/1] accel/tcg/user-exec: support computing is_write for mips32
Date: Fri, 11 Sep 2020 11:41:19 +0100

On Fri, 11 Sep 2020 at 02:14, zou xu <iwatchnima@gmail.com> wrote:
>
> From 533ed02427bdaf0265f62fcb4f961854a41b7037 Mon Sep 17 00:00:00 2001
> From: ZouXu <iwatchnima@gmail.com>
> Date: Wed, 9 Sep 2020 21:59:13 +0800
> Subject: [PATCH 1/1] accel/tcg/user-exec: support computing is_write for
>  mips32
>
> Those MIPS32 instructions can cause store operation:
> SB/SH/SW/SD/SWL/SWR/SDL/SDR/CACHE
> SC/SCD/SWC1/SWC2/SDC1/SDC2
> ---
>  accel/tcg/user-exec.c | 34 +++++++++++++++++++++++++++++++---
>  1 file changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c
> index bb039eb32d..b5ad721aa5 100644
> --- a/accel/tcg/user-exec.c
> +++ b/accel/tcg/user-exec.c
> @@ -708,10 +708,38 @@ int cpu_signal_handler(int host_signum, void *pinfo,
>      siginfo_t *info = pinfo;
>      ucontext_t *uc = puc;
>      greg_t pc = uc->uc_mcontext.pc;
> -    int is_write;
> +    int is_write = 0;
> +
> +    /* Detect store by reading the instruction at the program counter. */
> +    uint32_t insn = *(uint32_t *)pc;
> +    switch(insn>>29) {
> +    case 0x5:
> +        switch((insn>>26) & 0x7) {

Here we mask to get a 3-bit field...

> +        case 0x0: /* SB */
> +        case 0x1: /* SH */
> +        case 0x2: /* SWL */
> +        case 0x3: /* SW */
> +        case 0x4: /* SDL */
> +        case 0x5: /* SDR */
> +        case 0x6: /* SWR */
> +        case 0x7: /* CACHE */
> +            is_write = 1;

...but here all 8 cases are handled identically.
Is there a typo/logic error here, or should this
really just be

    case 0x5:
        /* SB, SH, SWL, SW, SDL, SDR, SWR, CACHE */
        is_write = 1;

?

Is CACHE really a write insn ?

> +        }
> +        break;
> +    case 0x7:
> +        switch((insn>>26) & 0x7) {
> +        case 0x0: /* SC */
> +        case 0x1: /* SWC1 */
> +        case 0x2: /* SWC2 */
> +        case 0x4: /* SCD */
> +        case 0x5: /* SDC1 */
> +        case 0x6: /* SDC2 */
> +        case 0x7: /* SD */
> +            is_write = 1;
> +        }
> +        break;
> +    }

thanks
-- PMM



reply via email to

[Prev in Thread] Current Thread [Next in Thread]