Re: [PATCH 1/2] x86/cfi: Fix ret_from_fork indirect calls

From: Brian Gerst
Date: Wed Jun 21 2023 - 17:07:47 EST


On Thu, Jun 15, 2023 at 3:56 PM Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote:
>
> The ret_from_fork stub does an indirect call to the kthread function,
> but only knows about Retpolines. Instead of making the asm more
> complicated, punt to C and let the compiler figure it out.
>
> Specifically, this makes it a proper kCFI indirect call when needed (in
> fact, it is nearly impossible to code a kCFI indirect call in asm).
>
> This was the only callsite that was still calling func()+0 on regular
> indirect functions.
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
> ---
> arch/x86/entry/entry_64.S | 6 ++++--
> arch/x86/include/asm/switch_to.h | 2 ++
> arch/x86/kernel/process_64.c | 5 +++++
> 3 files changed, 11 insertions(+), 2 deletions(-)
>
> --- a/arch/x86/entry/entry_64.S
> +++ b/arch/x86/entry/entry_64.S
> @@ -304,8 +304,10 @@ SYM_CODE_START_NOALIGN(ret_from_fork)
> 1:
> /* kernel thread */
> UNWIND_HINT_END_OF_STACK
> - movq %r12, %rdi
> - CALL_NOSPEC rbx
> + movq %rbx, %rdi
> + movq %r12, %rsi
> + call kthread_from_fork
> +
> /*
> * A kernel thread is allowed to return here after successfully
> * calling kernel_execve(). Exit to userspace to complete the execve()
> --- a/arch/x86/include/asm/switch_to.h
> +++ b/arch/x86/include/asm/switch_to.h
> @@ -74,6 +74,8 @@ static inline void update_task_stack(str
> #endif
> }
>
> +extern void kthread_from_fork(int (*fn)(void *), void *);
> +
> static inline void kthread_frame_init(struct inactive_task_frame *frame,
> int (*fun)(void *), void *arg)
> {
> --- a/arch/x86/kernel/process_64.c
> +++ b/arch/x86/kernel/process_64.c
> @@ -544,6 +544,11 @@ void compat_start_thread(struct pt_regs
> }
> #endif
>
> +__visible noinstr void kthread_from_fork(int (*fn)(void *), void *arg)
> +{
> + fn(arg);
> +}
> +
> /*
> * switch_to(x,y) should switch tasks from x to y.
> *

I think this makes a case for converting all of ret_from_fork() to C
(other than some minimal asm glue). Patches coming soon.

Brian Gerst