[Crash-utility] Re: [RFC]Patch to accomodate cpu_pda changesin x86_64 kernels
Dave Anderson
anderson at redhat.com
Wed Feb 1 13:47:07 UTC 2006
Rachita Kothiyal wrote:
> On Tue, Jan 31, 2006 at 01:18:55PM -0500, Dave Anderson wrote:
> > Rachita, Badari,
> >
> > I think I agree about the unnecessary duplication of code in
> > x86_64_cpu_pda_init() and x86_64_get_smp_cpus().
>
> That's right Dave. It can be avoided.
>
> >
> > And while abstracting some of it out to CPU_PDA_READ() may be
> > desirable, keeping them separate may make future maintenance
> > and/or understandability of the differences may make it worth
> > keeping them separate. But I don't have a preference either way.
> >
> > However, upon further review, I don't see how this piece of the
> > patch can work for x86_64_display_cpu_data():
> >
> > so not only will it display bogus data when sent to dump_struct(),
> > the increment at the bottom of the loop would be wrong for the
> > _cpu_data array. If you just run "mach -c", the x8664_pda display
> > is bogus, right?
> >
> > It would just need get_symbol_data() to be run on the contents of
> > each entry in the _cpu_data[] array, and that value should be passed
> > to dump_struct(); and the increment at the bottom would just be the
> > size of a pointer.
>
> Do you mean something like this:
>
> @@ -2828,7 +2885,11 @@ x86_64_display_cpu_data(void)
> boot_cpu = TRUE;
> cpus = 1;
> }
> - cpu_pda = symbol_value("cpu_pda");
> + if (symbol_exists("_cpu_pda")) {
> + __cpu_pda = 1;
> + cpu_pda = symbol_value("_cpu_pda");
> + } else if (symbol_exists("cpu_pda"))
> + cpu_pda = symbol_value("cpu_pda");
>
> for (cpu = 0; cpu < cpus; cpu++) {
> if (boot_cpu)
> @@ -2838,10 +2899,18 @@ x86_64_display_cpu_data(void)
>
> dump_struct("cpuinfo_x86", cpu_data, 0);
> fprintf(fp, "\n");
> - dump_struct("x8664_pda", cpu_pda, 0);
> -
> +
> + if ( __cpu_pda == 1 ) {
> + cpu_pda_addr = 0;
> + readmem(cpu_pda, KVADDR, &cpu_pda_addr,
> + sizeof(unsigned long), "_cpu_pda addr", FAULT_ON_ERROR);
> + dump_struct("x8664_pda", cpu_pda_addr, 0);
> + cpu_pda += sizeof(unsigned long);
> + } else {
> + dump_struct("x8664_pda", cpu_pda, 0);
> + cpu_pda += SIZE(x8664_pda);
> + }
> cpu_data += SIZE(cpuinfo_x86);
> - cpu_pda += SIZE(x8664_pda);
> }
>
> Thanks
> Rachita
That should do it.
Minor nits: for clarity's sake, I'd make the local variable have the
same name as the kernel symbol it's representing (i.e. _cpu_data
instead of __cpu_data), just check it as a boolean instead of it
being == 1, and increment cpu_pda by sizeof(void *).
Thanks again for catching this,
Dave
More information about the Crash-utility
mailing list