[PATCH V4 2/6] x86/entry/32: Use percpu instead of offset-calculation to get thread.sp0 in SWITCH_TO_KERNEL_STACK

From: Lai Jiangshan
Date: Wed Feb 10 2021 - 07:43:01 EST


From: Lai Jiangshan <laijs@xxxxxxxxxxxxxxxxx>

TSS_entry2task_stack is used to refer to tss.sp1 which is a copy of
thread.sp0.

When TSS_entry2task_stack is used in SWITCH_TO_KERNEL_STACK, the CR3 is
already kernel CR3 and the kernel segments are loaded.

So it directly uses percpu to get tss.sp1(thread.sp0) instead of
the complicated offset-calculation via TSS_entry2task_stack.

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
--
2.19.1.6.gb485710b