qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] [RFC] PPC: dump DCRs from monitor


From: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH] [RFC] PPC: dump DCRs from monitor
Date: Wed, 29 Aug 2012 07:53:42 -0700


On 29.08.2012, at 04:03, François Revol <address@hidden> wrote:

> Hi,
> I noticed the DCRs weren't shown with the registers or another command,
> and tried to add one to dump them to help debugging my sam460ex target.
> This first version doesn't list the names since they aren't registered
> as such.
> I tried adding a name arg to ppc_dcr_register, and a #define to get it
> from the index, but it seems some code uses a loop to register them, so
> it gives a dump like:
> DCR[SDRAM0_CFGDATA 11]    00000000
> DCR[dcr_base + i c0]    00000000
> DCR[dcr_base + i c1]    00000000
> Any suggestion?
> BTW, they aren't saved in state dumps, are they?

Are they accessible through the monitor's p command? Would be good to implement 
there too if not.

Alex

> 
> François.
> 
> diff --git a/cpu-all.h b/cpu-all.h
> index 5e07d28..a34ae25 100644
> --- a/cpu-all.h
> +++ b/cpu-all.h
> @@ -372,6 +372,8 @@ void cpu_dump_state(CPUArchState *env, FILE *f,
> fprintf_function cpu_fprintf,
>                     int flags);
> void cpu_dump_statistics(CPUArchState *env, FILE *f, fprintf_function
> cpu_fprintf,
>                          int flags);
> +void ppc_dump_dcr(CPUArchState *env, FILE *f, fprintf_function cpu_fprintf,
> +                  int flags);
> 
> void QEMU_NORETURN cpu_abort(CPUArchState *env, const char *fmt, ...)
>     GCC_FMT_ATTR(2, 3);
> diff --git a/hw/ppc.c b/hw/ppc.c
> index 98546de..74b82b7 100644
> --- a/hw/ppc.c
> +++ b/hw/ppc.c
> @@ -1120,6 +1120,27 @@ int ppc_dcr_init (CPUPPCState *env, int
> (*read_error)(int dcrn),
>     return 0;
> }
> 
> +void ppc_dump_dcr (CPUPPCState *env, FILE*f, fprintf_function cpu_fprintf,
> +                   int flags)
> +{
> +    ppc_dcr_t *dcr_env;
> +    ppc_dcrn_t *dcr;
> +    int dcrn;
> +
> +    dcr_env = env->dcr_env;
> +    if (dcr_env == NULL)
> +        return;
> +
> +    for (dcrn = 0; dcrn < DCRN_NB; dcrn++) {
> +        dcr = &dcr_env->dcrn[dcrn];
> +        if (dcr->dcr_read == NULL)
> +            continue;
> +
> +        cpu_fprintf(f, "DCR[%02x] %08x\n", dcrn,
> +                    dcr->dcr_read(dcr->opaque, dcrn));
> +    }
> +}
> +
> /*****************************************************************************/
> /* Debug port */
> void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val)
> diff --git a/monitor.c b/monitor.c
> index b17b1bb..b7a2a4b 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -936,6 +936,14 @@ static void do_info_cpu_stats(Monitor *mon)
>     env = mon_get_cpu();
>     cpu_dump_statistics(env, (FILE *)mon, &monitor_fprintf, 0);
> }
> +
> +static void do_info_dcr(Monitor *mon)
> +{
> +    CPUArchState *env;
> +
> +    env = mon_get_cpu();
> +    ppc_dump_dcr(env, (FILE*)mon, (fprintf_function)monitor_printf, 0);
> +}
> #endif
> 
> static void do_trace_print_events(Monitor *mon)
> @@ -2768,6 +2776,15 @@ static mon_cmd_t info_cmds[] = {
>         .mhandler.info = tlb_info,
>     },
> #endif
> +#if defined(TARGET_PPC)
> +    {
> +        .name       = "dcr",
> +        .args_type  = "",
> +        .params     = "",
> +        .help       = "show device control registers",
> +        .mhandler.info = do_info_dcr,
> +    },
> +#endif
> #if defined(TARGET_I386)
>     {
>         .name       = "mem",



reply via email to

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