The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=0f44d9df994b398ba4591141559da6db18fff557
commit 0f44d9df994b398ba4591141559da6db18fff557 Author: Konstantin Belousov <k...@freebsd.org> AuthorDate: 2025-05-19 01:30:14 +0000 Commit: Konstantin Belousov <k...@freebsd.org> CommitDate: 2025-06-12 18:02:49 +0000 amd64: do not handle fs/gs bases conditionally on the selector (cherry picked from commit ddab534cd6f6557740c24ff2019642880ad8bef6) --- sys/amd64/amd64/cpu_switch.S | 6 ------ sys/amd64/amd64/exception.S | 29 ----------------------------- sys/amd64/amd64/machdep.c | 6 ++---- sys/amd64/ia32/ia32_exception.S | 3 +-- 4 files changed, 3 insertions(+), 41 deletions(-) diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S index 2a3eced01ab3..2a829c7507ea 100644 --- a/sys/amd64/amd64/cpu_switch.S +++ b/sys/amd64/amd64/cpu_switch.S @@ -91,14 +91,8 @@ ENTRY(cpu_switch) jnz 2f testb $CPUID_STDEXT_FSGSBASE,cpu_stdext_feature(%rip) jz 2f - movl %fs,%eax - cmpl $KUF32SEL,%eax - jne 1f rdfsbase %rax movq %rax,PCB_FSBASE(%r8) -1: movl %gs,%eax - cmpl $KUG32SEL,%eax - jne 2f movq %rdx,%r12 movl $MSR_KGSBASE,%ecx /* Read user gs base */ rdmsr diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 90f7a88f5d52..797b2fe748f3 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -479,22 +479,14 @@ prot_addrf: jz 6f /* already running with kernel GS.base */ testb $CPUID_STDEXT_FSGSBASE,cpu_stdext_feature(%rip) jz 2f - cmpw $KUF32SEL,TF_FS(%rsp) - jne 1f rdfsbase %rax -1: cmpw $KUG32SEL,TF_GS(%rsp) - jne 2f rdgsbase %rdx 2: swapgs lfence movq PCPU(CURPCB),%rdi testb $CPUID_STDEXT_FSGSBASE,cpu_stdext_feature(%rip) jz 4f - cmpw $KUF32SEL,TF_FS(%rsp) - jne 3f movq %rax,PCB_FSBASE(%rdi) -3: cmpw $KUG32SEL,TF_GS(%rsp) - jne 4f movq %rdx,PCB_GSBASE(%rdi) orl $PCB_FULL_IRET,PCB_FLAGS(%rdi) /* full iret from user #gp */ 4: call handle_ibrs_entry @@ -730,12 +722,8 @@ dbg_fromuserspace: orl $PCB_FULL_IRET,PCB_FLAGS(%rdi) testb $CPUID_STDEXT_FSGSBASE,cpu_stdext_feature(%rip) jz 3f - cmpw $KUF32SEL,TF_FS(%rsp) - jne 2f rdfsbase %rax movq %rax,PCB_FSBASE(%rdi) -2: cmpw $KUG32SEL,TF_GS(%rsp) - jne 3f movl $MSR_KGSBASE,%ecx rdmsr shlq $32,%rdx @@ -842,12 +830,8 @@ nmi_fromuserspace: orl $PCB_FULL_IRET,PCB_FLAGS(%rdi) testb $CPUID_STDEXT_FSGSBASE,cpu_stdext_feature(%rip) jz 3f - cmpw $KUF32SEL,TF_FS(%rsp) - jne 2f rdfsbase %rax movq %rax,PCB_FSBASE(%rdi) -2: cmpw $KUG32SEL,TF_GS(%rsp) - jne 3f movl $MSR_KGSBASE,%ecx rdmsr shlq $32,%rdx @@ -1177,15 +1161,12 @@ do_segs: .globl ld_fs ld_fs: movw %ax,%fs - cmpw $KUF32SEL,%ax - jne 1f movl $MSR_FSBASE,%ecx movl PCB_FSBASE(%r8),%eax movl PCB_FSBASE+4(%r8),%edx .globl ld_fsbase ld_fsbase: wrmsr -1: /* Restore %gs and gsbase */ movw TF_GS(%rsp),%si pushfq @@ -1198,10 +1179,6 @@ ld_fsbase: .globl ld_gs ld_gs: movw %si,%gs - /* Save user %gs base into %r14d:%r15d */ - rdmsr - movl %eax,%r14d - movl %edx,%r15d /* Restore kernel %gs base */ movl %r12d,%eax movl %r13d,%edx @@ -1212,14 +1189,8 @@ ld_gs: * from the previously saved msr read. */ movl $MSR_KGSBASE,%ecx - cmpw $KUG32SEL,%si - jne 1f movl PCB_GSBASE(%r8),%eax movl PCB_GSBASE+4(%r8),%edx - jmp ld_gsbase -1: - movl %r14d,%eax - movl %r15d,%edx .globl ld_gsbase ld_gsbase: wrmsr /* May trap if non-canonical, but only for TLS. */ diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index ea0f164b2e56..e4109b0ff791 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -1786,10 +1786,8 @@ set_pcb_flags_fsgsbase(struct pcb *pcb, const u_int flags) (pcb->pcb_flags & PCB_FULL_IRET) == 0) { r = intr_disable(); if ((pcb->pcb_flags & PCB_FULL_IRET) == 0) { - if (rfs() == _ufssel) - pcb->pcb_fsbase = rdfsbase(); - if (rgs() == _ugssel) - pcb->pcb_gsbase = rdmsr(MSR_KGSBASE); + pcb->pcb_fsbase = rdfsbase(); + pcb->pcb_gsbase = rdmsr(MSR_KGSBASE); } set_pcb_flags_raw(pcb, flags); intr_restore(r); diff --git a/sys/amd64/ia32/ia32_exception.S b/sys/amd64/ia32/ia32_exception.S index 42d0ff6c638b..ef1a2c59a0af 100644 --- a/sys/amd64/ia32/ia32_exception.S +++ b/sys/amd64/ia32/ia32_exception.S @@ -54,10 +54,10 @@ int0x80_syscall_common: movq %rax,TF_RAX(%rsp) movq %rdx,TF_RDX(%rsp) movq %rcx,TF_RCX(%rsp) + movq %r15,TF_R15(%rsp) call handle_ibrs_entry sti movq %rsi,TF_RSI(%rsp) - movq %r8,TF_R8(%rsp) movq %r9,TF_R9(%rsp) movq %rbx,TF_RBX(%rsp) movq %rbp,TF_RBP(%rsp) @@ -66,7 +66,6 @@ int0x80_syscall_common: movq %r12,TF_R12(%rsp) movq %r13,TF_R13(%rsp) movq %r14,TF_R14(%rsp) - movq %r15,TF_R15(%rsp) movl $TF_HASSEGS,TF_FLAGS(%rsp) pushfq andq $~(PSL_D | PSL_AC),(%rsp)