]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/kexec: Use typedef for relocate_kernel_fn function prototype
authorDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 9 Jan 2025 14:04:21 +0000 (14:04 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Tue, 14 Jan 2025 12:09:08 +0000 (13:09 +0100)
Both i386 and x86_64 now copy the relocate_kernel() function into the control
page and execute it from there, using an open-coded function pointer.

Use a typedef for it instead.

  [ bp: Put relocate_kernel_ptr ptr arithmetic on a single line. ]

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20250109140757.2841269-10-dwmw2@infradead.org
arch/x86/include/asm/kexec.h
arch/x86/kernel/machine_kexec_32.c
arch/x86/kernel/machine_kexec_64.c

index 48e4f44f794f612edf246df96afbdd934b252e97..8ad187462b68e59dec405280ffd5518543a25c9e 100644 (file)
@@ -111,21 +111,21 @@ static inline void crash_setup_regs(struct pt_regs *newregs,
 }
 
 #ifdef CONFIG_X86_32
-asmlinkage unsigned long
-relocate_kernel(unsigned long indirection_page,
-               unsigned long control_page,
-               unsigned long start_address,
-               unsigned int has_pae,
-               unsigned int preserve_context);
+typedef asmlinkage unsigned long
+relocate_kernel_fn(unsigned long indirection_page,
+                  unsigned long control_page,
+                  unsigned long start_address,
+                  unsigned int has_pae,
+                  unsigned int preserve_context);
 #else
-unsigned long
-relocate_kernel(unsigned long indirection_page,
-               unsigned long pa_control_page,
-               unsigned long start_address,
-               unsigned int preserve_context,
-               unsigned int host_mem_enc_active);
+typedef unsigned long
+relocate_kernel_fn(unsigned long indirection_page,
+                  unsigned long pa_control_page,
+                  unsigned long start_address,
+                  unsigned int preserve_context,
+                  unsigned int host_mem_enc_active);
 #endif
-
+extern relocate_kernel_fn relocate_kernel;
 #define ARCH_HAS_KIMAGE_ARCH
 
 #ifdef CONFIG_X86_32
index 1b373d79cedc4fa261fa017496cd4faadcd2e1b1..80265162aefff9bd7c588f0d097adfe354de681f 100644 (file)
@@ -160,15 +160,10 @@ void machine_kexec_cleanup(struct kimage *image)
  */
 void machine_kexec(struct kimage *image)
 {
+       relocate_kernel_fn *relocate_kernel_ptr;
        unsigned long page_list[PAGES_NR];
        void *control_page;
        int save_ftrace_enabled;
-       asmlinkage unsigned long
-               (*relocate_kernel_ptr)(unsigned long indirection_page,
-                                      unsigned long control_page,
-                                      unsigned long start_address,
-                                      unsigned int has_pae,
-                                      unsigned int preserve_context);
 
 #ifdef CONFIG_KEXEC_JUMP
        if (image->preserve_context)
index 1440f792a86dc3e6f32ae257cf40fda7eecbdc30..a68f5a0a9f3708d0d3c9da8beb486b20437dddca 100644 (file)
@@ -344,12 +344,8 @@ void machine_kexec_cleanup(struct kimage *image)
  */
 void __nocfi machine_kexec(struct kimage *image)
 {
-       unsigned long (*relocate_kernel_ptr)(unsigned long indirection_page,
-                                            unsigned long pa_control_page,
-                                            unsigned long start_address,
-                                            unsigned int preserve_context,
-                                            unsigned int host_mem_enc_active);
        unsigned long reloc_start = (unsigned long)__relocate_kernel_start;
+       relocate_kernel_fn *relocate_kernel_ptr;
        unsigned int host_mem_enc_active;
        int save_ftrace_enabled;
        void *control_page;
@@ -391,8 +387,7 @@ void __nocfi machine_kexec(struct kimage *image)
         * Allow for the possibility that relocate_kernel might not be at
         * the very start of the page.
         */
-       relocate_kernel_ptr = control_page + (unsigned long)relocate_kernel -
-               reloc_start;
+       relocate_kernel_ptr = control_page + (unsigned long)relocate_kernel - reloc_start;
 
        /*
         * The segment registers are funny things, they have both a