From: Song Shuai <suagrfillet@xxxxxxxxx> This patch adds KASLR support for Crash to analyze KASLR-ed vmcore since RISC-V Linux is already sufficiently prepared for KASLR [1]. With this patch, even if the Crash '--kaslr' option is not set or Linux CONFIG_RANDOMIZE_BASE is not configured, the 'derive_kaslr_offset()' function will always work to calculate 'kt->relocate' which serves to update the kernel virtual address. [1]: https://lore.kernel.org/linux-riscv/20230722123850.634544-1-alexghiti@xxxxxxxxxxxx/ Signed-off-by: Song Shuai <suagrfillet@xxxxxxxxx> --- main.c | 2 +- riscv64.c | 11 +++++++++++ symbols.c | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/main.c b/main.c index b278c22..0c6e595 100644 --- a/main.c +++ b/main.c @@ -228,7 +228,7 @@ main(int argc, char **argv) } else if (STREQ(long_options[option_index].name, "kaslr")) { if (!machine_type("X86_64") && !machine_type("ARM64") && !machine_type("X86") && - !machine_type("S390X")) + !machine_type("S390X") && !machine_type("RISCV64")) error(INFO, "--kaslr not valid " "with this machine type.\n"); else if (STREQ(optarg, "auto")) diff --git a/riscv64.c b/riscv64.c index a02f75a..288c7ae 100644 --- a/riscv64.c +++ b/riscv64.c @@ -378,6 +378,9 @@ static void riscv64_get_va_range(struct machine_specific *ms) } else goto error; + if ((kt->flags2 & KASLR) && (kt->flags & RELOC_SET)) + ms->kernel_link_addr += (kt->relocate * -1); + /* * From Linux 5.13, the kernel mapping is moved to the last 2GB * of the address space, modules use the 2GB memory range right @@ -1360,6 +1363,14 @@ riscv64_init(int when) machdep->verify_paddr = generic_verify_paddr; machdep->ptrs_per_pgd = PTRS_PER_PGD; + + /* + * Even if CONFIG_RANDOMIZE_BASE is not configured, + * derive_kaslr_offset() should work and set + * kt->relocate to 0 + */ + if (!kt->relocate && !(kt->flags2 & (RELOC_AUTO|KASLR))) + kt->flags2 |= (RELOC_AUTO|KASLR); break; case PRE_GDB: diff --git a/symbols.c b/symbols.c index 876be7a..8e8b4c3 100644 --- a/symbols.c +++ b/symbols.c @@ -629,7 +629,7 @@ kaslr_init(void) char *string; if ((!machine_type("X86_64") && !machine_type("ARM64") && !machine_type("X86") && - !machine_type("S390X")) || (kt->flags & RELOC_SET)) + !machine_type("S390X") && !machine_type("RISCV64")) || (kt->flags & RELOC_SET)) return; if (!kt->vmcoreinfo._stext_SYMBOL && @@ -795,7 +795,7 @@ store_symbols(bfd *abfd, int dynamic, void *minisyms, long symcount, } else if (!(kt->flags & RELOC_SET)) kt->flags |= RELOC_FORCE; } else if (machine_type("X86_64") || machine_type("ARM64") || - machine_type("S390X")) { + machine_type("S390X") || machine_type("RISCV64")) { if ((kt->flags2 & RELOC_AUTO) && !(kt->flags & RELOC_SET)) derive_kaslr_offset(abfd, dynamic, from, fromend, size, store); -- 2.20.1 _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec