qemu-ppc
[Top][All Lists]
Advanced

[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



reply via email to

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