git: 62f8d65ee4d0 - main - arm64: Move FEAT_PAN to the cpu feat framework

From: Andrew Turner <andrew_at_FreeBSD.org>
Date: Fri, 24 Jan 2025 12:11:52 UTC
The branch main has been updated by andrew:

URL: https://cgit.FreeBSD.org/src/commit/?id=62f8d65ee4d0178f670a0930736d3628d06746fb

commit 62f8d65ee4d0178f670a0930736d3628d06746fb
Author:     Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2025-01-24 11:42:48 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2025-01-24 12:09:28 +0000

    arm64: Move FEAT_PAN to the cpu feat framework
    
    Use the common framework rather than custom functions called on each
    CPU.
    
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D47816
---
 sys/arm64/arm64/machdep.c    | 38 ++++++++++++++++++++++----------------
 sys/arm64/arm64/mp_machdep.c |  1 -
 sys/arm64/include/cpufunc.h  |  2 --
 3 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c
index db223e011c67..0a925842dba4 100644
--- a/sys/arm64/arm64/machdep.c
+++ b/sys/arm64/arm64/machdep.c
@@ -173,35 +173,43 @@ SYSINIT(ssp_warn, SI_SUB_COPYRIGHT, SI_ORDER_ANY, print_ssp_warning, NULL);
 SYSINIT(ssp_warn2, SI_SUB_LAST, SI_ORDER_ANY, print_ssp_warning, NULL);
 #endif
 
-static void
-pan_setup(void)
+static bool
+pan_check(const struct cpu_feat *feat __unused, u_int midr __unused)
 {
 	uint64_t id_aa64mfr1;
 
 	id_aa64mfr1 = READ_SPECIALREG(id_aa64mmfr1_el1);
-	if (ID_AA64MMFR1_PAN_VAL(id_aa64mfr1) != ID_AA64MMFR1_PAN_NONE)
-		has_pan = 1;
+	return (ID_AA64MMFR1_PAN_VAL(id_aa64mfr1) != ID_AA64MMFR1_PAN_NONE);
 }
 
-void
-pan_enable(void)
+static void
+pan_enable(const struct cpu_feat *feat __unused,
+    cpu_feat_errata errata_status __unused, u_int *errata_list __unused,
+    u_int errata_count __unused)
 {
+	has_pan = 1;
 
 	/*
 	 * This sets the PAN bit, stopping the kernel from accessing
 	 * memory when userspace can also access it unless the kernel
 	 * uses the userspace load/store instructions.
 	 */
-	if (has_pan) {
-		WRITE_SPECIALREG(sctlr_el1,
-		    READ_SPECIALREG(sctlr_el1) & ~SCTLR_SPAN);
-		__asm __volatile(
-		    ".arch_extension pan	\n"
-		    "msr pan, #1		\n"
-		    ".arch_extension nopan	\n");
-	}
+	WRITE_SPECIALREG(sctlr_el1,
+	    READ_SPECIALREG(sctlr_el1) & ~SCTLR_SPAN);
+	__asm __volatile(
+	    ".arch_extension pan	\n"
+	    "msr pan, #1		\n"
+	    ".arch_extension nopan	\n");
 }
 
+static struct cpu_feat feat_pan = {
+	.feat_name		= "FEAT_PAN",
+	.feat_check		= pan_check,
+	.feat_enable		= pan_enable,
+	.feat_flags		= CPU_FEAT_EARLY_BOOT | CPU_FEAT_PER_CPU,
+};
+DATA_SET(cpu_feat_set, feat_pan);
+
 bool
 has_hyp(void)
 {
@@ -964,7 +972,6 @@ initarm(struct arm64_bootparams *abp)
 	init_param1();
 
 	cache_setup();
-	pan_setup();
 
 	/* Bootstrap enough of pmap  to enter the kernel proper */
 	pmap_bootstrap(lastaddr - KERNBASE);
@@ -1029,7 +1036,6 @@ initarm(struct arm64_bootparams *abp)
 	if ((boothowto & RB_KDB) != 0)
 		kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger");
 #endif
-	pan_enable();
 
 	kcsan_cpu_init(0);
 	kasan_init();
diff --git a/sys/arm64/arm64/mp_machdep.c b/sys/arm64/arm64/mp_machdep.c
index 987ff9ac1ceb..d052033d9575 100644
--- a/sys/arm64/arm64/mp_machdep.c
+++ b/sys/arm64/arm64/mp_machdep.c
@@ -256,7 +256,6 @@ init_secondary(uint64_t cpu)
 #endif
 
 	dbg_init();
-	pan_enable();
 
 	mtx_lock_spin(&ap_boot_mtx);
 	atomic_add_rel_32(&smp_cpus, 1);
diff --git a/sys/arm64/include/cpufunc.h b/sys/arm64/include/cpufunc.h
index c948799eb7b9..e6e1f682794e 100644
--- a/sys/arm64/include/cpufunc.h
+++ b/sys/arm64/include/cpufunc.h
@@ -41,8 +41,6 @@ breakpoint(void)
 #ifdef _KERNEL
 #include <machine/armreg.h>
 
-void pan_enable(void);
-
 static __inline register_t
 dbg_disable(void)
 {