From nobody Wed May 28 11:11:39 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4b6mzH2Mm6z5xKYR; Wed, 28 May 2025 11:11:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4b6mzH1Wnbz42FR; Wed, 28 May 2025 11:11:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1748430699; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=clFGHomU2txd8ZcuEGSimgFpsGydK6tAw0HODRQOPkc=; b=JXSvv0COY7U2CZzMygX4M/Vf0wszBvRsGBYrLvCsKEHX562z1VV1wxOXXRCT7RjXN+ARcV qDm5AWXHtKJfo2SBPJfaVboieglD3Cui6/7R2Dhlq7KR5HqfG+jwMMFoBx+q2ac9Cv03sa cgMdVkmwgwsmlT36DukdRP5S+2fmR/PI4crPHJaWEczvU3JMX1J7D1QrjBECl9sj7upCVg w4xBTI1bbCN19rP4FL7G+j0FOIZD1B16Am42Zv6/vixVuC3V5NqcSVggjFRdhOEPB1W7cp vUrcs5IlEU+GlsrtufpyFa/qAfzvb8p/Da9x97RFMe6h5OpB5FGFTjGhbMrapw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1748430699; a=rsa-sha256; cv=none; b=hTJsG7qIlbzO/yzBu7Ky3x/of81tNeNHb/Y7OG0TCB9oTyHfKMWXm3TU43Uf7pGFhFDl+F TlPulibJa2JxZW4soWkdbvXt0V7YdK+mKoOIBIoRY18QqeK73KXUxEkdDaHy0JyLC1g2U3 fBMvdTT5yzJPB0a66aO+yX6TRMPUoj7nRSS0WUa0h4usFTizN1MWuLSOlQHNlgZQVZXik7 tPXL35OT/oUgENqF6FJYYHnjP+RMZY+WzHHIhwQf6tLIkp2eDYmYd6bsUfNqPgEfNGRdOg XWaZ9HshGXbP0zmXbaKeS/B1tKONaRCcoSFAR20JJ4tfWxIoXcC+QizQyuLeZw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1748430699; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=clFGHomU2txd8ZcuEGSimgFpsGydK6tAw0HODRQOPkc=; b=biju8/g3DDtYZeELa63zlrGecpDTCS4w5E9teOQXIeQjHEkuF/dhVBnX5kLXUnXp3nU3rS eMve58hvspSulSVvhu4jZsxVwiMyboAppCf0oqAuC6EcHxOc/CSdXEhnfxIiqTC1sMxfZ0 3L4WfECxY10lM/L9HuhPllDNINznQ4Evj5rXIEAnD+zVIj66U0Bzwqxm99iP+Vu7R4JzCG pCAN3bxDvVqxLKOayXEP+0oG519v7rPUAkYiVuylA/ksreEGMsvgFnDBcCYU4Eyib0oayY 2e4Nxl2plmRQS7JB7hwEUokbZFavZTlihTBXDq3anC03kNk0eU6FNETVTGKu0g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4b6mzH151nzc23; Wed, 28 May 2025 11:11:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 54SBBd1E049483; Wed, 28 May 2025 11:11:39 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 54SBBdmO049481; Wed, 28 May 2025 11:11:39 GMT (envelope-from git) Date: Wed, 28 May 2025 11:11:39 GMT Message-Id: <202505281111.54SBBdmO049481@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: ddab534cd6f6 - main - amd64: do not handle fs/gs bases conditionally on the selector List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ddab534cd6f6557740c24ff2019642880ad8bef6 Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=ddab534cd6f6557740c24ff2019642880ad8bef6 commit ddab534cd6f6557740c24ff2019642880ad8bef6 Author: Konstantin Belousov AuthorDate: 2025-05-19 01:30:14 +0000 Commit: Konstantin Belousov CommitDate: 2025-05-28 11:11:23 +0000 amd64: do not handle fs/gs bases conditionally on the selector For machines with RDFSBASE support, we only saved and restored fs and gs base registers when corresponding segment register contained the predefined value. This breaks some valid uses of the LDT together with WR{F,G}SBASE. Unconditionally save bases, and restore them on return to usermode. The PCB_FULL_IRET optimization is still in place. Reviewed by: markj, olce Reported and tested: Alex S Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D50414 --- 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 32d1b91d50b4..a053f6c70af1 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 c3d5819378d1..babfbacf92ef 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 6d9bc8b7c573..032a134bbd4b 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -1789,10 +1789,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)