[Crash-utility] Re: [RFC]Patch to accomodate cpu_pda changesin x86_64 kernels

Rachita Kothiyal rachita at in.ibm.com
Wed Feb 1 11:37:55 UTC 2006


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 




More information about the Crash-utility mailing list