From: David Woodhouse <d...@amazon.co.uk>

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.

Signed-off-by: David Woodhouse <d...@amazon.co.uk>
---
 arch/x86/include/asm/kexec.h       | 26 +++++++++++++-------------
 arch/x86/kernel/machine_kexec_32.c |  7 +------
 arch/x86/kernel/machine_kexec_64.c |  6 +-----
 3 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/arch/x86/include/asm/kexec.h b/arch/x86/include/asm/kexec.h
index 48e4f44f794f..8ad187462b68 100644
--- a/arch/x86/include/asm/kexec.h
+++ b/arch/x86/include/asm/kexec.h
@@ -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
diff --git a/arch/x86/kernel/machine_kexec_32.c 
b/arch/x86/kernel/machine_kexec_32.c
index 1b373d79cedc..80265162aeff 100644
--- a/arch/x86/kernel/machine_kexec_32.c
+++ b/arch/x86/kernel/machine_kexec_32.c
@@ -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)
diff --git a/arch/x86/kernel/machine_kexec_64.c 
b/arch/x86/kernel/machine_kexec_64.c
index 1440f792a86d..dd75a51463a2 100644
--- a/arch/x86/kernel/machine_kexec_64.c
+++ b/arch/x86/kernel/machine_kexec_64.c
@@ -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;
-- 
2.47.0


Reply via email to