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..9d03d1d54b574 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 ((type == 'A') && 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
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to