Re: [PATCH V3 2/6] x86_32: use percpu instead of offset-calculation to get thread.sp0 when SWITCH_TO_KERNEL_STACK

From: Borislav Petkov
Date: Mon Feb 08 2021 - 15:38:42 EST


On Thu, Jan 28, 2021 at 12:32:18AM +0800, Lai Jiangshan wrote:
> From: Lai Jiangshan <laijs@xxxxxxxxxxxxxxxxx>
>
> TSS_entry2task_stack is used to refer to tss.sp1 which is stored the value
> of thread.sp0.

"... which is a copy of thread.sp0."

>
> At the code where TSS_entry2task_stack is used in SWITCH_TO_KERNEL_STACK,

"TSS_entry2task_stack is used in SWITCH_TO_KERNEL_STACK and CR3 is
already... "

> the CR3 is already kernel CR3 and kernel segments is loaded.
>
> So we can directly use the percpu to get tss.sp1(thread.sp0) instead of

Who's "we"?

> the complex offset-calculation.
>
> Signed-off-by: Lai Jiangshan <laijs@xxxxxxxxxxxxxxxxx>
> ---
> arch/x86/entry/entry_32.S | 9 ++-------
> 1 file changed, 2 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
> index df8c017e6161..3b4d1a63d1f0 100644
> --- a/arch/x86/entry/entry_32.S
> +++ b/arch/x86/entry/entry_32.S
> @@ -465,16 +465,11 @@
> cmpl $SIZEOF_entry_stack, %ecx
> jae .Lend_\@
>
> - /* Load stack pointer into %esi and %edi */
> + /* Load stack pointer into %esi */
> movl %esp, %esi
> - movl %esi, %edi
> -
> - /* Move %edi to the top of the entry stack */
> - andl $(MASK_entry_stack), %edi
> - addl $(SIZEOF_entry_stack), %edi
>
> /* Load top of task-stack into %edi */
> - movl TSS_entry2task_stack(%edi), %edi
> + movl PER_CPU_VAR(cpu_tss_rw + TSS_sp1), %edi
>
> /* Special case - entry from kernel mode via entry stack */
> #ifdef CONFIG_VM86
> --

The change itself looks ok.

Thx.

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette