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