diff mbox series

[v2,62/76] target/microblaze: Tidy mb_cpu_dump_state

Message ID 20200828141929.77854-63-richard.henderson@linaro.org
State New
Headers show
Series target/microblaze improvements | expand

Commit Message

Richard Henderson Aug. 28, 2020, 2:19 p.m. UTC
Using lookup_symbol is quite slow; remove that.  Decode the
various bits of iflags; only show imm, btaken, btarget when
they are relevant to iflags.  Improve formatting.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/microblaze/translate.c | 67 +++++++++++++++++++++--------------
 1 file changed, 41 insertions(+), 26 deletions(-)

Comments

Philippe Mathieu-Daudé Aug. 31, 2020, 9:08 p.m. UTC | #1
Hi Richard,

Le ven. 28 août 2020 16:46, Richard Henderson <richard.henderson@linaro.org>
a écrit :

> Using lookup_symbol is quite slow; remove that.  Decode the
>

Can we add some runtime option to enable its use instead?

various bits of iflags; only show imm, btaken, btarget when
> they are relevant to iflags.  Improve formatting.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  target/microblaze/translate.c | 67 +++++++++++++++++++++--------------
>  1 file changed, 41 insertions(+), 26 deletions(-)
>
> diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
> index 811c92d23b..3b63fd79e5 100644
> --- a/target/microblaze/translate.c
> +++ b/target/microblaze/translate.c
> @@ -1818,41 +1818,56 @@ void mb_cpu_dump_state(CPUState *cs, FILE *f, int
> flags)
>  {
>      MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
>      CPUMBState *env = &cpu->env;
> +    uint32_t iflags;
>      int i;
>
> -    if (!env) {
> -        return;
> -    }
> -
> -    qemu_fprintf(f, "IN: PC=%x %s\n",
> -                 env->pc, lookup_symbol(env->pc));
> -    qemu_fprintf(f, "rmsr=%x resr=%x rear=%" PRIx64 " "
> -                 "imm=%x iflags=%x fsr=%x rbtr=%x\n",
> -                 env->msr, env->esr, env->ear,
> -                 env->imm, env->iflags, env->fsr, env->btr);
> -    qemu_fprintf(f, "btaken=%d btarget=%x mode=%s(saved=%s) eip=%d
> ie=%d\n",
> -                 env->btaken, env->btarget,
> +    qemu_fprintf(f, "pc=0x%08x msr=0x%05x mode=%s(saved=%s) eip=%d
> ie=%d\n",
> +                 env->pc, env->msr,
>                   (env->msr & MSR_UM) ? "user" : "kernel",
>                   (env->msr & MSR_UMS) ? "user" : "kernel",
>                   (bool)(env->msr & MSR_EIP),
>                   (bool)(env->msr & MSR_IE));
> -    for (i = 0; i < 12; i++) {
> -        qemu_fprintf(f, "rpvr%2.2d=%8.8x ", i, env->pvr.regs[i]);
> -        if ((i + 1) % 4 == 0) {
> -            qemu_fprintf(f, "\n");
> -        }
> +
> +    iflags = env->iflags;
> +    qemu_fprintf(f, "iflags: 0x%08x", iflags);
> +    if (iflags & IMM_FLAG) {
> +        qemu_fprintf(f, " IMM(0x%08x)", env->imm);
> +    }
> +    if (iflags & BIMM_FLAG) {
> +        qemu_fprintf(f, " BIMM");
> +    }
> +    if (iflags & D_FLAG) {
> +        qemu_fprintf(f, " D(btaken=%d btarget=0x%08x)",
> +                     env->btaken, env->btarget);
> +    }
> +    if (iflags & DRTI_FLAG) {
> +        qemu_fprintf(f, " DRTI");
> +    }
> +    if (iflags & DRTE_FLAG) {
> +        qemu_fprintf(f, " DRTE");
> +    }
> +    if (iflags & DRTB_FLAG) {
> +        qemu_fprintf(f, " DRTB");
> +    }
> +    if (iflags & ESR_ESS_FLAG) {
> +        qemu_fprintf(f, " ESR_ESS(0x%04x)", iflags & ESR_ESS_MASK);
> +    }
> +
> +    qemu_fprintf(f, "\nesr=0x%04x fsr=0x%02x btr=0x%08x edr=0x%x\n"
> +                 "ear=0x%016" PRIx64 " slr=0x%x shr=0x%x\n",
> +                 env->esr, env->fsr, env->btr, env->edr,
> +                 env->ear, env->slr, env->shr);
> +
> +    for (i = 0; i < 12; i++) {
> +        qemu_fprintf(f, "rpvr%-2d=%08x%c",
> +                     i, env->pvr.regs[i], i % 4 == 3 ? '\n' : ' ');
>      }
>
> -    /* Registers that aren't modeled are reported as 0 */
> -    qemu_fprintf(f, "redr=%x rpid=0 rzpr=0 rtlbx=0 rtlbsx=0 "
> -                    "rtlblo=0 rtlbhi=0\n", env->edr);
> -    qemu_fprintf(f, "slr=%x shr=%x\n", env->slr, env->shr);
>      for (i = 0; i < 32; i++) {
> -        qemu_fprintf(f, "r%2.2d=%8.8x ", i, env->regs[i]);
> -        if ((i + 1) % 4 == 0)
> -            qemu_fprintf(f, "\n");
> -        }
> -    qemu_fprintf(f, "\n\n");
> +        qemu_fprintf(f, "r%2.2d=%08x%c",
> +                     i, env->regs[i], i % 4 == 3 ? '\n' : ' ');
> +    }
> +    qemu_fprintf(f, "\n");
>  }
>
>  void mb_tcg_init(void)
> --
> 2.25.1
>
>
>
Richard Henderson Aug. 31, 2020, 10:16 p.m. UTC | #2
On 8/31/20 2:08 PM, Philippe Mathieu-Daudé wrote:
> Hi Richard, 
> 
> Le ven. 28 août 2020 16:46, Richard Henderson <richard.henderson@linaro.org
> <mailto:richard.henderson@linaro.org>> a écrit :
> 
>     Using lookup_symbol is quite slow; remove that.  Decode the
> 
> 
> Can we add some runtime option to enable its use instead?

We do the lookup with -d in_asm.
Do we really need it with -d cpu as well?

The -d cpu can be called many millions of times more than -d in_asm, and the
two are relatively easy to correlate.


r~
Philippe Mathieu-Daudé Aug. 31, 2020, 10:25 p.m. UTC | #3
Le mar. 1 sept. 2020 00:16, Richard Henderson <richard.henderson@linaro.org>
a écrit :

> On 8/31/20 2:08 PM, Philippe Mathieu-Daudé wrote:
> > Hi Richard,
> >
> > Le ven. 28 août 2020 16:46, Richard Henderson <
> richard.henderson@linaro.org
> > <mailto:richard.henderson@linaro.org>> a écrit :
> >
> >     Using lookup_symbol is quite slow; remove that.  Decode the
> >
> >
> > Can we add some runtime option to enable its use instead?
>
> We do the lookup with -d in_asm.
> Do we really need it with -d cpu as well?
>
> The -d cpu can be called many millions of times more than -d in_asm, and
> the
> two are relatively easy to correlate.
>

Ah I missed that. This is fine then!

Thanks,

Phil.


>
> r~
>
diff mbox series

Patch

diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
index 811c92d23b..3b63fd79e5 100644
--- a/target/microblaze/translate.c
+++ b/target/microblaze/translate.c
@@ -1818,41 +1818,56 @@  void mb_cpu_dump_state(CPUState *cs, FILE *f, int flags)
 {
     MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
     CPUMBState *env = &cpu->env;
+    uint32_t iflags;
     int i;
 
-    if (!env) {
-        return;
-    }
-
-    qemu_fprintf(f, "IN: PC=%x %s\n",
-                 env->pc, lookup_symbol(env->pc));
-    qemu_fprintf(f, "rmsr=%x resr=%x rear=%" PRIx64 " "
-                 "imm=%x iflags=%x fsr=%x rbtr=%x\n",
-                 env->msr, env->esr, env->ear,
-                 env->imm, env->iflags, env->fsr, env->btr);
-    qemu_fprintf(f, "btaken=%d btarget=%x mode=%s(saved=%s) eip=%d ie=%d\n",
-                 env->btaken, env->btarget,
+    qemu_fprintf(f, "pc=0x%08x msr=0x%05x mode=%s(saved=%s) eip=%d ie=%d\n",
+                 env->pc, env->msr,
                  (env->msr & MSR_UM) ? "user" : "kernel",
                  (env->msr & MSR_UMS) ? "user" : "kernel",
                  (bool)(env->msr & MSR_EIP),
                  (bool)(env->msr & MSR_IE));
-    for (i = 0; i < 12; i++) {
-        qemu_fprintf(f, "rpvr%2.2d=%8.8x ", i, env->pvr.regs[i]);
-        if ((i + 1) % 4 == 0) {
-            qemu_fprintf(f, "\n");
-        }
+
+    iflags = env->iflags;
+    qemu_fprintf(f, "iflags: 0x%08x", iflags);
+    if (iflags & IMM_FLAG) {
+        qemu_fprintf(f, " IMM(0x%08x)", env->imm);
+    }
+    if (iflags & BIMM_FLAG) {
+        qemu_fprintf(f, " BIMM");
+    }
+    if (iflags & D_FLAG) {
+        qemu_fprintf(f, " D(btaken=%d btarget=0x%08x)",
+                     env->btaken, env->btarget);
+    }
+    if (iflags & DRTI_FLAG) {
+        qemu_fprintf(f, " DRTI");
+    }
+    if (iflags & DRTE_FLAG) {
+        qemu_fprintf(f, " DRTE");
+    }
+    if (iflags & DRTB_FLAG) {
+        qemu_fprintf(f, " DRTB");
+    }
+    if (iflags & ESR_ESS_FLAG) {
+        qemu_fprintf(f, " ESR_ESS(0x%04x)", iflags & ESR_ESS_MASK);
+    }
+
+    qemu_fprintf(f, "\nesr=0x%04x fsr=0x%02x btr=0x%08x edr=0x%x\n"
+                 "ear=0x%016" PRIx64 " slr=0x%x shr=0x%x\n",
+                 env->esr, env->fsr, env->btr, env->edr,
+                 env->ear, env->slr, env->shr);
+
+    for (i = 0; i < 12; i++) {
+        qemu_fprintf(f, "rpvr%-2d=%08x%c",
+                     i, env->pvr.regs[i], i % 4 == 3 ? '\n' : ' ');
     }
 
-    /* Registers that aren't modeled are reported as 0 */
-    qemu_fprintf(f, "redr=%x rpid=0 rzpr=0 rtlbx=0 rtlbsx=0 "
-                    "rtlblo=0 rtlbhi=0\n", env->edr);
-    qemu_fprintf(f, "slr=%x shr=%x\n", env->slr, env->shr);
     for (i = 0; i < 32; i++) {
-        qemu_fprintf(f, "r%2.2d=%8.8x ", i, env->regs[i]);
-        if ((i + 1) % 4 == 0)
-            qemu_fprintf(f, "\n");
-        }
-    qemu_fprintf(f, "\n\n");
+        qemu_fprintf(f, "r%2.2d=%08x%c",
+                     i, env->regs[i], i % 4 == 3 ? '\n' : ' ');
+    }
+    qemu_fprintf(f, "\n");
 }
 
 void mb_tcg_init(void)