From nobody Tue Oct 27 12:01:18 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 4jDTc017V3z6xTXy for ; Tue, 27 Oct 2026 12:01:20 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jDTbz0PsZz3D6h for ; Tue, 27 Oct 2026 12:01:19 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793102479; 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=ZmpQh4sENDRfQkYrntzwG11WqBKW9PeKcPD43X1FtwU=; b=pCP2f7gJmO3uxKgi0IW6nEP7MIJoHv859tXqH6mXONKVrGyj3aM/fVaMTdcKiqfgQushvi 989zyC3ncKW9PkTl4ocN9ie8TLCbb/Ztxu1csaxj+N6g2jWeHWEbA5vTHqkAkG1VHjeZUj n08xMG8iv78TfUlz/sTAqLIQnu7LF6FGnFUSgb5bYygHa5Nh+Xi12ZAwV4NdsBFh72vTTQ HVi+mVlZLLz5JUJXHsWVnp0fXCAlOwkl4sNQyj900deeuHzMI0Obe9mOiVii/9k7JlYwsz 95n0PlsQzBNedAfmjnlOWHq/NyJeKZptQRI2Ypi+MHtHTwEE5QfFrwk8E/hBNA== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793102479; b=tWYHxW/b0BlX8EqSV/OB6CoETxBSdtIrgUlFVVALnglJLSdr9DX7jKm00mBvAyc6MqMLBG gJ393jnS5HtXti23JJ8RxXvhgSXihS7cWVQ6Bj9uIUzf8bH8ZpPHpcFFkbLLJyiVbbzr/r EEDtXQWGngK5Qj+rij7A91vft1bnZ4Qvs5hYnLk0TnwaNFpuw6cnF26aoaTxAK58wo3Adz ZXdIO7fseD4pXdcVSfpkshe9UHSmgGzmmmfgwuwHdLd9Md03R7ysb6DREKRAUTpzL6S7Ok u55NmudqEkIiqVTn+UYq5MLE/bxiHuRBbclv5ZznjzYPpsQSXFiGRzCsbM7zaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793102479; 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=ZmpQh4sENDRfQkYrntzwG11WqBKW9PeKcPD43X1FtwU=; b=fa8i9VUI7HzWS6gWYA7k72PnDNRiNEZooy6MnOI2mQX4cq/oF997siLhwlbCuzeunT0HO7 f279gtDK9/ilPiXWwOV58E0JzSNjua9kAfqYJuoiiEefn4U3n4w9pJ7JUV8Ygp8/mMUgGu kt3IQW7A/I6ijdU0+YPKsLmDB15AC9uJXMJWvtqv6/hL69TJ9kV7UvLjnRfab9LCDQcjwU /tuu4zy1767kVuymr4rWMqjGq4Vvs8t7qxfzy6p6yFP3JB3k1jcE9yVTYMPh89bzGRUDB6 Hv7wgAbjEPPjZoy8pBhXnNJLOMbc5wHncdJ2QBezh8p4TRLU9KfbxcpiQWl0PA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4jDTbz00SQzKP4 for ; Tue, 27 Oct 2026 12:01:18 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 318b9 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 27 Oct 2026 12:01:18 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 5bc997b6f5b1 - main - amd64: do not allow to set IOPL to 3 when FRED is used List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches of the src repository 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: 5bc997b6f5b1265ff28d11405eb980bf471c3db4 Auto-Submitted: auto-generated Date: Tue, 27 Oct 2026 12:01:18 +0000 Message-Id: <6ae0928e.318b9.38621a87@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=5bc997b6f5b1265ff28d11405eb980bf471c3db4 commit 5bc997b6f5b1265ff28d11405eb980bf471c3db4 Author: Konstantin Belousov AuthorDate: 2026-10-27 09:10:09 +0000 Commit: Konstantin Belousov CommitDate: 2026-10-27 11:58:48 +0000 amd64: do not allow to set IOPL to 3 when FRED is used SDM requires that IOPL is zero when returning to usermode with ERETU. Do not set rflags.iopl for FreeBSD io(4) open. This might be changed to disallow io(4) open for FRED at all with a knob, if there is a real need. Return ENOSYS from linux iopl(2), apparently Linux kernel can be configured without iopl(2) support, so linux programs should be prepared for this error. Return EINVAL from vt(4)/syscons(4) ioctl(KDENABIO). Fixes: 6e93f5e4d693 ("amd64: FRED support") Sponsored by: The FreeBSD Foundation MFC after: 1 week --- sys/amd64/amd64/io.c | 16 ++++++++++++---- sys/amd64/linux/linux_machdep.c | 3 +++ sys/amd64/linux32/linux32_machdep.c | 3 +++ sys/dev/syscons/syscons.c | 3 +++ sys/dev/vt/vt_core.c | 3 +++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/sys/amd64/amd64/io.c b/sys/amd64/amd64/io.c index 6c36d5fb20e1..ba34675c0cc5 100644 --- a/sys/amd64/amd64/io.c +++ b/sys/amd64/amd64/io.c @@ -31,21 +31,29 @@ #include #include +#include #include int iodev_open(struct thread *td) { - - td->td_frame->tf_rflags |= PSL_IOPL; + /* + * SDM rev. 93 vol.3 8.4.2.1 Loading and Checking the Return State: + * Checking IOPL ensures that, when FRED transitions are + * enabled, IOPL is always 0 when CPL = 3. + * + * As result, io(4) cannot enable the IOPL for usermode on FRED. + */ + if (!fred) + td->td_frame->tf_rflags |= PSL_IOPL; return (0); } int iodev_close(struct thread *td) { - - td->td_frame->tf_rflags &= ~PSL_IOPL; + if (!fred) + td->td_frame->tf_rflags &= ~PSL_IOPL; return (0); } diff --git a/sys/amd64/linux/linux_machdep.c b/sys/amd64/linux/linux_machdep.c index dc7f55f6f198..e22a3ed22c31 100644 --- a/sys/amd64/linux/linux_machdep.c +++ b/sys/amd64/linux/linux_machdep.c @@ -88,6 +88,9 @@ linux_iopl(struct thread *td, struct linux_iopl_args *args) return (error); if ((error = securelevel_gt(td->td_ucred, 0)) != 0) return (error); + /* See comment in sys/amd64/amd64/io.c. */ + if (fred && args->level != 0) + return (ENOSYS); td->td_frame->tf_rflags = (td->td_frame->tf_rflags & ~PSL_IOPL) | (args->level * (PSL_IOPL / 3)); diff --git a/sys/amd64/linux32/linux32_machdep.c b/sys/amd64/linux32/linux32_machdep.c index a9517b42a4d9..a62965308c33 100644 --- a/sys/amd64/linux32/linux32_machdep.c +++ b/sys/amd64/linux32/linux32_machdep.c @@ -332,6 +332,9 @@ linux_iopl(struct thread *td, struct linux_iopl_args *args) return (error); if ((error = securelevel_gt(td->td_ucred, 0)) != 0) return (error); + /* See comment in sys/amd64/amd64/io.c. */ + if (fred && args->level != 0) + return (ENOSYS); td->td_frame->tf_rflags = (td->td_frame->tf_rflags & ~PSL_IOPL) | (args->level * (PSL_IOPL / 3)); diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index 9167da23efd8..06e3c498ddd6 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -72,6 +72,7 @@ #if defined(__i386__) || defined(__amd64__) #include #include +#include #endif #if defined(__amd64__) || defined(__i386__) @@ -1338,6 +1339,8 @@ sctty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) #ifdef __i386__ td->td_frame->tf_eflags |= PSL_IOPL; #elif defined(__amd64__) + if (fred) + return (EINVAL); td->td_frame->tf_rflags |= PSL_IOPL; #endif return 0; diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c index 0ea2ec58f4cc..909ee3b8689d 100644 --- a/sys/dev/vt/vt_core.c +++ b/sys/dev/vt/vt_core.c @@ -61,6 +61,7 @@ #if defined(__i386__) || defined(__amd64__) #include #include +#include #endif static int vtterm_cngrab_noswitch(struct vt_device *, struct vt_window *); @@ -2971,6 +2972,8 @@ skip_thunk: #if defined(__i386__) td->td_frame->tf_eflags |= PSL_IOPL; #elif defined(__amd64__) + if (fred) + return (EINVAL); td->td_frame->tf_rflags |= PSL_IOPL; #endif return (0);