From: Youling Tang <youling.tang@linux.dev>
To: Simon Horman <horms@verge.net.au>
Cc: kexec@lists.infradead.org, Huacai Chen <chenhuacai@kernel.org>,
youling.tang@linux.dev, Youling Tang <tangyouling@kylinios.cn>
Subject: [PATCH 4/7] LoongArch: Enforce relocatable kernel check for crash dump
Date: Fri, 29 Aug 2025 17:10:37 +0800 [thread overview]
Message-ID: <20250829091040.35827-5-youling.tang@linux.dev> (raw)
In-Reply-To: <20250829091040.35827-1-youling.tang@linux.dev>
From: Youling Tang <tangyouling@kylinios.cn>
Without enabling the RELOCATABLE configuration, LoongArch is a non-PIE kernel
and cannot be loaded to run at any appropriate address. So the CRASH_DUMP
feature depends on RELOCATABLE.
$ cat arch/loongarch/Kconfig
config ARCH_SELECTS_CRASH_DUMP
def_bool y
depends on CRASH_DUMP
select RELOCATABLE
The relocatable kernel is determined by checking if there is a la_abs section.
Currently, only the elf format has been checked, while pei/pez is in the FIXME
state.
Signed-off-by: Youling Tang <tangyouling@kylinios.cn>
---
kexec/arch/loongarch/kexec-elf-loongarch.c | 32 ++++++++++++++++++++++
kexec/arch/loongarch/kexec-pei-loongarch.c | 3 ++
2 files changed, 35 insertions(+)
diff --git a/kexec/arch/loongarch/kexec-elf-loongarch.c b/kexec/arch/loongarch/kexec-elf-loongarch.c
index c87f022..44b63a9 100644
--- a/kexec/arch/loongarch/kexec-elf-loongarch.c
+++ b/kexec/arch/loongarch/kexec-elf-loongarch.c
@@ -13,6 +13,7 @@
#include <limits.h>
#include <errno.h>
#include <elf.h>
+#include <stdbool.h>
#include "kexec.h"
#include "kexec-elf.h"
@@ -47,6 +48,27 @@ out:
return result;
}
+/*
+ * To determine whether it is a relocatable kernel based on the ".la_abs "section,
+ * the CRASH_DUMP feature depends on CONFIG_RELOCATABLE in LoongArch.
+ */
+static bool laabs_section(const struct mem_ehdr *ehdr)
+{
+ struct mem_shdr *shdr, *shdr_end;
+ unsigned char *strtab;
+
+ strtab = (unsigned char *)ehdr->e_shdr[ehdr->e_shstrndx].sh_data;
+ shdr_end = &ehdr->e_shdr[ehdr->e_shnum];
+ for (shdr = ehdr->e_shdr; shdr != shdr_end; shdr++) {
+ if (shdr->sh_size &&
+ strcmp((char *)&strtab[shdr->sh_name], ".la_abs") == 0) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
int elf_loongarch_load(int argc, char **argv, const char *kernel_buf,
off_t kernel_size, struct kexec_info *info)
{
@@ -63,6 +85,16 @@ int elf_loongarch_load(int argc, char **argv, const char *kernel_buf,
goto exit;
}
+ if (info->kexec_flags & KEXEC_ON_CRASH) {
+ bool is_relocatable_kernel = laabs_section(&ehdr);
+ if (!is_relocatable_kernel) {
+ dbgprintf("%s: The non-relocation kernel cannot be loaded, "
+ "CONFIG_RELOCATABLE needs to be enabled\n", __func__);
+ result = EFAILED;
+ goto exit;
+ }
+ }
+
/* Find and process the loongarch image header. */
for (i = 0; i < ehdr.e_phnum; i++) {
struct mem_phdr *phdr = &ehdr.e_phdr[i];
diff --git a/kexec/arch/loongarch/kexec-pei-loongarch.c b/kexec/arch/loongarch/kexec-pei-loongarch.c
index f0e0d09..1a19a39 100644
--- a/kexec/arch/loongarch/kexec-pei-loongarch.c
+++ b/kexec/arch/loongarch/kexec-pei-loongarch.c
@@ -99,6 +99,9 @@ int pei_loongarch_load(int argc, char **argv, const char *buf,
}
}
+ /* Fixme: Loading a non-relocation kernel will cause the second kernel to fail
+ to start in KEXEC_ON_CRASH */
+
/* Load the kernel */
add_segment(info, buf, len, kernel_segment, loongarch_mem.image_size);
--
2.34.1
next prev parent reply other threads:[~2025-08-29 10:20 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-29 9:10 [PATCH 0/7] Fix and improve the LoongArch implementation Youling Tang
2025-08-29 9:10 ` [PATCH 1/7] kexec: Handle removal of multiple 'crashkernel' parameters Youling Tang
2025-08-29 9:10 ` [PATCH 2/7] LoongArch: Fix comments Youling Tang
2025-08-29 9:10 ` [PATCH 3/7] LoongArch: Terminate the cmdline string using '\0' Youling Tang
2025-08-29 9:10 ` Youling Tang [this message]
2025-08-29 9:10 ` [PATCH 5/7] LoongArch: Change initrd allocation to top-down Youling Tang
2025-08-29 9:10 ` [PATCH 6/7] LoongArch: Fix the use of loongarch_image_header in ELF format Youling Tang
2025-08-29 9:10 ` [PATCH 7/7] LoongArch: Add pe_hdr->machine check for pei format images Youling Tang
2025-08-29 9:19 ` [PATCH 0/7] Fix and improve the LoongArch implementation Youling Tang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250829091040.35827-5-youling.tang@linux.dev \
--to=youling.tang@linux.dev \
--cc=chenhuacai@kernel.org \
--cc=horms@verge.net.au \
--cc=kexec@lists.infradead.org \
--cc=tangyouling@kylinios.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.