Thanks to kernel commit 9d372c9fab34 "arm64: Add page size to the kernel image header", we don't need a heuristic to determine the pagesize on arm64. Keep the heuristic for older kernels, but try reading the header first. --- arm64.c | 30 ++++++++++++++++++++++++++++++ defs.h | 1 + 2 files changed, 31 insertions(+) diff --git a/arm64.c b/arm64.c index 5f8e2f6852434..d85ad7214dd39 100644 --- a/arm64.c +++ b/arm64.c @@ -19,6 +19,7 @@ #include "defs.h" #include <elf.h> +#include <endian.h> #define NOT_IMPLEMENTED(X) error((X), "%s: function not implemented\n", __func__) @@ -97,6 +98,32 @@ arm64_init(int when) break; case PRE_GDB: + if (!machdep->pagesize) { + /* + * Kerneldoc Documentation/arm64/booting.txt describes + * the kernel image header flags field. + */ + value = machdep->machspec->kernel_flags; + value = (value >> 1) & 3; + + switch(value) + { + case 0: + break; + case 1: + machdep->pagesize = 4096; + break; + case 2: + /* TODO: machdep->pagesize = 16384; */ + error(FATAL, "16K pages not supported."); + break; + case 3: + machdep->pagesize = 65536; + break; + } + + } + if (!machdep->pagesize && kernel_symbol_exists("swapper_pg_dir") && kernel_symbol_exists("idmap_pg_dir")) { @@ -305,6 +332,9 @@ arm64_verify_symbol(const char *name, ulong value, char type) if (!name || !strlen(name)) return FALSE; + if (STREQ(name, "_kernel_flags_le")) + machdep->machspec->kernel_flags = le64toh(value); + if (((type == 'A') || (type == 'a')) && (highest_bit_long(value) != 63)) return FALSE; diff --git a/defs.h b/defs.h index 7004619017e41..3e5dbd99942b2 100644 --- a/defs.h +++ b/defs.h @@ -2944,6 +2944,7 @@ struct machine_specific { ulong crash_kexec_end; ulong crash_save_cpu_start; ulong crash_save_cpu_end; + ulong kernel_flags; }; struct arm64_stackframe { -- 2.4.3 -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility