[Top][All Lists]
[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",