After kernel commit e2a073dde921 ("arm64: omit [_text, _stext) from
permanent kernel mapping"), the range [_text, _stext] is reclaimed. But
the current crash code still assumes kernel starting from "_text".

This change only affects the vmalloced area on arm64 and may result a
false in arm64_IS_VMALLOC_ADDR().

Since vmcore has no extra information about this trival change, it can
only be deduced from kernel version, which means ms->kimage_text can not
be correctly initialized until kernel_init() finishes. Here on arm64, it
can be done at the point machdep_init(POST_GDB). This is fine
since there is no access to vmalloced area at this stage.

Signed-off-by: Pingfan Liu <[email protected]>
---
 arm64.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/arm64.c b/arm64.c
index de1038a..3ab8489 100644
--- a/arm64.c
+++ b/arm64.c
@@ -92,6 +92,20 @@ static void arm64_calc_VA_BITS(void);
 static int arm64_is_uvaddr(ulong, struct task_context *);
 static void arm64_calc_KERNELPACMASK(void);
 
+static void arm64_calc_kernel_start(void)
+{
+       struct machine_specific *ms = machdep->machspec;
+       struct syment *sp;
+
+       if (THIS_KERNEL_VERSION >= LINUX(5,11,0))
+               sp = kernel_symbol_search("_stext");
+       else
+               sp = kernel_symbol_search("_text");
+
+       ms->kimage_text = (sp ? sp->value : 0);
+       sp = kernel_symbol_search("_end");
+       ms->kimage_end = (sp ? sp->value : 0);
+}
 
 /*
  * Do all necessary machine-specific setup here. This is called several times
@@ -241,6 +255,7 @@ arm64_init(int when)
                if (machdep->flags & NEW_VMEMMAP) {
                        struct syment *sp;
 
+                       /* It is finally decided in arm64_calc_kernel_start() */
                        sp = kernel_symbol_search("_text");
                        ms->kimage_text = (sp ? sp->value : 0);
                        sp = kernel_symbol_search("_end");
@@ -387,6 +402,8 @@ arm64_init(int when)
                break;
 
        case POST_GDB:
+               /* Rely on kernel version to decide the kernel start address */
+               arm64_calc_kernel_start();
                arm64_calc_virtual_memory_ranges();
                arm64_get_section_size_bits();
 
-- 
2.31.1

--
Crash-utility mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/crash-utility

Reply via email to