From: Fangyu Yu <[email protected]>

When CONFIG_KEXEC_CORE is enabled, add a dedicated .kexec.tramp.text
area to the RISC-V kernel linker script.

Extend vmlinux.lds.S to:
  - align both the start and the end to PAGE_SIZE
  - define __kexec_tramp_text_start/__kexec_tramp_text_end
  - KEEP all .kexec.tramp.text* input sections
  - ASSERT the trampoline text fits within one page

The end-of-section page alignment guarantees that the trampoline page,
which is later identity-mapped as PAGE_KERNEL_EXEC, contains nothing but
the trampoline code and padding (no shared neighbour data).

When kexec is disabled, the whole block is excluded via #ifdef
CONFIG_KEXEC_CORE.

Signed-off-by: Fangyu Yu <[email protected]>
---
 arch/riscv/kernel/vmlinux.lds.S | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/arch/riscv/kernel/vmlinux.lds.S b/arch/riscv/kernel/vmlinux.lds.S
index 1f4f8496941a..bc615f7b702f 100644
--- a/arch/riscv/kernel/vmlinux.lds.S
+++ b/arch/riscv/kernel/vmlinux.lds.S
@@ -41,6 +41,16 @@ SECTIONS
                ENTRY_TEXT
                IRQENTRY_TEXT
                SOFTIRQENTRY_TEXT
+#ifdef CONFIG_KEXEC_CORE
+               . = ALIGN(PAGE_SIZE);
+               __kexec_tramp_text_start = .;
+               KEEP(*(.kexec.tramp.text))
+               KEEP(*(.kexec.tramp.text.*))
+               __kexec_tramp_text_end = .;
+               ASSERT((__kexec_tramp_text_end - __kexec_tramp_text_start) <= 
PAGE_SIZE,
+                      ".kexec.tramp.text exceeds PAGE_SIZE");
+               . = ALIGN(PAGE_SIZE);
+#endif
                _etext = .;
        }
 
-- 
2.50.1


Reply via email to