From nobody Wed Jan 22 12:59:12 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 4YdPKX6wWhz5lS3y; Wed, 22 Jan 2025 12:59:12 +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 4YdPKX6B7Lz3PX6; Wed, 22 Jan 2025 12:59:12 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737550752; 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=2o5QXKNhznFcsb0/44W4IFw938dvcnHkniFe9lhAJ5c=; b=USw+GGZD2hWlawDfllPoyeYHkN2MDnyOYPkYVo8FdgHiIojmEOSeqj2WQPAbrYuqA3yLHq EzQD11rtxh4T7UB6pMdczzcNB8qx9Adgop1TDKbSZBxRktW2rQGhKPaM3SDDVDKHGWDV2g pmy6ebO/q1MxP68ITLa9bFeGFp+q3LTQDiSKI9uIHIZKuFCm74GhB7ZbPlN0YyxTAodgP/ 9ThvyA9zd9DDnQeC6BXrlrb//fZRNNzMyXowfnR4M8J6rE7u+oIugJwTfZkfpmM1nPb2ao /iOAXMjLMFbCFxQBrKrOzSNglnPniiGNHGMR514LLVTsu6IZjZlJHyHaY0fVBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737550752; 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=2o5QXKNhznFcsb0/44W4IFw938dvcnHkniFe9lhAJ5c=; b=iFcwf22IXIn9uFexGK/sL4ewFuJuXhBdL0b7FarWi1L67HuZv0NsDRJZda0cJpi1EJ3gEY ltpjz+WCMgIFxvsa4mtxTaREIlaP9ObhkuH1qSsfHOzWWWSDVWBlcQ19v8xKFAxbVij5WX H/QZzWvGa8QVy0ygJPPlm582aQnGuqMaLi6SDvmhOjS5ofsnY3eS17K+5kxBTP2KQnPkwP rFkrU/CzAY3acZtB+Sz19ki5Efct+QLtXpK89plVYs50fU402VEUPT3rOuabrN7IVoNLED q3HTmiDDm3s1fBx5Mcg2G+7RuzZwUWu4wzBkGBj9u/CkT2am8TTxvWhZBjAa4w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1737550752; a=rsa-sha256; cv=none; b=Vf3MOmNBpqo1xZZ438boPXgHzm9POWO54NIZQ6Rcyjhly3sZNmFj/eGls2lqBxcxyh1UMy OzbiYelDMH1GkfSQyQHlvB1czZLG8oeKTjQpRrxQ3y2j05lNeZkGodgyzQPvP66igQoJoL IUfeL9WZzOlXAK79n2qEEuGe/qkLq7mGHrmTptPWv6k1YBjvXiXNlUFbFe08dydu0QWU6Z 2DdgiwtW0DMEX/DnwpY4wFkoVu9SvNU4A0w2ZMcXSqtw2G0mOeuYr/Euswe1faGnawx8qU oQv+xW8In6r/7hDZKLIubvjQ5lj3sHAIV+6SYn6j6yucCp8CJ0R4rOkIAlX4gA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none 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 4YdPKX57HnztS3; Wed, 22 Jan 2025 12:59:12 +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 50MCxCPk015558; Wed, 22 Jan 2025 12:59:12 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50MCxC6u015555; Wed, 22 Jan 2025 12:59:12 GMT (envelope-from git) Date: Wed, 22 Jan 2025 12:59:12 GMT Message-Id: <202501221259.50MCxC6u015555@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Bojan =?utf-8?Q?Novkovi=C4=87?= Subject: git: b9951017bab3 - main - amd64/fpu: Track supervisor state XSAVE components 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: bnovkov X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: b9951017bab396e24042e85632e2cc34ee0329ff Auto-Submitted: auto-generated The branch main has been updated by bnovkov: URL: https://cgit.FreeBSD.org/src/commit/?id=b9951017bab396e24042e85632e2cc34ee0329ff commit b9951017bab396e24042e85632e2cc34ee0329ff Author: Bojan Novković AuthorDate: 2025-01-15 16:41:24 +0000 Commit: Bojan Novković CommitDate: 2025-01-22 12:58:34 +0000 amd64/fpu: Track supervisor state XSAVE components The amd64/fpu.c xsave_* routines track supported XSAVE components and features. However, they only track supported user state components, and there is currently no way for a consumer to check whether the CPU supports a supervisor state component. Fix this by saving the supported supervisor state components, enumerated by CPUID function 0DH, sub-function 1, in a separate mask. Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D48466 --- sys/amd64/amd64/fpu.c | 38 ++++++++++++++++++++++++-------------- sys/x86/include/fpu.h | 5 +++-- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/sys/amd64/amd64/fpu.c b/sys/amd64/amd64/fpu.c index 591bd196ca7d..79d1722268b7 100644 --- a/sys/amd64/amd64/fpu.c +++ b/sys/amd64/amd64/fpu.c @@ -164,6 +164,7 @@ SYSCTL_INT(_hw, HW_FLOATINGPT, floatingpoint, CTLFLAG_RD, int use_xsave; /* non-static for cpu_switch.S */ uint64_t xsave_mask; /* the same */ +static uint64_t xsave_mask_supervisor; static uint64_t xsave_extensions; static uma_zone_t fpu_save_area_zone; static struct savefpu *fpu_initialstate; @@ -324,6 +325,7 @@ fpuinit_bsp1(void) ctx_switch_xsave[3] |= 0x10; restore_wp(old_wp); } + xsave_mask_supervisor = ((uint64_t)cp[3] << 32) | cp[2]; } /* @@ -421,7 +423,7 @@ fpuinitstate(void *arg __unused) XSAVE_AREA_ALIGN - 1, 0); fpu_initialstate = uma_zalloc(fpu_save_area_zone, M_WAITOK | M_ZERO); if (use_xsave) { - max_ext_n = flsl(xsave_mask); + max_ext_n = flsl(xsave_mask | xsave_mask_supervisor); xsave_area_desc = malloc(max_ext_n * sizeof(struct xsave_area_elm_descr), M_DEVBUF, M_WAITOK | M_ZERO); } @@ -1293,19 +1295,25 @@ fpu_save_area_reset(struct savefpu *fsa) } static __inline void -xsave_extfeature_check(uint64_t feature) +xsave_extfeature_check(uint64_t feature, bool supervisor) { + uint64_t mask; + mask = supervisor ? xsave_mask_supervisor : xsave_mask; KASSERT((feature & (feature - 1)) == 0, ("%s: invalid XFEATURE 0x%lx", __func__, feature)); - KASSERT(feature < flsl(xsave_mask), - ("%s: unsupported XFEATURE 0x%lx", __func__, feature)); + KASSERT(ilog2(feature) <= ilog2(mask), + ("%s: unsupported %s XFEATURE 0x%lx", __func__, + supervisor ? "supervisor" : "user", feature)); } static __inline void -xsave_extstate_bv_check(uint64_t xstate_bv) +xsave_extstate_bv_check(uint64_t xstate_bv, bool supervisor) { - KASSERT(xstate_bv != 0 && ilog2(xstate_bv) < flsl(xsave_mask), + uint64_t mask; + + mask = supervisor ? xsave_mask_supervisor : xsave_mask; + KASSERT(xstate_bv != 0 && ilog2(xstate_bv) <= ilog2(mask), ("%s: invalid XSTATE_BV 0x%lx", __func__, xstate_bv)); } @@ -1317,11 +1325,13 @@ bool xsave_extfeature_supported(uint64_t feature, bool supervisor) { int idx; + uint64_t mask; KASSERT(use_xsave, ("%s: XSAVE not supported", __func__)); - xsave_extfeature_check(feature); + xsave_extfeature_check(feature, supervisor); - if ((xsave_mask & feature) == 0) + mask = supervisor ? xsave_mask_supervisor : xsave_mask; + if ((mask & feature) == 0) return (false); idx = ilog2(feature); return (((xsave_area_desc[idx].flags & CPUID_EXTSTATE_SUPERVISOR) != 0) == @@ -1345,15 +1355,15 @@ xsave_extension_supported(uint64_t extension) */ size_t xsave_area_offset(uint64_t xstate_bv, uint64_t feature, - bool compact) + bool compact, bool supervisor) { int i, idx; size_t offs; struct xsave_area_elm_descr *xep; KASSERT(use_xsave, ("%s: XSAVE not supported", __func__)); - xsave_extstate_bv_check(xstate_bv); - xsave_extfeature_check(feature); + xsave_extstate_bv_check(xstate_bv, supervisor); + xsave_extfeature_check(feature, supervisor); idx = ilog2(feature); if (!compact) @@ -1376,16 +1386,16 @@ xsave_area_offset(uint64_t xstate_bv, uint64_t feature, * 'xstate_bv' and extended region format ('compact'). */ size_t -xsave_area_size(uint64_t xstate_bv, bool compact) +xsave_area_size(uint64_t xstate_bv, bool compact, bool supervisor) { int last_idx; KASSERT(use_xsave, ("%s: XSAVE not supported", __func__)); - xsave_extstate_bv_check(xstate_bv); + xsave_extstate_bv_check(xstate_bv, supervisor); last_idx = ilog2(xstate_bv); - return (xsave_area_offset(xstate_bv, (uint64_t)1 << last_idx, compact) + + return (xsave_area_offset(xstate_bv, (uint64_t)1 << last_idx, compact, supervisor) + xsave_area_desc[last_idx].size); } diff --git a/sys/x86/include/fpu.h b/sys/x86/include/fpu.h index 9d2e43f6386e..c94e058498f6 100644 --- a/sys/x86/include/fpu.h +++ b/sys/x86/include/fpu.h @@ -222,8 +222,9 @@ struct savefpu_ymm { bool xsave_extfeature_supported(uint64_t feature, bool supervisor); bool xsave_extension_supported(uint64_t extension); size_t xsave_area_hdr_offset(void); -size_t xsave_area_offset(uint64_t xstate_bv, uint64_t feature, bool compact); -size_t xsave_area_size(uint64_t xstate_bv, bool compact); +size_t xsave_area_offset(uint64_t xstate_bv, uint64_t feature, bool compact, + bool supervisor); +size_t xsave_area_size(uint64_t xstate_bv, bool compact, bool supervisor); #endif #endif /* !_X86_FPU_H_ */