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. This is fine
since there is no access to vmalloced area at this early stage.
Signed-off-by: Pingfan Liu <piliu(a)redhat.com>
---
arm64.c | 17 +++++++++++++++++
defs.h | 1 +
kernel.c | 3 +++
3 files changed, 21 insertions(+)
diff --git a/arm64.c b/arm64.c
index 4f2c2b5..4aa971c 100644
--- a/arm64.c
+++ b/arm64.c
@@ -92,6 +92,21 @@ static void arm64_calc_VA_BITS(void);
static int arm64_is_uvaddr(ulong, struct task_context *);
static void arm64_calc_KERNELPACMASK(void);
+/* called by kernel_init() */
+static void arm64_post_kernel_init(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
@@ -104,6 +119,7 @@ arm64_init(int when)
char *string;
struct machine_specific *ms;
+ arch_post_kernel_init = arm64_post_kernel_init;
#if defined(__x86_64__)
if (ACTIVE())
error(FATAL, "compiled for the ARM64 architecture\n");
@@ -241,6 +257,7 @@ arm64_init(int when)
if (machdep->flags & NEW_VMEMMAP) {
struct syment *sp;
+ /* It is finally decided in arm64_post_kernel_init() */
sp = kernel_symbol_search("_text");
ms->kimage_text = (sp ? sp->value : 0);
sp = kernel_symbol_search("_end");
diff --git a/defs.h b/defs.h
index 7d386d2..04ab55a 100644
--- a/defs.h
+++ b/defs.h
@@ -5677,6 +5677,7 @@ struct command_table_entry *crash_cmd_table(void);
/*
* kernel.c
*/
+extern void (*arch_post_kernel_init)(void);
void kernel_init(void);
void module_init(void);
void verify_version(void);
diff --git a/kernel.c b/kernel.c
index 9c4aabf..b64ffac 100644
--- a/kernel.c
+++ b/kernel.c
@@ -98,6 +98,7 @@ static char *vmcoreinfo_read_string(const char *);
static void check_vmcoreinfo(void);
static int is_pvops_xen(void);
+void (*arch_post_kernel_init)(void);
/*
* Gather a few kernel basics.
@@ -823,6 +824,8 @@ kernel_init()
source_tree_init();
kt->flags &= ~PRE_KERNEL_INIT;
+ if (arch_post_kernel_init)
+ arch_post_kernel_init();
}
/*
--
2.31.1