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)

Reply via email to