On 29.08.2012, at 04:03, François Revol <re...@free.fr> 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",