kernel/x86_64: remove lfence after swapgs on syscall entry and exit
in a syscall, swapgs is always executed and can't be speculatively executed or bypassed.
it's also not needed on exception/interrupt exit, only on exception/interrupt entry.
follow-up on commit 84f6e2d39f by waddlesplash
(https://github.com/freebsd/freebsd-src/commit/7aa47cace14948a7b8277a4b24a0ca9e0308990a)
Change-Id: I56de9526a1acd0075c4a12147ae782f0366dec52
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4557
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: Fredrik Holmqvist <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
@@ -152,7 +152,6 @@ FUNCTION_END(x86_64_syscall32_entry)
|
|||||||
// ecx - user esp
|
// ecx - user esp
|
||||||
FUNCTION(x86_64_sysenter32_entry):
|
FUNCTION(x86_64_sysenter32_entry):
|
||||||
swapgs
|
swapgs
|
||||||
lfence
|
|
||||||
|
|
||||||
// Set up an iframe on the stack (ECX = saved ESP).
|
// Set up an iframe on the stack (ECX = saved ESP).
|
||||||
push $USER_DATA_SELECTOR // ss
|
push $USER_DATA_SELECTOR // ss
|
||||||
@@ -315,7 +314,6 @@ FUNCTION(x86_64_sysenter32_entry):
|
|||||||
|
|
||||||
// Restore previous GS base and return.
|
// Restore previous GS base and return.
|
||||||
swapgs
|
swapgs
|
||||||
lfence
|
|
||||||
sti
|
sti
|
||||||
sysexit
|
sysexit
|
||||||
|
|
||||||
|
|||||||
@@ -328,7 +328,6 @@ STATIC_FUNCTION(int_bottom_user):
|
|||||||
|
|
||||||
// Restore the previous GS base and return.
|
// Restore the previous GS base and return.
|
||||||
swapgs
|
swapgs
|
||||||
lfence
|
|
||||||
iretq
|
iretq
|
||||||
|
|
||||||
.Lkernel_exit_work:
|
.Lkernel_exit_work:
|
||||||
@@ -362,7 +361,6 @@ STATIC_FUNCTION(int_bottom_user):
|
|||||||
|
|
||||||
// Restore the previous GS base and return.
|
// Restore the previous GS base and return.
|
||||||
swapgs
|
swapgs
|
||||||
lfence
|
|
||||||
iretq
|
iretq
|
||||||
|
|
||||||
.Lkernel_exit_handle_signals:
|
.Lkernel_exit_handle_signals:
|
||||||
@@ -382,7 +380,6 @@ FUNCTION(x86_64_syscall_entry):
|
|||||||
// scratch space to store the user stack pointer in before we can push it
|
// scratch space to store the user stack pointer in before we can push it
|
||||||
// to the stack.
|
// to the stack.
|
||||||
swapgs
|
swapgs
|
||||||
lfence
|
|
||||||
movq %rsp, %gs:ARCH_THREAD_user_rsp
|
movq %rsp, %gs:ARCH_THREAD_user_rsp
|
||||||
movq %gs:ARCH_THREAD_syscall_rsp, %rsp
|
movq %gs:ARCH_THREAD_syscall_rsp, %rsp
|
||||||
|
|
||||||
@@ -495,7 +492,6 @@ FUNCTION(x86_64_syscall_entry):
|
|||||||
|
|
||||||
// Restore previous GS base and return.
|
// Restore previous GS base and return.
|
||||||
swapgs
|
swapgs
|
||||||
lfence
|
|
||||||
sysretq
|
sysretq
|
||||||
|
|
||||||
.Lpre_syscall_debug:
|
.Lpre_syscall_debug:
|
||||||
@@ -574,7 +570,6 @@ FUNCTION(x86_64_syscall_entry):
|
|||||||
|
|
||||||
// Restore the previous GS base and return.
|
// Restore the previous GS base and return.
|
||||||
swapgs
|
swapgs
|
||||||
lfence
|
|
||||||
iretq
|
iretq
|
||||||
|
|
||||||
.Lpost_syscall_handle_signals:
|
.Lpost_syscall_handle_signals:
|
||||||
@@ -651,7 +646,6 @@ FUNCTION(x86_return_to_userland):
|
|||||||
// Restore the frame and return.
|
// Restore the frame and return.
|
||||||
RESTORE_IFRAME()
|
RESTORE_IFRAME()
|
||||||
swapgs
|
swapgs
|
||||||
lfence
|
|
||||||
iretq
|
iretq
|
||||||
.Luserland_return_work:
|
.Luserland_return_work:
|
||||||
// Slow path for return to userland.
|
// Slow path for return to userland.
|
||||||
@@ -676,7 +670,6 @@ FUNCTION(x86_return_to_userland):
|
|||||||
|
|
||||||
// Restore the previous GS base and return.
|
// Restore the previous GS base and return.
|
||||||
swapgs
|
swapgs
|
||||||
lfence
|
|
||||||
iretq
|
iretq
|
||||||
.Luserland_return_handle_signals:
|
.Luserland_return_handle_signals:
|
||||||
// thread_at_kernel_exit requires interrupts to be enabled, it will disable
|
// thread_at_kernel_exit requires interrupts to be enabled, it will disable
|
||||||
|
|||||||
Reference in New Issue
Block a user