Commit 7c61a3d8 authored by David Woodhouse's avatar David Woodhouse Committed by Borislav Petkov (AMD)
Browse files

x86/kexec: Use typedef for relocate_kernel_fn function prototype



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: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20250109140757.2841269-10-dwmw2@infradead.org
parent e5360575
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -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,
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,
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
+1 −6
Original line number Diff line number Diff line
@@ -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)
+2 −7
Original line number Diff line number Diff line
@@ -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