[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAMzpN2j2Okm1BPrQcrd7=Duo286RqZ-AKvy=NoJOBQ0sLJLhAw@mail.gmail.com>
Date: Wed, 21 Jun 2023 17:07:11 -0400
From: Brian Gerst <brgerst@...il.com>
To: Peter Zijlstra <peterz@...radead.org>
Cc: x86@...nel.org, alyssa.milburn@...ux.intel.com,
linux-kernel@...r.kernel.org, samitolvanen@...gle.com,
keescook@...omium.org, jpoimboe@...nel.org,
joao@...rdrivepizza.com, tim.c.chen@...ux.intel.com
Subject: Re: [PATCH 1/2] x86/cfi: Fix ret_from_fork indirect calls
On Thu, Jun 15, 2023 at 3:56 PM Peter Zijlstra <peterz@...radead.org> 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@...radead.org>
> ---
> 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
Powered by blists - more mailing lists