Date: Thu, 4 Sep 2025 16:28:47 GMT From: Andrew Turner <andrew@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 9204a315a71c - main - arm64: Add a sysctl to see if features are enabled Message-ID: <202509041628.584GSlpZ033069@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=9204a315a71c5aa9a9b8c11f2dcefb155dd5fc34 commit 9204a315a71c5aa9a9b8c11f2dcefb155dd5fc34 Author: Andrew Turner <andrew@FreeBSD.org> AuthorDate: 2025-09-04 14:44:31 +0000 Commit: Andrew Turner <andrew@FreeBSD.org> 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 <machine/cpu.h> #include <machine/cpu_feat.h> +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 <sys/linker_set.h> +#include <sys/sysctl.h> 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202509041628.584GSlpZ033069>