On Tue, 17 Dec 2024 at 00:37, David Woodhouse <dwmw2@xxxxxxxxxxxxx> wrote: > > From: David Woodhouse <dwmw@xxxxxxxxxxxx> > > 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 <dwmw@xxxxxxxxxxxx> > --- > 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); linkage is not part of the type. 'asmlinkage' is #define'd to the empty string today, so it doesn't matter, but better to omit it here. > #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 >