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