diff mbox series

[for-6.2,03/23] target/avr: Drop checks for singlestep_enabled

Message ID 20210721064155.645508-4-richard.henderson@linaro.org
State Superseded
Headers show
Series tcg: gdb singlestep reorg | expand

Commit Message

Richard Henderson July 21, 2021, 6:41 a.m. UTC
GDB single-stepping is now handled generically.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 target/avr/translate.c | 19 ++++---------------
 1 file changed, 4 insertions(+), 15 deletions(-)

-- 
2.25.1

Comments

Philippe Mathieu-Daudé July 21, 2021, 6 p.m. UTC | #1
+Michael/Alex/Pavel

On 7/21/21 8:41 AM, Richard Henderson wrote:
> GDB single-stepping is now handled generically.

> 

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  target/avr/translate.c | 19 ++++---------------

>  1 file changed, 4 insertions(+), 15 deletions(-)

> 

> diff --git a/target/avr/translate.c b/target/avr/translate.c

> index 1111e08b83..0403470dd8 100644

> --- a/target/avr/translate.c

> +++ b/target/avr/translate.c

> @@ -1089,11 +1089,7 @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)

>          tcg_gen_exit_tb(tb, n);

>      } else {

>          tcg_gen_movi_i32(cpu_pc, dest);

> -        if (ctx->base.singlestep_enabled) {

> -            gen_helper_debug(cpu_env);

> -        } else {

> -            tcg_gen_lookup_and_goto_ptr();

> -        }

> +        tcg_gen_lookup_and_goto_ptr();

>      }

>      ctx->base.is_jmp = DISAS_NORETURN;

>  }

> @@ -3011,17 +3007,10 @@ static void avr_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)

>          tcg_gen_movi_tl(cpu_pc, ctx->npc);

>          /* fall through */

>      case DISAS_LOOKUP:

> -        if (!ctx->base.singlestep_enabled) {

> -            tcg_gen_lookup_and_goto_ptr();

> -            break;

> -        }

> -        /* fall through */

> +        tcg_gen_lookup_and_goto_ptr();

> +        break;

>      case DISAS_EXIT:

> -        if (ctx->base.singlestep_enabled) {

> -            gen_helper_debug(cpu_env);

> -        } else {

> -            tcg_gen_exit_tb(NULL, 0);

> -        }

> +        tcg_gen_exit_tb(NULL, 0);

>          break;

>      default:

>          g_assert_not_reached();

> 


Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>


Not related to this patch, but looking at the last
gen_helper_debug() use:

/*
 *  The BREAK instruction is used by the On-chip Debug system, and is
 *  normally not used in the application software. When the BREAK
instruction is
 *  executed, the AVR CPU is set in the Stopped Mode. This gives the On-chip
 *  Debugger access to internal resources.  If any Lock bits are set, or
either
 *  the JTAGEN or OCDEN Fuses are unprogrammed, the CPU will treat the BREAK
 *  instruction as a NOP and will not enter the Stopped mode.  This
instruction
 *  is not available in all devices. Refer to the device specific
instruction
 *  set summary.
 */
static bool trans_BREAK(DisasContext *ctx, arg_BREAK *a)
{
    if (!avr_have_feature(ctx, AVR_FEATURE_BREAK)) {
        return true;
    }

#ifdef BREAKPOINT_ON_BREAK
    tcg_gen_movi_tl(cpu_pc, ctx->npc - 1);
    gen_helper_debug(cpu_env);
    ctx->base.is_jmp = DISAS_EXIT;
#else
    /* NOP */
#endif

    return true;
}

Shouldn't we have a generic 'bool gdbstub_is_attached()' in
"exec/gdbstub.h", then use it in replay_gdb_attached() and
trans_BREAK() instead of this BREAKPOINT_ON_BREAK build-time
definitions?
Michael Rolnik July 22, 2021, 11:18 a.m. UTC | #2
Reviewed-by: Michael Rolnik <mrolnik@gmail.com>

Tested-by: Michael Rolnik <mrolnik@gmail.com>


On Wed, Jul 21, 2021 at 9:00 PM Philippe Mathieu-Daudé <f4bug@amsat.org>
wrote:

> +Michael/Alex/Pavel

>

> On 7/21/21 8:41 AM, Richard Henderson wrote:

> > GDB single-stepping is now handled generically.

> >

> > Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> > ---

> >  target/avr/translate.c | 19 ++++---------------

> >  1 file changed, 4 insertions(+), 15 deletions(-)

> >

> > diff --git a/target/avr/translate.c b/target/avr/translate.c

> > index 1111e08b83..0403470dd8 100644

> > --- a/target/avr/translate.c

> > +++ b/target/avr/translate.c

> > @@ -1089,11 +1089,7 @@ static void gen_goto_tb(DisasContext *ctx, int n,

> target_ulong dest)

> >          tcg_gen_exit_tb(tb, n);

> >      } else {

> >          tcg_gen_movi_i32(cpu_pc, dest);

> > -        if (ctx->base.singlestep_enabled) {

> > -            gen_helper_debug(cpu_env);

> > -        } else {

> > -            tcg_gen_lookup_and_goto_ptr();

> > -        }

> > +        tcg_gen_lookup_and_goto_ptr();

> >      }

> >      ctx->base.is_jmp = DISAS_NORETURN;

> >  }

> > @@ -3011,17 +3007,10 @@ static void avr_tr_tb_stop(DisasContextBase

> *dcbase, CPUState *cs)

> >          tcg_gen_movi_tl(cpu_pc, ctx->npc);

> >          /* fall through */

> >      case DISAS_LOOKUP:

> > -        if (!ctx->base.singlestep_enabled) {

> > -            tcg_gen_lookup_and_goto_ptr();

> > -            break;

> > -        }

> > -        /* fall through */

> > +        tcg_gen_lookup_and_goto_ptr();

> > +        break;

> >      case DISAS_EXIT:

> > -        if (ctx->base.singlestep_enabled) {

> > -            gen_helper_debug(cpu_env);

> > -        } else {

> > -            tcg_gen_exit_tb(NULL, 0);

> > -        }

> > +        tcg_gen_exit_tb(NULL, 0);

> >          break;

> >      default:

> >          g_assert_not_reached();

> >

>

> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

>

> Not related to this patch, but looking at the last

> gen_helper_debug() use:

>

> /*

>  *  The BREAK instruction is used by the On-chip Debug system, and is

>  *  normally not used in the application software. When the BREAK

> instruction is

>  *  executed, the AVR CPU is set in the Stopped Mode. This gives the

> On-chip

>  *  Debugger access to internal resources.  If any Lock bits are set, or

> either

>  *  the JTAGEN or OCDEN Fuses are unprogrammed, the CPU will treat the

> BREAK

>  *  instruction as a NOP and will not enter the Stopped mode.  This

> instruction

>  *  is not available in all devices. Refer to the device specific

> instruction

>  *  set summary.

>  */

> static bool trans_BREAK(DisasContext *ctx, arg_BREAK *a)

> {

>     if (!avr_have_feature(ctx, AVR_FEATURE_BREAK)) {

>         return true;

>     }

>

> #ifdef BREAKPOINT_ON_BREAK

>     tcg_gen_movi_tl(cpu_pc, ctx->npc - 1);

>     gen_helper_debug(cpu_env);

>     ctx->base.is_jmp = DISAS_EXIT;

> #else

>     /* NOP */

> #endif

>

>     return true;

> }

>

> Shouldn't we have a generic 'bool gdbstub_is_attached()' in

> "exec/gdbstub.h", then use it in replay_gdb_attached() and

> trans_BREAK() instead of this BREAKPOINT_ON_BREAK build-time

> definitions?

>



-- 
Best Regards,
Michael Rolnik
<div dir="ltr">Reviewed-by: Michael Rolnik &lt;<a href="mailto:mrolnik@gmail.com">mrolnik@gmail.com</a>&gt;<div>Tested-by: Michael Rolnik &lt;<a href="mailto:mrolnik@gmail.com">mrolnik@gmail.com</a>&gt;</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jul 21, 2021 at 9:00 PM Philippe Mathieu-Daudé &lt;<a href="mailto:f4bug@amsat.org">f4bug@amsat.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">+Michael/Alex/Pavel<br>
<br>
On 7/21/21 8:41 AM, Richard Henderson wrote:<br>
&gt; GDB single-stepping is now handled generically.<br>
&gt; <br>
&gt; Signed-off-by: Richard Henderson &lt;<a href="mailto:richard.henderson@linaro.org" target="_blank">richard.henderson@linaro.org</a>&gt;<br>
&gt; ---<br>
&gt;  target/avr/translate.c | 19 ++++---------------<br>
&gt;  1 file changed, 4 insertions(+), 15 deletions(-)<br>
&gt; <br>
&gt; diff --git a/target/avr/translate.c b/target/avr/translate.c<br>
&gt; index 1111e08b83..0403470dd8 100644<br>
&gt; --- a/target/avr/translate.c<br>
&gt; +++ b/target/avr/translate.c<br>
&gt; @@ -1089,11 +1089,7 @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)<br>
&gt;          tcg_gen_exit_tb(tb, n);<br>
&gt;      } else {<br>
&gt;          tcg_gen_movi_i32(cpu_pc, dest);<br>
&gt; -        if (ctx-&gt;base.singlestep_enabled) {<br>
&gt; -            gen_helper_debug(cpu_env);<br>
&gt; -        } else {<br>
&gt; -            tcg_gen_lookup_and_goto_ptr();<br>
&gt; -        }<br>
&gt; +        tcg_gen_lookup_and_goto_ptr();<br>
&gt;      }<br>
&gt;      ctx-&gt;base.is_jmp = DISAS_NORETURN;<br>
&gt;  }<br>
&gt; @@ -3011,17 +3007,10 @@ static void avr_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)<br>
&gt;          tcg_gen_movi_tl(cpu_pc, ctx-&gt;npc);<br>
&gt;          /* fall through */<br>
&gt;      case DISAS_LOOKUP:<br>
&gt; -        if (!ctx-&gt;base.singlestep_enabled) {<br>
&gt; -            tcg_gen_lookup_and_goto_ptr();<br>
&gt; -            break;<br>
&gt; -        }<br>
&gt; -        /* fall through */<br>
&gt; +        tcg_gen_lookup_and_goto_ptr();<br>
&gt; +        break;<br>
&gt;      case DISAS_EXIT:<br>
&gt; -        if (ctx-&gt;base.singlestep_enabled) {<br>
&gt; -            gen_helper_debug(cpu_env);<br>
&gt; -        } else {<br>
&gt; -            tcg_gen_exit_tb(NULL, 0);<br>
&gt; -        }<br>
&gt; +        tcg_gen_exit_tb(NULL, 0);<br>
&gt;          break;<br>
&gt;      default:<br>
&gt;          g_assert_not_reached();<br>
&gt; <br>
<br>
Reviewed-by: Philippe Mathieu-Daudé &lt;<a href="mailto:f4bug@amsat.org" target="_blank">f4bug@amsat.org</a>&gt;<br>

<br>
Not related to this patch, but looking at the last<br>
gen_helper_debug() use:<br>
<br>
/*<br>
 *  The BREAK instruction is used by the On-chip Debug system, and is<br>
 *  normally not used in the application software. When the BREAK<br>
instruction is<br>
 *  executed, the AVR CPU is set in the Stopped Mode. This gives the On-chip<br>
 *  Debugger access to internal resources.  If any Lock bits are set, or<br>
either<br>
 *  the JTAGEN or OCDEN Fuses are unprogrammed, the CPU will treat the BREAK<br>
 *  instruction as a NOP and will not enter the Stopped mode.  This<br>
instruction<br>
 *  is not available in all devices. Refer to the device specific<br>
instruction<br>
 *  set summary.<br>
 */<br>
static bool trans_BREAK(DisasContext *ctx, arg_BREAK *a)<br>
{<br>
    if (!avr_have_feature(ctx, AVR_FEATURE_BREAK)) {<br>
        return true;<br>
    }<br>
<br>
#ifdef BREAKPOINT_ON_BREAK<br>
    tcg_gen_movi_tl(cpu_pc, ctx-&gt;npc - 1);<br>
    gen_helper_debug(cpu_env);<br>
    ctx-&gt;base.is_jmp = DISAS_EXIT;<br>
#else<br>
    /* NOP */<br>
#endif<br>
<br>
    return true;<br>
}<br>
<br>
Shouldn&#39;t we have a generic &#39;bool gdbstub_is_attached()&#39; in<br>
&quot;exec/gdbstub.h&quot;, then use it in replay_gdb_attached() and<br>
trans_BREAK() instead of this BREAKPOINT_ON_BREAK build-time<br>
definitions?<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Best Regards,<br>Michael Rolnik</div>
diff mbox series

Patch

diff --git a/target/avr/translate.c b/target/avr/translate.c
index 1111e08b83..0403470dd8 100644
--- a/target/avr/translate.c
+++ b/target/avr/translate.c
@@ -1089,11 +1089,7 @@  static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
         tcg_gen_exit_tb(tb, n);
     } else {
         tcg_gen_movi_i32(cpu_pc, dest);
-        if (ctx->base.singlestep_enabled) {
-            gen_helper_debug(cpu_env);
-        } else {
-            tcg_gen_lookup_and_goto_ptr();
-        }
+        tcg_gen_lookup_and_goto_ptr();
     }
     ctx->base.is_jmp = DISAS_NORETURN;
 }
@@ -3011,17 +3007,10 @@  static void avr_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
         tcg_gen_movi_tl(cpu_pc, ctx->npc);
         /* fall through */
     case DISAS_LOOKUP:
-        if (!ctx->base.singlestep_enabled) {
-            tcg_gen_lookup_and_goto_ptr();
-            break;
-        }
-        /* fall through */
+        tcg_gen_lookup_and_goto_ptr();
+        break;
     case DISAS_EXIT:
-        if (ctx->base.singlestep_enabled) {
-            gen_helper_debug(cpu_env);
-        } else {
-            tcg_gen_exit_tb(NULL, 0);
-        }
+        tcg_gen_exit_tb(NULL, 0);
         break;
     default:
         g_assert_not_reached();