From nobody Sun Jun 21 12:17:41 2026 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 4gjr1y2Prtz6jcNd for ; Sun, 21 Jun 2026 12:17:42 +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 4gjr1y04wfz3ghy for ; Sun, 21 Jun 2026 12:17:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782044262; 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=sp4gZabwNCsTWh/eFjyx+vx0S0xyOCi0zH0Ts205bQFvnb/MjPqUIQ5phcj+IPvpj/l7Zk U31emPYcn2dqvQa/qR3HI6EHxAFnbxz3IJf01VOis+sjtWvK/NGxWGxwKeLv+csFy4HeCA KevraAI9WJPQl93AnewdKyXTfsGAw+00Xj0the8RDIAX4AGuYcEbHEmTAMYrzZ+OCEJm8y MzI7mIzBJAg0585zxBzpc+2ll3O3LWTlBuv0CnB92nZ4S/MIovVBKUj3bF0Ca0YxeqxmGn 7TyY3sn7LxLPmG2+q9E9NQTxpUQJDILJ9cPGMOG+pTGA9ud6gCJe6hS7k4pEEA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782044262; a=rsa-sha256; cv=none; b=coo6Uj+T3SXu71zOh/3DkVcgJpeKA56UNIZHOh15EzX0g7RZQq7dAEwZ8v/Y1VH/GWOPi7 o14FSxkymgmcm/P0Lnq37uG8O5KIJBloKcMqdhpYzDJX/uF5bPmpamUHA/SYX2gW2lJmmz MyeralcgbbZDZGEJCm1bPatF7LXP4z42Tx/dAvDDdX920aCJtiHApZnI1Zoun4ZMaO3lkY dNXtx8mZ3fuojblXEnh9fDCjtw9bWB73IN087dl001ttDREVz3AwuVBrm7YKnv5M47RWiE Pmf2J05xPdr/TPvu+zBO8+molbOh7SSj9OdsXO5a5sQR5nbtBm42gNj2iH7Pmg== 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=1782044262; 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=PFIxJuRnYNv29msbwZRN0CdBpIySU2s7CjrJlcJA8Ftq7zP1EebZ2PZtFEBDjmUx3o4J+T jWspw18diWCXiwmWgneoAz8nG5s5Jn3PdDG4zokDV8rJWggaMxa7db4+8SDI4QLuQCT0Fp gVztbN9rGP7phsrb7Gpz9WiDWmg6IzTDOXJnoeBpxJmZ9TS81wNqYrceSmpz+xpdqm+6DK Bk2dd1tvoF93hiz81P2KQ7m8FLMalqc1YyunA1e/y1ki/mHmPMgNDIW7D0E2FrHeQVvOwU RV8YnqVQiDw4a1fiDiF7ZcIGvTHX3ctXpF5sdQHqEZsIx66lOiPtge7eoQq0uA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gjr1x65m2z1G5c for ; Sun, 21 Jun 2026 12:17:41 +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 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 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)