From nobody Thu Sep 4 16:28:47 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 4cHlKX1Kw8z66MsN; Thu, 04 Sep 2025 16:28:48 +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 "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4cHlKX0R2Gz40VM; Thu, 04 Sep 2025 16:28:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1757003328; 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=15ZpC+QF0qYpPkacQIVMBtuFeD9RDvY4tkIh/i0VhpY=; b=NqH7M4oUePdv75AK+fAM/ecX0LL/oRb73z/5vtqiexvdkzxr7FD/mh0QiIy/mgUiJhRTB6 0DnoRCLOoa8LKm3FjpI52hCNKMruyNEhYutjuFrM2HTSDxl7KllRE2O6Nd82omtgP9IksR +vY7+PxfmY9XMlf6mNyjs61h9E494WR1HKhvELuAmC8eRiK6gm6s+6yiOlKMp7AN4cvlN6 ZvgNMOoCeX3FenMLCRVwSwDzCBUZpMqi4jLVkMPa0WFnIyqEHyqaWk0xbzK1GWzcVlTnPF ni2stEtov5U6m/T8YRzDMlgmzAo4hg79BZ1rps4nJOv51w+T5gCG8CE2dWKsow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1757003328; 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=15ZpC+QF0qYpPkacQIVMBtuFeD9RDvY4tkIh/i0VhpY=; b=CWXLqJD55PeTNh+4yogVziu4HhSEL/C6SgPN43iiILTQt7dPBAgDMeHNEwGaXccYmlfTkp X2cbCsVGWPHRi0qjvmljLtb8GAQwKLnzoigKIC1b7A8IiGFMOnxZf2Tfr91pfr9sg1US1S 4oyAIyTzTogxbm0ftq+dIoYvtEqBDWin7kpka41E5W8+7uPOtX9v6v4vBwzdEYHbk5yQ6x qTppuUY1pGcn9Zoy3nuNEWGhCkANH2jM7jQsvK58iDFvtja70bwB+LiHQJEtRgxD+hg8v+ uc2I5q6bMsx4uSlmmey6cBy/NsBXSjagXsQjV36UA0MP3V3m7vjYqW+trdAqoQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1757003328; a=rsa-sha256; cv=none; b=N4ZxfKI6bitBh65utrv5a33/nHYNhWxzUvYwszhYjbbZeYbc6CdGNyJHoX40eTtTSeyWv4 SlJGQlDqFst1qMzGMORlnQ41vVrBjvidgRRuCllEJI+XBE5+PYIWUjfdnCDxFFLg8uRGlE BA71K/gHlolSd5AcNAEau+h4LsamFHtX/pyS/qgNz5B4V+8sGcHDsiH+fZRQS4cMXHwYbY XiVObeoxqAyofDQi6Z3MK8JcGaD1ksajMuWzd2c/TCDLVccNQ1TiDxukoI1KNYkeGku4y7 0dUtF+p8GKp5kXZ8FgxOqicUF/hHabxowUzklgyG732883F9XL4oLTolJ9v89w== 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 4cHlKW6vFZz18fk; Thu, 04 Sep 2025 16:28:47 +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 584GSlkN033072; Thu, 4 Sep 2025 16:28:47 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 584GSlpZ033069; Thu, 4 Sep 2025 16:28:47 GMT (envelope-from git) Date: Thu, 4 Sep 2025 16:28:47 GMT Message-Id: <202509041628.584GSlpZ033069@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 9204a315a71c - main - arm64: Add a sysctl to see if features are enabled 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: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9204a315a71c5aa9a9b8c11f2dcefb155dd5fc34 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=9204a315a71c5aa9a9b8c11f2dcefb155dd5fc34 commit 9204a315a71c5aa9a9b8c11f2dcefb155dd5fc34 Author: Andrew Turner AuthorDate: 2025-09-04 14:44:31 +0000 Commit: Andrew Turner CommitDate: 2025-09-04 14:44:39 +0000 arm64: Add a sysctl to see if features are enabled This will also be used as a tunable to control features in a later change. Reviewed by: imp Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D52357 --- sys/arm/arm/generic_timer.c | 5 +++-- sys/arm64/arm64/cpu_feat.c | 7 +++++-- sys/arm64/arm64/identcpu.c | 6 ++++-- sys/arm64/arm64/machdep.c | 6 ++++-- sys/arm64/arm64/pmap.c | 8 +++++--- sys/arm64/arm64/ptrauth.c | 6 ++++-- sys/arm64/include/cpu_feat.h | 13 ++++++++++--- 7 files changed, 35 insertions(+), 16 deletions(-) diff --git a/sys/arm/arm/generic_timer.c b/sys/arm/arm/generic_timer.c index 841e5f9e96aa..27c985c5fcbe 100644 --- a/sys/arm/arm/generic_timer.c +++ b/sys/arm/arm/generic_timer.c @@ -892,16 +892,17 @@ wfxt_check(const struct cpu_feat *feat __unused, u_int midr __unused) return (ID_AA64ISAR2_WFxT_VAL(id_aa64isar2) != ID_AA64ISAR2_WFxT_NONE); } -static void +static bool wfxt_enable(const struct cpu_feat *feat __unused, cpu_feat_errata errata_status __unused, u_int *errata_list __unused, u_int errata_count __unused) { /* will be called if wfxt_check returns true */ enable_wfxt = true; + return (true); } -CPU_FEAT(feat_wfxt, +CPU_FEAT(feat_wfxt, "WFE and WFI instructions with timeout", wfxt_check, NULL, wfxt_enable, CPU_FEAT_AFTER_DEV | CPU_FEAT_SYSTEM); #endif diff --git a/sys/arm64/arm64/cpu_feat.c b/sys/arm64/arm64/cpu_feat.c index cc262394913d..fd1b8429295f 100644 --- a/sys/arm64/arm64/cpu_feat.c +++ b/sys/arm64/arm64/cpu_feat.c @@ -32,6 +32,8 @@ #include #include +SYSCTL_NODE(_hw, OID_AUTO, feat, CTLFLAG_RD, 0, "CPU features/errata"); + /* TODO: Make this a list if we ever grow a callback other than smccc_errata */ static cpu_feat_errata_check_fn cpu_feat_check_cb = NULL; @@ -97,8 +99,9 @@ enable_cpu_feat(uint32_t stage) /* Shouldn't be possible */ MPASS(errata_status != ERRATA_UNKNOWN); - feat->feat_enable(feat, errata_status, errata_list, - errata_count); + if (feat->feat_enable(feat, errata_status, errata_list, + errata_count)) + feat->feat_enabled = true; } } diff --git a/sys/arm64/arm64/identcpu.c b/sys/arm64/arm64/identcpu.c index f823cbce37ed..6d70692fdf5d 100644 --- a/sys/arm64/arm64/identcpu.c +++ b/sys/arm64/arm64/identcpu.c @@ -2320,7 +2320,7 @@ user_ctr_has_errata(const struct cpu_feat *feat __unused, u_int midr, return (false); } -static void +static bool user_ctr_enable(const struct cpu_feat *feat __unused, cpu_feat_errata errata_status, u_int *errata_list, u_int errata_count) { @@ -2356,9 +2356,11 @@ user_ctr_enable(const struct cpu_feat *feat __unused, WRITE_SPECIALREG(sctlr_el1, READ_SPECIALREG(sctlr_el1) & ~SCTLR_UCT); isb(); + + return (true); } -CPU_FEAT(trap_ctr, +CPU_FEAT(trap_ctr, "Trap CTR_EL0", user_ctr_check, user_ctr_has_errata, user_ctr_enable, CPU_FEAT_AFTER_DEV | CPU_FEAT_PER_CPU); diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c index 8a83185df9b1..c0aeae072570 100644 --- a/sys/arm64/arm64/machdep.c +++ b/sys/arm64/arm64/machdep.c @@ -182,7 +182,7 @@ pan_check(const struct cpu_feat *feat __unused, u_int midr __unused) return (ID_AA64MMFR1_PAN_VAL(id_aa64mfr1) != ID_AA64MMFR1_PAN_NONE); } -static void +static bool pan_enable(const struct cpu_feat *feat __unused, cpu_feat_errata errata_status __unused, u_int *errata_list __unused, u_int errata_count __unused) @@ -200,9 +200,11 @@ pan_enable(const struct cpu_feat *feat __unused, ".arch_extension pan \n" "msr pan, #1 \n" ".arch_extension nopan \n"); + + return (true); } -CPU_FEAT(feat_pan, +CPU_FEAT(feat_pan, "Privileged access never", pan_check, NULL, pan_enable, CPU_FEAT_EARLY_BOOT | CPU_FEAT_PER_CPU); diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index 77169e122106..96bde42d2711 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -1695,7 +1695,7 @@ pmap_dbm_has_errata(const struct cpu_feat *feat __unused, u_int midr, return (false); } -static void +static bool pmap_dbm_enable(const struct cpu_feat *feat __unused, cpu_feat_errata errata_status, u_int *errata_list __unused, u_int errata_count) @@ -1704,7 +1704,7 @@ pmap_dbm_enable(const struct cpu_feat *feat __unused, /* Skip if there is an erratum affecting DBM */ if (errata_status != ERRATA_NONE) - return; + return (false); tcr = READ_SPECIALREG(tcr_el1) | TCR_HD; WRITE_SPECIALREG(tcr_el1, tcr); @@ -1714,9 +1714,11 @@ pmap_dbm_enable(const struct cpu_feat *feat __unused, __asm __volatile("tlbi vmalle1"); dsb(nsh); isb(); + + return (true); } -CPU_FEAT(feat_hafdbs, +CPU_FEAT(feat_hafdbs, "Hardware management of the Access flag and dirty state", pmap_dbm_check, pmap_dbm_has_errata, pmap_dbm_enable, CPU_FEAT_AFTER_DEV | CPU_FEAT_PER_CPU); diff --git a/sys/arm64/arm64/ptrauth.c b/sys/arm64/arm64/ptrauth.c index 7f7a1dd41d8d..7f453dfa278d 100644 --- a/sys/arm64/arm64/ptrauth.c +++ b/sys/arm64/arm64/ptrauth.c @@ -141,7 +141,7 @@ out: return (false); } -static void +static bool ptrauth_enable(const struct cpu_feat *feat __unused, cpu_feat_errata errata_status __unused, u_int *errata_list __unused, u_int errata_count __unused) @@ -153,9 +153,11 @@ ptrauth_enable(const struct cpu_feat *feat __unused, elf64_addr_mask_14.code |= PAC_ADDR_MASK_14; elf64_addr_mask_14.data |= PAC_ADDR_MASK_14; #endif + + return (true); } -CPU_FEAT(feat_pauth, +CPU_FEAT(feat_pauth, "Pointer Authentication", ptrauth_check, NULL, ptrauth_enable, CPU_FEAT_EARLY_BOOT | CPU_FEAT_SYSTEM); diff --git a/sys/arm64/include/cpu_feat.h b/sys/arm64/include/cpu_feat.h index 6a0b2d78f526..f62f3e334dc1 100644 --- a/sys/arm64/include/cpu_feat.h +++ b/sys/arm64/include/cpu_feat.h @@ -29,6 +29,7 @@ #define _MACHINE_CPU_FEAT_H_ #include +#include typedef enum { ERRATA_UNKNOWN, /* Unknown erratum */ @@ -52,7 +53,7 @@ struct cpu_feat; typedef bool (cpu_feat_check)(const struct cpu_feat *, u_int); typedef bool (cpu_feat_has_errata)(const struct cpu_feat *, u_int, u_int **, u_int *); -typedef void (cpu_feat_enable)(const struct cpu_feat *, cpu_feat_errata, +typedef bool (cpu_feat_enable)(const struct cpu_feat *, cpu_feat_errata, u_int *, u_int); struct cpu_feat { @@ -61,18 +62,24 @@ struct cpu_feat { cpu_feat_has_errata *feat_has_errata; cpu_feat_enable *feat_enable; uint32_t feat_flags; + bool feat_enabled; }; SET_DECLARE(cpu_feat_set, struct cpu_feat); -#define CPU_FEAT(name, check, has_errata, enable, flags) \ +SYSCTL_DECL(_hw_feat); + +#define CPU_FEAT(name, descr, check, has_errata, enable, flags) \ static struct cpu_feat name = { \ .feat_name = #name, \ .feat_check = check, \ .feat_has_errata = has_errata, \ .feat_enable = enable, \ .feat_flags = flags, \ + .feat_enabled = false, \ }; \ -DATA_SET(cpu_feat_set, name) +DATA_SET(cpu_feat_set, name); \ +SYSCTL_BOOL(_hw_feat, OID_AUTO, name, CTLFLAG_RD, &name.feat_enabled, \ + 0, descr) /* * Allow drivers to mark an erratum as worked around, e.g. the Errata