]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
x86/kexec: Use linker script for relocate_kernel page layout
authorDavid Woodhouse <dwmw@amazon.co.uk>
Fri, 8 Nov 2024 02:17:41 +0000 (02:17 +0000)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Fri, 8 Nov 2024 05:18:04 +0000 (05:18 +0000)
arch/x86/include/asm/sections.h
arch/x86/kernel/machine_kexec_64.c
arch/x86/kernel/relocate_kernel_64.S
arch/x86/kernel/vmlinux.lds.S

index 3fa87e5e11aba92e17737164894de5a299431d6d..30e8ee7006f9a7a43d07a4647b0e8cc087496b5f 100644 (file)
@@ -5,6 +5,7 @@
 #include <asm-generic/sections.h>
 #include <asm/extable.h>
 
+extern char __relocate_kernel_start[], __relocate_kernel_end[];
 extern char __brk_base[], __brk_limit[];
 extern char __end_rodata_aligned[];
 
index 9c9ac606893e9956ea91823e48d876a4660f7c30..f873bef6eefd978c78897c296a7820a857a0cce6 100644 (file)
@@ -156,7 +156,7 @@ static int init_transition_pgtable(struct kimage *image, pgd_t *pgd)
        pmd_t *pmd;
        pte_t *pte;
 
-       vaddr = (unsigned long)relocate_kernel;
+       vaddr = (unsigned long)__relocate_kernel_start;
        paddr = __pa(page_address(image->control_code_page)+PAGE_SIZE);
        pgd += pgd_index(vaddr);
        if (!pgd_present(*pgd)) {
@@ -321,6 +321,8 @@ void machine_kexec_cleanup(struct kimage *image)
  */
 void machine_kexec(struct kimage *image)
 {
+       unsigned long reloc_start = (unsigned long)__relocate_kernel_start;
+       unsigned long reloc_end = (unsigned long)__relocate_kernel_end;
        unsigned long page_list[PAGES_NR];
        unsigned int host_mem_enc_active;
        int save_ftrace_enabled;
@@ -358,7 +360,7 @@ void machine_kexec(struct kimage *image)
        }
 
        control_page = page_address(image->control_code_page) + PAGE_SIZE;
-       __memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE);
+       __memcpy(control_page, __relocate_kernel_start, reloc_end - reloc_start);
 
        page_list[PA_CONTROL_PAGE] = virt_to_phys(control_page);
        page_list[VA_CONTROL_PAGE] = (unsigned long)control_page;
index 2848d086ceb0fe4d2f289a3bff1e317109fcfad4..1efcbd340528693cf735ca89b97a10c319659e49 100644 (file)
 #define CP_PA_SWAP_PAGE                DATA(0x28)
 #define CP_PA_BACKUP_PAGES_MAP DATA(0x30)
 
-       .text
-       .align PAGE_SIZE
+       .section .text.relocate_kernel,"ax";
        .code64
-SYM_CODE_START_NOALIGN(relocate_range)
 SYM_CODE_START_NOALIGN(relocate_kernel)
        UNWIND_HINT_END_OF_STACK
        ANNOTATE_NOENDBR
@@ -332,5 +330,3 @@ SYM_CODE_START_LOCAL_NOALIGN(swap_pages)
        int3
 SYM_CODE_END(swap_pages)
 
-       .skip KEXEC_CONTROL_CODE_MAX_SIZE - (. - relocate_kernel), 0xcc
-SYM_CODE_END(relocate_range);
index b8c5741d2fb48017813060c977f4c31356168d5d..ad451371e1794ca2cc1fcfb724e26327c073723b 100644 (file)
@@ -95,7 +95,16 @@ const_pcpu_hot = pcpu_hot;
 #define BSS_DECRYPTED
 
 #endif
-
+#if defined(CONFIG_X86_64) && defined(CONFIG_KEXEC_CORE)
+#define KEXEC_RELOCATE_KERNEL_TEXT                             \
+       . = ALIGN(PAGE_SIZE);                                   \
+       __relocate_kernel_start = .;                            \
+       *(.text.relocate_kernel);                               \
+       *(.rodata.relocate_kernel);                             \
+       __relocate_kernel_end = .;
+#else
+#define KEXEC_RELOCATE_KERNEL_TEXT
+#endif
 PHDRS {
        text PT_LOAD FLAGS(5);          /* R_E */
        data PT_LOAD FLAGS(6);          /* RW_ */
@@ -124,6 +133,7 @@ SECTIONS
                /* bootstrapping code */
                HEAD_TEXT
                TEXT_TEXT
+               KEXEC_RELOCATE_KERNEL_TEXT
                SCHED_TEXT
                LOCK_TEXT
                KPROBES_TEXT