Thanks to Dave's suggest, I impove the way to identify LPAE enabled kernel for arm platform, for compatibility with some old kernel. If a vmcore santisfy one of the following conditions, It must be generated by a LPAE enabled kernel. (1) it has CONFIG_ARM_LPAE=y vmcore_info (2) swapper_pg_dir and its next symbol value differ by 0x5000 Signed-off-by: Liu Hua <sdu.liu@xxxxxxxxxx> --- arm.c | 11 ++++++++++- symbols.c | 10 ++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/arm.c b/arm.c index cb7d841..76ba699 100644 --- a/arm.c +++ b/arm.c @@ -190,6 +190,8 @@ void arm_init(int when) { ulong vaddr; + char *string; + ulong difference; #if defined(__i386__) || defined(__x86_64__) if (ACTIVE()) @@ -229,8 +231,15 @@ arm_init(int when) * LPAE requires an additional page for the PGD, * so PG_DIR_SIZE = 0x5000 for LPAE */ - if ((symbol_value("_text") - symbol_value("swapper_pg_dir")) == 0x5000) + if ((string = pc->read_vmcoreinfo("CONFIG_ARM_LPAE"))) { machdep->flags |= PAE; + free(string); + } else { + difference = next_symbol_value("swapper_pg_dir", NULL) + - symbol_value("swapper_pg_dir"); + if (difference == 0x5000) + machdep->flags |= PAE; + } machdep->kvbase = symbol_value("_stext") & ~KVBASE_MASK; machdep->identity_map_base = machdep->kvbase; machdep->is_kvaddr = arm_is_kvaddr; diff --git a/symbols.c b/symbols.c index a0f256e..b294cd2 100644 --- a/symbols.c +++ b/symbols.c @@ -4936,6 +4936,16 @@ try_get_symbol_data(char *symbol, long size, void *local) return FALSE; } +ulong +next_symbol_value(char *symbol, struct syment *psb) +{ + struct syment *sp; + + if (!(sp = next_symbol(symbol, psb))) + error(FATAL, "cannot resolve \"%s\"\n", symbol); + return(sp->value); +} + /* * Return the value of a given symbol. */ -- 1.9.0 -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility