qemu-stable
[Top][All Lists]
Advanced

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

Re: [PATCH] target/sh4: Fix TB_FLAG_UNALIGN


From: Yoshinori Sato
Subject: Re: [PATCH] target/sh4: Fix TB_FLAG_UNALIGN
Date: Wed, 31 Aug 2022 17:30:37 +0900
User-agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (Gojō) APEL-LB/10.8 EasyPG/1.0.0 Emacs/27.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)

On Tue, 30 Aug 2022 01:10:29 +0900,
Richard Henderson wrote:
> 
> On 8/29/22 02:05, BALATON Zoltan wrote:
> > On Sun, 28 Aug 2022, Richard Henderson wrote:
> >> The value previously chosen overlaps GUSA_MASK.
> >> 
> >> Cc: qemu-stable@nongnu.org
> >> Fixes: 4da06fb3062 ("target/sh4: Implement prctl_unalign_sigbus")
> >> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/856
> >> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> >> ---
> >> target/sh4/cpu.h | 2 +-
> >> 1 file changed, 1 insertion(+), 1 deletion(-)
> >> 
> >> diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
> >> index 9f15ef913c..e79cbc59e2 100644
> >> --- a/target/sh4/cpu.h
> >> +++ b/target/sh4/cpu.h
> >> @@ -84,7 +84,7 @@
> >> #define DELAY_SLOT_RTE         (1 << 2)
> >> 
> >> #define TB_FLAG_PENDING_MOVCA  (1 << 3)
> >> -#define TB_FLAG_UNALIGN        (1 << 4)
> >> +#define TB_FLAG_UNALIGN        (1 << 13)
> > 
> > Is it worth a comment to note why that value to avoid the same
> > problem if another flag is added in the future?
> 
> Hmm, or perhaps move it down below, so that we see bit 3 used, then bits 
> 4-12, then bit 13.
> 
> 
> r~

How about this fix?

From 69fc46c0e439026cabedc8ddfa0a880d0df09a6b Mon Sep 17 00:00:00 2001
From: Yoshinori Sato <ysato@users.sourceforge.jp>
Date: Wed, 31 Aug 2022 17:12:59 +0900
Subject: [PATCH] sh4: cleanup for flags definition.

Fix conflict TB_FLAG_UNALIGN and GUSA field.
Add comment for gUSA operations.

Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>
---
 target/sh4/cpu.h       | 9 +++++++--
 target/sh4/translate.c | 5 ++++-
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
index 9f15ef913c..91810fda9b 100644
--- a/target/sh4/cpu.h
+++ b/target/sh4/cpu.h
@@ -86,9 +86,14 @@
 #define TB_FLAG_PENDING_MOVCA  (1 << 3)
 #define TB_FLAG_UNALIGN        (1 << 4)
 
-#define GUSA_SHIFT             4
 #ifdef CONFIG_USER_ONLY
-#define GUSA_EXCLUSIVE         (1 << 12)
+/* gUSA information field in CPUArchState.flags */
+/*
+   b16 - b23: Exclusive region range (negative)
+   b24: pc in exclusive region flag (use normal decode)
+*/
+#define GUSA_SHIFT             16
+#define GUSA_EXCLUSIVE         (1 << 24)
 #define GUSA_MASK              ((0xff << GUSA_SHIFT) | GUSA_EXCLUSIVE)
 #else
 /* Provide dummy versions of the above to allow tests against tbflags
diff --git a/target/sh4/translate.c b/target/sh4/translate.c
index f1b190e7cf..1d79a0721b 100644
--- a/target/sh4/translate.c
+++ b/target/sh4/translate.c
@@ -516,7 +516,7 @@ static void _decode_opc(DisasContext * ctx)
         /* Detect the start of a gUSA region.  If so, update envflags
            and end the TB.  This will allow us to see the end of the
            region (stored in R0) in the next TB.  */
-        if (B11_8 == 15 && B7_0s < 0 &&
+        if (B11_8 == 15 && B7_0s < 0 &&                /* mov #-xxx, r15 */
             (tb_cflags(ctx->base.tb) & CF_PARALLEL)) {
             ctx->envflags = deposit32(ctx->envflags, GUSA_SHIFT, 8, B7_0s);
             ctx->base.is_jmp = DISAS_STOP;
@@ -2267,7 +2267,9 @@ static void sh4_tr_init_disas_context(DisasContextBase 
*dcbase, CPUState *cs)
                   (tbflags & (1 << SR_RB))) * 0x10;
     ctx->fbank = tbflags & FPSCR_FR ? 0x10 : 0;
 
+#ifdef CONFIG_USER_ONLY
     if (tbflags & GUSA_MASK) {
+        /* In gUSA exclusive region */
         uint32_t pc = ctx->base.pc_next;
         uint32_t pc_end = ctx->base.tb->cs_base;
         int backup = sextract32(ctx->tbflags, GUSA_SHIFT, 8);
@@ -2285,6 +2287,7 @@ static void sh4_tr_init_disas_context(DisasContextBase 
*dcbase, CPUState *cs)
             return;
         }
     }
+#endif
 
     /* Since the ISA is fixed-width, we can bound by the number
        of instructions remaining on the page.  */
-- 
2.30.2

-- 
Yosinori Sato



reply via email to

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