From nobody Sun Jun 21 12:17:41 2026 X-Original-To: dev-commits-src-all@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 4gjr232qKYz6jchk for ; Sun, 21 Jun 2026 12:17:47 +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 "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gjr232GZyz3grG for ; Sun, 21 Jun 2026 12:17:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782044267; 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=K6izN1aY49VCENRhdfzqiOdtgZjqhdhyXMqWHfg6/KY=; b=prBR3/BVwgmwvq2Mv4SsOXBqgHAuIRxS3cRbXPBBAVMgLt3XBgZOgmLUdeE5i+awvR9MdB qmvWIu/wjqtQfLPaPQm77ILViHo5HU4VC7DYeacR7mG2v7XLHYGT+AtjVTvZgkmHt8uURd z8z2kGwJUW/d3HZsmpGrm/yGjV2z40cCCMUHQGZAj1N3YaPUXYg2NEy8+lySV3dzDr3Rs6 1NnVa3+Ftg361j5dKqjvXsYQeEoo1UwEBaoyGgNUs8bZeqTu6TGmElI7LTTGVuu28xqBkN +pdf1En/ovGeEPweGr0ix+GhvNZq3+XaCDh4+JQxq29UhjAC4tG4ryLpgq5+IA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782044267; a=rsa-sha256; cv=none; b=ocW4Jn7csWu8NYQyRm3T67yPaKdq5W/IlzrxpVUJP9ns7lIU2JBIzE1hddoK2biuvufvrg z0IfkP56UrgRYyG3KEa8UGwpsNdrNlWkNlQUYgUlgxwAoRMTVVpMblc2OsJm4xktGOwyN2 GpkwpIr7y5uxCC9kgfOcXNgld+AKYhbSrLmxm/vGQTmXiRvVA+J5rB6u7H70RrgQzuXptT SJUdtKxmzxU48doCEZdRroVl0aPFuNaHe6J7PzoWevwkIsv22+O0W25RKyBnjO5Gd8qbva bH3uH8jE8didkyCLAiqhTV7Yv0J9EckWIGZxuW4dD97XHMedG4SRCk2isKRSkw== 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=1782044267; 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=K6izN1aY49VCENRhdfzqiOdtgZjqhdhyXMqWHfg6/KY=; b=QBmYp/7hxD9s15CChJDFSBr53xJHJiS0SzXTkyIvRIcXNWoTdNvLilRGCC11V+3NvQXzXW bs2Ib8nT3o6YFFKbz9Qo2ViqPJsv2Blnkv9G13YwhASr9lI+id7Z9lBYip4Dp+T1EcSXnV 3J3QpqdjHmWVaY6MsjRG2Dx4UqTGi8eip4pEFUs5vbmml3UtiUeISvYRvHKb8tYShcCFQm ethLiSRO79y2hSPFh8GOLcDJ2OwqftlHGUQQTZa32A6gdMFz25ruDl/pPNJZpwfl+MyOG0 zdSDOUKE7F9MNYBBMsebSi15dQ6Wr6qG3s+HdwY39Ta1MRUw/+2ecFUOqF3gfQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gjr231BHmz1Flk for ; Sun, 21 Jun 2026 12:17:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 303b6 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 21 Jun 2026 12:17:41 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: c7e5802ab6e6 - main - amd64: do not restore fsbase/gsbase for 32bit processes List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list 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: c7e5802ab6e6230a5782a09c914585d055eb5223 Auto-Submitted: auto-generated Date: Sun, 21 Jun 2026 12:17:41 +0000 Message-Id: <6a37d665.303b6.7db6c140@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=c7e5802ab6e6230a5782a09c914585d055eb5223 commit c7e5802ab6e6230a5782a09c914585d055eb5223 Author: Konstantin Belousov AuthorDate: 2026-06-16 21:44:00 +0000 Commit: Konstantin Belousov CommitDate: 2026-06-21 12:17:11 +0000 amd64: do not restore fsbase/gsbase for 32bit processes There is no WRFSBASE and WRGSBASE 32bit variants at all. As such, the fsbase and gsbase must always be equal to the bases in the corresponding segment descriptor, same as on real i386. If a 32bit program reloads either %fs or %gs using setcontext(9) or sigreturn(9), restoring bases from the syscall entry time is wrong. In all other cases, hardware already does the right action when the segment register is loaded, and the bases for the ufssel/ugssel in GDT are updated on the context switch. Reviewed by: markj (previous version) Tested by: terehovv@mail.ru Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D57611 --- sys/amd64/amd64/exception.S | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 5ff75fb65740..4d58e07caf4b 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -1161,12 +1161,15 @@ do_segs: .globl ld_fs ld_fs: movw %ax,%fs + testl $PCB_32BIT,PCB_FLAGS(%r8) + jnz after_ld_fsbase movl $MSR_FSBASE,%ecx movl PCB_FSBASE(%r8),%eax movl PCB_FSBASE+4(%r8),%edx .globl ld_fsbase ld_fsbase: wrmsr +after_ld_fsbase: /* Restore %gs and gsbase */ movw TF_GS(%rsp),%si pushfq @@ -1179,6 +1182,8 @@ ld_fsbase: .globl ld_gs ld_gs: movw %si,%gs + testl $PCB_32BIT,PCB_FLAGS(%r8) + jnz ld_gsbase_32 /* Restore kernel %gs base */ movl %r12d,%eax movl %r13d,%edx @@ -1194,6 +1199,8 @@ ld_gs: .globl ld_gsbase ld_gsbase: wrmsr /* May trap if non-canonical, but only for TLS. */ + +after_ld_gsbase: .globl ld_es ld_es: movw TF_ES(%rsp),%es @@ -1241,6 +1248,30 @@ ld_regs: doreti_iret: iretq + /* + * 32bit gsbase path. + * The KGSBASE is not loaded from the pcb_gsbase, instead we move + * the GSBASE value into KGSBASE right after loading user %gs, then + * restore kernel gsbase. + */ +ld_gsbase_32: + /* Read the user gsbase into %r14d:%r15d. */ + movl $MSR_GSBASE,%ecx + rdmsr + movl %eax,%r14d + movl %edx,%r15d + /* Restore kernel %gs base */ + movl %r12d,%eax + movl %r13d,%edx + wrmsr + popfq + /* Load the user gsbase into KGSBASE. */ + movl $MSR_KGSBASE,%ecx + movl %r14d,%eax + movl %r15d,%edx + wrmsr + jmp after_ld_gsbase + set_segs: movw $KUDSEL,%ax movw %ax,TF_DS(%rsp)