Re: [PATCH 9/9] x86/kexec: Use typedef for relocate_kernel_fn function prototype

From: David Woodhouse
Date: Tue Dec 17 2024 - 04:44:30 EST


On 17 December 2024 10:29:21 CET, Ard Biesheuvel <ardb@xxxxxxxxxx> wrote:
>On Tue, 17 Dec 2024 at 10:21, David Woodhouse <dwmw2@xxxxxxxxxxxxx> wrote:
>>
>> On 17 December 2024 09:49:04 CET, Ard Biesheuvel <ardb@xxxxxxxxxx> wrote:
>> >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.
>>
>> This is the i386 version. I thought ut was something like regparm(3) there?
>>
>> And... WTF? How is the calling convention not part of the fundamental type of the function? If I have a pointer to such a function, using this typedef to ensure we all share the same prototype, are you telling me all the users of the typedef have to remember to tag that part on for themselves?
>
>No. I am talking about linkage not the calling convention.

Hm, I am perfectly happy to believe that my memory is failing me, especially when it comes to specifics of i386 assembler code. But are you also telling me that
<https://kernelnewbies.org/FAQ/asmlinkage> is a lie?