----- "Michael Holzheu" <holzheu(a)linux.vnet.ibm.com> wrote:
Hi Dave,
I tested my patch and it worked. But it only worked by chance. I read
the address using readmem(cpu_mask_size) in combination with ULONG(),
which is nonsense.
So the correct (and tested) version would be something like:
static ulong
get_cpu_map_addr_from_mask(const char *type)
{
char cpu_mask_symbol[32];
ulong cpu_map_addr;
sprintf(cpu_mask_symbol, "cpu_%s_mask", type);
if (!symbol_exists(cpu_mask_symbol))
return 0;
get_symbol_data(cpu_mask_symbol, sizeof(ulong), &cpu_map_addr);
return cpu_map_addr;
}
OK good -- I'll probably just fold the above into cpu_map_addr().
Also, this change, although it doesn't break things, doesn't make
sense because this instance of "cpu_online_map" is a symbol in the
xen hypervisor binary, i.e., not the one in the vmlinux code:
--- crash-4.0-8.9.orig/xen_hyper.c
+++ crash-4.0-8.9/xen_hyper.c
@@ -1815,7 +1815,7 @@ xen_hyper_get_cpu_info(void)
error(FATAL, "cannot malloc cpumask space.\n");
}
/* kakuma: It may be better to use cpu_present_map. */
- addr = symbol_value("cpu_online_map");
+ addr = cpu_map_addr("online");
if (!readmem(addr, KVADDR, xht->cpumask,
XEN_HYPER_SIZE(cpumask_t), "cpu_online_map", RETURN_ON_ERROR))
{
error(FATAL, "cannot read cpu_online_map.\n");
Thanks,
Dave