[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [Qemu-devel] [PATCH v2] target-ppc: improve "info registe
From: |
Alexey Kardashevskiy |
Subject: |
Re: [Qemu-ppc] [Qemu-devel] [PATCH v2] target-ppc: improve "info registers" by printing SPRs |
Date: |
Mon, 31 Mar 2014 12:25:27 +1100 |
User-agent: |
Mozilla/5.0 (X11; Linux i686 on x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 |
On 03/24/2014 05:24 PM, Alexey Kardashevskiy wrote:
> On 03/23/2014 01:43 AM, Stuart Brady wrote:
>> On Sat, Mar 22, 2014 at 11:25:49PM +1100, Alexey Kardashevskiy wrote:
>>> This adds printing of all SPR registers registered for a CPU.
>>>
>>> This removes "SPR_" prefix from SPR name to reduce the output.
>>>
>>> Cc: Fabien Chouteau <address@hidden>
>>> Signed-off-by: Alexey Kardashevskiy <address@hidden>
>>> ---
>>> Changes:
>>> v2:
>>> * removed "switch (env->mmu_model)"
>>> * added "\n" if the last line has less than 4 registers
>>> ---
>>> target-ppc/translate.c | 96
>>> +++++++--------------------------------------
>>> target-ppc/translate_init.c | 40 +++++++++----------
>>> 2 files changed, 35 insertions(+), 101 deletions(-)
>>>
>>> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
>>> index e3fcb03..06f195a 100644
>>> --- a/target-ppc/translate.c
>>> +++ b/target-ppc/translate.c
>>> @@ -11116,7 +11116,7 @@ void ppc_cpu_dump_state(CPUState *cs, FILE *f,
>>> fprintf_function cpu_fprintf,
>>>
>>> PowerPCCPU *cpu = POWERPC_CPU(cs);
>>> CPUPPCState *env = &cpu->env;
>>> - int i;
>>> + int i, j;
>>>
>>> cpu_fprintf(f, "NIP " TARGET_FMT_lx " LR " TARGET_FMT_lx " CTR "
>>> TARGET_FMT_lx " XER " TARGET_FMT_lx "\n",
>>> @@ -11167,54 +11167,22 @@ void ppc_cpu_dump_state(CPUState *cs, FILE *f,
>>> fprintf_function cpu_fprintf,
>>> cpu_fprintf(f, "\n");
>>> }
>>> cpu_fprintf(f, "FPSCR " TARGET_FMT_lx "\n", env->fpscr);
>>> -#if !defined(CONFIG_USER_ONLY)
>>> - cpu_fprintf(f, " SRR0 " TARGET_FMT_lx " SRR1 " TARGET_FMT_lx
>>> - " PVR " TARGET_FMT_lx " VRSAVE " TARGET_FMT_lx "\n",
>>> - env->spr[SPR_SRR0], env->spr[SPR_SRR1],
>>> - env->spr[SPR_PVR], env->spr[SPR_VRSAVE]);
>>>
>>> - cpu_fprintf(f, "SPRG0 " TARGET_FMT_lx " SPRG1 " TARGET_FMT_lx
>>> - " SPRG2 " TARGET_FMT_lx " SPRG3 " TARGET_FMT_lx "\n",
>>> - env->spr[SPR_SPRG0], env->spr[SPR_SPRG1],
>>> - env->spr[SPR_SPRG2], env->spr[SPR_SPRG3]);
>>> -
>>> - cpu_fprintf(f, "SPRG4 " TARGET_FMT_lx " SPRG5 " TARGET_FMT_lx
>>> - " SPRG6 " TARGET_FMT_lx " SPRG7 " TARGET_FMT_lx "\n",
>>> - env->spr[SPR_SPRG4], env->spr[SPR_SPRG5],
>>> - env->spr[SPR_SPRG6], env->spr[SPR_SPRG7]);
>>> -
>>> - if (env->excp_model == POWERPC_EXCP_BOOKE) {
>>> - cpu_fprintf(f, "CSRR0 " TARGET_FMT_lx " CSRR1 " TARGET_FMT_lx
>>> - " MCSRR0 " TARGET_FMT_lx " MCSRR1 " TARGET_FMT_lx
>>> "\n",
>>> - env->spr[SPR_BOOKE_CSRR0], env->spr[SPR_BOOKE_CSRR1],
>>> - env->spr[SPR_BOOKE_MCSRR0],
>>> env->spr[SPR_BOOKE_MCSRR1]);
>>> -
>>> - cpu_fprintf(f, " TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx
>>> - " ESR " TARGET_FMT_lx " DEAR " TARGET_FMT_lx
>>> "\n",
>>> - env->spr[SPR_BOOKE_TCR], env->spr[SPR_BOOKE_TSR],
>>> - env->spr[SPR_BOOKE_ESR], env->spr[SPR_BOOKE_DEAR]);
>>> -
>>> - cpu_fprintf(f, " PIR " TARGET_FMT_lx " DECAR " TARGET_FMT_lx
>>> - " IVPR " TARGET_FMT_lx " EPCR " TARGET_FMT_lx
>>> "\n",
>>> - env->spr[SPR_BOOKE_PIR], env->spr[SPR_BOOKE_DECAR],
>>> - env->spr[SPR_BOOKE_IVPR], env->spr[SPR_BOOKE_EPCR]);
>>> -
>>> - cpu_fprintf(f, " MCSR " TARGET_FMT_lx " SPRG8 " TARGET_FMT_lx
>>> - " EPR " TARGET_FMT_lx "\n",
>>> - env->spr[SPR_BOOKE_MCSR], env->spr[SPR_BOOKE_SPRG8],
>>> - env->spr[SPR_BOOKE_EPR]);
>>> -
>>> - /* FSL-specific */
>>> - cpu_fprintf(f, " MCAR " TARGET_FMT_lx " PID1 " TARGET_FMT_lx
>>> - " PID2 " TARGET_FMT_lx " SVR " TARGET_FMT_lx
>>> "\n",
>>> - env->spr[SPR_Exxx_MCAR], env->spr[SPR_BOOKE_PID1],
>>> - env->spr[SPR_BOOKE_PID2], env->spr[SPR_E500_SVR]);
>>> -
>>> - /*
>>> - * IVORs are left out as they are large and do not change often --
>>> - * they can be read with "p $ivor0", "p $ivor1", etc.
>>> - */
>>> + for (i = 0, j = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
>>> + ppc_spr_t *spr = &env->spr_cb[i];
>>> +
>>> + if (!spr->name) {
>>> + continue;
>>> + }
>>
>> This would leave the output without a trailing newline if the last spr
>> doesn't have a name registered. Is it necessary to handle unnamed sprs
>> at all (maybe add an assert to the registration function)? ... or would
>> we just want to warn about them here?
>
>
> In the current QEMU I do not see any place where SPR would be registered
> without a name so I would not bother.
>
>
>> FWIW, my approach is often to write an outer loop that process one item
>> of output at a time, with an inner loop to obtain the next item of data,
>> and with prefixing of separators, as you then have a far simpler special
>> case for 'j == 0' instead of 'i == ARRAY_SIZE(env->spr_cb) - 1'. You can
>> then unconditionally finish on a '\n'.
>
> Oh. This is embarrassing, sorry :( This should do it, right? :)
>
> + for (i = 0, j = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
> + ppc_spr_t *spr = &env->spr_cb[i];
> +
> + if (!spr->name) {
> + continue;
> + }
> + if (j % 4) {
> + cpu_fprintf(f, " ");
> + } else if (j) {
> + cpu_fprintf(f, "\n");
> + }
> + cpu_fprintf(f, "%-6s " TARGET_FMT_lx, spr->name, env->spr[i]);
> + j++;
> }
> + cpu_fprintf(f, "\n");
>
>
>
> btw while grepping through the code, I found dump_ppc_sprs() which prints
> this (first chunk is what my patch adds and the second chunk is from
> dump_ppc_sprs()):
Noone has an opinion? Come on! :)
>
> XER 0000000000000000 LR 0000000000000000 CTR 0000000000000000
> UAMR 0000000000000000
> DSCR 0000000000000000 DSISR 0000000000000000 DAR 0000000000000000
> DECR 0000000000000000
> SDR1 0000000000000005 SRR0 0000000000000000 SRR1 0000000000000000
> CFAR 0000000000000000
> AMR 0000000000000000 CTRLF 0000000080800000 CTRLT 0000000080800000
> UAMOR 0000000000000000
> VRSAVE 0000000000000000 TBL 0000000000000000 TBU 0000000000000000
> SPRG0 0000000000000000
> SPRG1 0000000000000000 SPRG2 0000000000000000 SPRG3 0000000000000000 EAR
> 0000000000000000
> TBL 0000000000000000 TBU 0000000000000000 PVR 00000000003f0201
> SPURR 0000000000000000
> PURR 0000000000000000 LPCR 0000000000007005 MMCRA 0000000000000000 PPR
> 0000000000000000
> UMMCR0 0000000000000000 UPMC1 0000000000000000 UPMC2 0000000000000000
> USIAR 0000000000000000
> UMMCR1 0000000000000000 UPMC3 0000000000000000 UPMC4 0000000000000000
> PMC5 0000000000000000
> PMC6 0000000000000000 MMCR0 0000000000000000 PMC1 0000000000000000
> PMC2 0000000000000000
> SIAR 0000000000000000 MMCR1 0000000000000000 PMC3 0000000000000000
> PMC4 0000000000000000
> IABR 0000000000000000 DABR 0000000000000000 ICTC 0000000000000000 PIR
> 0000000000000000
>
>
>
>
>
> Special purpose registers:
> SPR: 1 (001) XER swr uwr
> SPR: 8 (008) LR swr uwr
> SPR: 9 (009) CTR swr uwr
> SPR: 12 (00c) UAMR swr uwr
> SPR: 17 (011) DSCR swr u--
> SPR: 18 (012) DSISR swr u--
> SPR: 19 (013) DAR swr u--
> SPR: 22 (016) DECR swr u--
> SPR: 25 (019) SDR1 swr u--
> SPR: 26 (01a) SRR0 swr u--
> SPR: 27 (01b) SRR1 swr u--
> SPR: 28 (01c) CFAR swr u--
> SPR: 29 (01d) AMR swr u--
> SPR: 136 (088) CTRLF s-r u--
> SPR: 152 (098) CTRLT sw- u--
> SPR: 157 (09d) UAMOR swr u--
> SPR: 256 (100) VRSAVE swr uwr
> SPR: 268 (10c) TBL s-r u-r
> SPR: 269 (10d) TBU s-r u-r
> SPR: 272 (110) SPRG0 swr u--
> SPR: 273 (111) SPRG1 swr u--
> SPR: 274 (112) SPRG2 swr u--
> SPR: 275 (113) SPRG3 swr u--
> SPR: 282 (11a) EAR swr u--
> SPR: 284 (11c) TBL swr u-r
> SPR: 285 (11d) TBU swr u-r
> SPR: 287 (11f) PVR s-r u--
> SPR: 308 (134) SPURR s-r u-r
> SPR: 309 (135) PURR s-r u-r
> SPR: 318 (13e) LPCR swr u--
> SPR: 770 (302) MMCRA swr u--
> SPR: 896 (380) PPR swr uwr
> SPR: 936 (3a8) UMMCR0 s-r u-r
> SPR: 937 (3a9) UPMC1 s-r u-r
> SPR: 938 (3aa) UPMC2 s-r u-r
> SPR: 939 (3ab) USIAR s-r u-r
> SPR: 940 (3ac) UMMCR1 s-r u-r
> SPR: 941 (3ad) UPMC3 s-r u-r
> SPR: 942 (3ae) UPMC4 s-r u-r
> SPR: 945 (3b1) PMC5 swr u--
> SPR: 946 (3b2) PMC6 swr u--
> SPR: 952 (3b8) MMCR0 swr u--
> SPR: 953 (3b9) PMC1 swr u--
> SPR: 954 (3ba) PMC2 swr u--
> SPR: 955 (3bb) SIAR s-r u--
> SPR: 956 (3bc) MMCR1 swr u--
> SPR: 957 (3bd) PMC3 swr u--
> SPR: 958 (3be) PMC4 swr u--
> SPR: 1010 (3f2) IABR swr u--
> SPR: 1013 (3f5) DABR swr u--
> SPR: 1019 (3fb) ICTC swr u--
> SPR: 1023 (3ff) PIR swr u--
>
>
> Which is nicer/more useful?
> The characters at the end tell what handler (read/write, oea/uea) is
> defined for SPR.
>
>
--
Alexey