On Tue, 17 Dec 2024 at 10:42, David Woodhouse <dw...@infradead.org> wrote: > > On 17 December 2024 10:29:21 CET, Ard Biesheuvel <a...@kernel.org> wrote: > >On Tue, 17 Dec 2024 at 10:21, David Woodhouse <dw...@infradead.org> wrote: > >> > >> On 17 December 2024 09:49:04 CET, Ard Biesheuvel <a...@kernel.org> wrote: > >> >On Tue, 17 Dec 2024 at 00:37, David Woodhouse <dw...@infradead.org> wrote: > >> >> > >> >> 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); > >> > > >> >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? >
It seems wildly out of date, at least. Commit 96a388de5dc53a8b2 from 2007 removed the asmlinkage definition containing regparm(0) from include/asm-i386/linkage.h, and I'm not convinced it was ever sound to conflate linkage with calling convention like that. Today, asmlinkage evaluates to 'extern "C"' when using a C++ compiler, which is also not part of the type. However, I failed to notice that this just moves code around, and only applies to 32-bit in the first place. So I won't waste any more of your time obsessing over this.