diff mbox series

[v2,05/28] target/arm: Use gen_jmp for ISB and SB

Message ID 20210630183226.3290849-6-richard.henderson@linaro.org (mailing list archive)
State New, archived
Headers show
Series accel/tcg: Introduce translator_use_goto_tb | expand

Commit Message

Richard Henderson June 30, 2021, 6:32 p.m. UTC
Using gen_goto_tb directly misses the single-step check.

Cc: qemu-arm@nongnu.org
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/arm/translate.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Peter Maydell July 8, 2021, 12:05 p.m. UTC | #1
On Wed, 30 Jun 2021 at 19:47, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Using gen_goto_tb directly misses the single-step check.
>
> Cc: qemu-arm@nongnu.org
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  target/arm/translate.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/target/arm/translate.c b/target/arm/translate.c
> index a0c6cfa902..8cd31feeaa 100644
> --- a/target/arm/translate.c
> +++ b/target/arm/translate.c
> @@ -8582,7 +8582,7 @@ static bool trans_ISB(DisasContext *s, arg_ISB *a)
>       * self-modifying code correctly and also to take
>       * any pending interrupts immediately.
>       */
> -    gen_goto_tb(s, 0, s->base.pc_next);
> +    gen_jmp(s, s->base.pc_next);
>      return true;
>  }
>
> @@ -8596,7 +8596,7 @@ static bool trans_SB(DisasContext *s, arg_SB *a)
>       * for TCG; MB and end the TB instead.
>       */
>      tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
> -    gen_goto_tb(s, 0, s->base.pc_next);
> +    gen_jmp(s, s->base.pc_next);
>      return true;

Why isn't it enough here just to set is_jmp to DISAS_NEXT ?

thanks
-- PMM
Richard Henderson July 8, 2021, 4:04 p.m. UTC | #2
On 7/8/21 5:05 AM, Peter Maydell wrote:
> On Wed, 30 Jun 2021 at 19:47, Richard Henderson
> <richard.henderson@linaro.org> wrote:
>>
>> Using gen_goto_tb directly misses the single-step check.
>>
>> Cc: qemu-arm@nongnu.org
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>>   target/arm/translate.c | 4 ++--
>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/target/arm/translate.c b/target/arm/translate.c
>> index a0c6cfa902..8cd31feeaa 100644
>> --- a/target/arm/translate.c
>> +++ b/target/arm/translate.c
>> @@ -8582,7 +8582,7 @@ static bool trans_ISB(DisasContext *s, arg_ISB *a)
>>        * self-modifying code correctly and also to take
>>        * any pending interrupts immediately.
>>        */
>> -    gen_goto_tb(s, 0, s->base.pc_next);
>> +    gen_jmp(s, s->base.pc_next);
>>       return true;
>>   }
>>
>> @@ -8596,7 +8596,7 @@ static bool trans_SB(DisasContext *s, arg_SB *a)
>>        * for TCG; MB and end the TB instead.
>>        */
>>       tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
>> -    gen_goto_tb(s, 0, s->base.pc_next);
>> +    gen_jmp(s, s->base.pc_next);
>>       return true;
> 
> Why isn't it enough here just to set is_jmp to DISAS_NEXT ?

You mean DISAS_TOO_MANY?  That would work, yes.
At the time I was just thinking of replacing one jump with another.


r~
Peter Maydell July 8, 2021, 4:11 p.m. UTC | #3
On Thu, 8 Jul 2021 at 17:04, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> On 7/8/21 5:05 AM, Peter Maydell wrote:
> > On Wed, 30 Jun 2021 at 19:47, Richard Henderson
> > <richard.henderson@linaro.org> wrote:
> >>
> >> Using gen_goto_tb directly misses the single-step check.
> >>
> >> Cc: qemu-arm@nongnu.org
> >> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> >> ---
> >>   target/arm/translate.c | 4 ++--
> >>   1 file changed, 2 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/target/arm/translate.c b/target/arm/translate.c
> >> index a0c6cfa902..8cd31feeaa 100644
> >> --- a/target/arm/translate.c
> >> +++ b/target/arm/translate.c
> >> @@ -8582,7 +8582,7 @@ static bool trans_ISB(DisasContext *s, arg_ISB *a)
> >>        * self-modifying code correctly and also to take
> >>        * any pending interrupts immediately.
> >>        */
> >> -    gen_goto_tb(s, 0, s->base.pc_next);
> >> +    gen_jmp(s, s->base.pc_next);
> >>       return true;
> >>   }
> >>
> >> @@ -8596,7 +8596,7 @@ static bool trans_SB(DisasContext *s, arg_SB *a)
> >>        * for TCG; MB and end the TB instead.
> >>        */
> >>       tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
> >> -    gen_goto_tb(s, 0, s->base.pc_next);
> >> +    gen_jmp(s, s->base.pc_next);
> >>       return true;
> >
> > Why isn't it enough here just to set is_jmp to DISAS_NEXT ?
>
> You mean DISAS_TOO_MANY?  That would work, yes.
> At the time I was just thinking of replacing one jump with another.

You've implicitly answered my question, which is that the main
translator loop code treats DISAS_NEXT as "keep adding insns to
the TB" :-)

It feels slightly like misuse to use DISAS_TOO_MANY, unless we
renamed it to something like DISAS_END_TB (which is what it's
actually doing).

thanks
-- PMM
Richard Henderson July 8, 2021, 4:17 p.m. UTC | #4
On 7/8/21 9:11 AM, Peter Maydell wrote:
>>> Why isn't it enough here just to set is_jmp to DISAS_NEXT ?
>>
>> You mean DISAS_TOO_MANY?  That would work, yes.
>> At the time I was just thinking of replacing one jump with another.
> 
> You've implicitly answered my question, which is that the main
> translator loop code treats DISAS_NEXT as "keep adding insns to
> the TB" :-)
> 
> It feels slightly like misuse to use DISAS_TOO_MANY, unless we
> renamed it to something like DISAS_END_TB (which is what it's
> actually doing).

Yeah, better naming would have been a good.  In this instance I think I chose an odd 
colour for the bike shed.

The problem with just DISAS_END_TB is that there are many ways to end a tb, with at least: 
(1) goto_tb next, (2) goto_ptr next, (3) exit_tb.  We wind up replicating these three 
across many of the targets, so it would be a really nice cleanup to standardize, and with 
good names.


r~
Peter Maydell July 8, 2021, 5:47 p.m. UTC | #5
On Thu, 8 Jul 2021 at 17:17, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> On 7/8/21 9:11 AM, Peter Maydell wrote:
> >>> Why isn't it enough here just to set is_jmp to DISAS_NEXT ?
> >>
> >> You mean DISAS_TOO_MANY?  That would work, yes.
> >> At the time I was just thinking of replacing one jump with another.
> >
> > You've implicitly answered my question, which is that the main
> > translator loop code treats DISAS_NEXT as "keep adding insns to
> > the TB" :-)
> >
> > It feels slightly like misuse to use DISAS_TOO_MANY, unless we
> > renamed it to something like DISAS_END_TB (which is what it's
> > actually doing).
>
> Yeah, better naming would have been a good.  In this instance I think I chose an odd
> colour for the bike shed.
>
> The problem with just DISAS_END_TB is that there are many ways to end a tb, with at least:
> (1) goto_tb next, (2) goto_ptr next, (3) exit_tb.  We wind up replicating these three
> across many of the targets, so it would be a really nice cleanup to standardize, and with
> good names.

Mmm. Anyway, for this change

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM
diff mbox series

Patch

diff --git a/target/arm/translate.c b/target/arm/translate.c
index a0c6cfa902..8cd31feeaa 100644
--- a/target/arm/translate.c
+++ b/target/arm/translate.c
@@ -8582,7 +8582,7 @@  static bool trans_ISB(DisasContext *s, arg_ISB *a)
      * self-modifying code correctly and also to take
      * any pending interrupts immediately.
      */
-    gen_goto_tb(s, 0, s->base.pc_next);
+    gen_jmp(s, s->base.pc_next);
     return true;
 }
 
@@ -8596,7 +8596,7 @@  static bool trans_SB(DisasContext *s, arg_SB *a)
      * for TCG; MB and end the TB instead.
      */
     tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
-    gen_goto_tb(s, 0, s->base.pc_next);
+    gen_jmp(s, s->base.pc_next);
     return true;
 }