Module Name: src
Committed By: ryo
Date: Thu May 3 15:47:22 UTC 2018
Modified Files:
src/sys/arch/aarch64/aarch64: aarch64_machdep.c
Log Message:
add sysctl for
machdep.{cpu_id,id_revidr,id_mvfr,id_mpidr,id_aa64isar,id_aa64mmfr,id_aa64pfr}
each corresponding to system registers MIDR_EL1, REVIDR_EL1, MVFR*_EL1,
MPIDR_EL1, ID_AA64ISAR*_EL1, ID_AA64MMFR*_EL1, ID_AA64PFR*_EL1.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/aarch64/aarch64/aarch64_machdep.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/aarch64/aarch64/aarch64_machdep.c
diff -u src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.2 src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.3
--- src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.2 Sun Apr 1 04:35:03 2018
+++ src/sys/arch/aarch64/aarch64/aarch64_machdep.c Thu May 3 15:47:22 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: aarch64_machdep.c,v 1.2 2018/04/01 04:35:03 ryo Exp $ */
+/* $NetBSD: aarch64_machdep.c,v 1.3 2018/05/03 15:47:22 ryo Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.2 2018/04/01 04:35:03 ryo Exp $");
+__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.3 2018/05/03 15:47:22 ryo Exp $");
#include "opt_arm_debug.h"
#include "opt_ddb.h"
@@ -41,6 +41,7 @@ __KERNEL_RCSID(1, "$NetBSD: aarch64_mach
#include <sys/bus.h>
#include <sys/kauth.h>
#include <sys/msgbuf.h>
+#include <sys/sysctl.h>
#include <dev/mm.h>
@@ -63,6 +64,15 @@ char cpu_model[32];
char machine[] = MACHINE;
char machine_arch[] = MACHINE_ARCH;
+/* sysctl node num */
+static int sysctlnode_machdep_cpu_id;
+static int sysctlnode_machdep_id_revidr;
+static int sysctlnode_machdep_id_mvfr;
+static int sysctlnode_machdep_id_mpidr;
+static int sysctlnode_machdep_id_aa64isar;
+static int sysctlnode_machdep_id_aa64mmfr;
+static int sysctlnode_machdep_id_aa64pfr;
+
const pcu_ops_t * const pcu_ops_md_defs[PCU_UNIT_COUNT] = {
[PCU_FPU] = &pcu_fpu_ops
};
@@ -251,6 +261,130 @@ initarm_common(vaddr_t kvm_base, vsize_t
return tf;
}
+/*
+ * machine dependent system variables.
+ */
+static int
+aarch64_sysctl_machdep_sysreg_helper(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node;
+ uint64_t databuf[8];
+ void *data;
+
+ node = *rnode;
+ node.sysctl_data = data = &databuf;
+
+ /*
+ * Don't keep values in advance due to system registers may have
+ * different values on each CPU cores. (e.g. big.LITTLE)
+ */
+ if (rnode->sysctl_num == sysctlnode_machdep_cpu_id) {
+ ((uint32_t *)data)[0] = reg_midr_el1_read();
+ node.sysctl_size = sizeof(uint32_t);
+
+ } else if (rnode->sysctl_num == sysctlnode_machdep_id_revidr) {
+ ((uint32_t *)data)[0] = reg_revidr_el1_read();
+ node.sysctl_size = sizeof(uint32_t);
+
+ } else if (rnode->sysctl_num == sysctlnode_machdep_id_mvfr) {
+ ((uint32_t *)data)[0] = reg_mvfr0_el1_read();
+ ((uint32_t *)data)[1] = reg_mvfr1_el1_read();
+ ((uint32_t *)data)[2] = reg_mvfr2_el1_read();
+ node.sysctl_size = sizeof(uint32_t) * 3;
+
+ } else if (rnode->sysctl_num == sysctlnode_machdep_id_mpidr) {
+ ((uint64_t *)data)[0] = reg_mpidr_el1_read();
+ node.sysctl_size = sizeof(uint64_t);
+
+ } else if (rnode->sysctl_num == sysctlnode_machdep_id_aa64isar) {
+ ((uint64_t *)data)[0] = reg_id_aa64isar0_el1_read();
+ ((uint64_t *)data)[1] = reg_id_aa64isar1_el1_read();
+ node.sysctl_size = sizeof(uint64_t) * 2;
+
+ } else if (rnode->sysctl_num == sysctlnode_machdep_id_aa64mmfr) {
+ ((uint64_t *)data)[0] = reg_id_aa64mmfr0_el1_read();
+ ((uint64_t *)data)[1] = reg_id_aa64mmfr1_el1_read();
+ node.sysctl_size = sizeof(uint64_t) * 2;
+
+ } else if (rnode->sysctl_num == sysctlnode_machdep_id_aa64pfr) {
+ ((uint64_t *)data)[0] = reg_id_aa64pfr0_el1_read();
+ ((uint64_t *)data)[1] = reg_id_aa64pfr1_el1_read();
+ node.sysctl_size = sizeof(uint64_t) * 2;
+
+ } else {
+ return EOPNOTSUPP;
+ }
+
+ return sysctl_lookup(SYSCTLFN_CALL(&node));
+}
+
+SYSCTL_SETUP(sysctl_machdep_setup, "sysctl machdep subtree setup")
+{
+ const struct sysctlnode *node;
+
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE, "machdep", NULL,
+ NULL, 0, NULL, 0, CTL_MACHDEP, CTL_EOL);
+
+ sysctl_createv(clog, 0, NULL, &node,
+ CTLFLAG_PERMANENT|CTLFLAG_READONLY, CTLTYPE_INT,
+ "cpu_id",
+ SYSCTL_DESCR("MIDR_EL1, Main ID Register"),
+ aarch64_sysctl_machdep_sysreg_helper, 0, NULL, 0,
+ CTL_MACHDEP, CTL_CREATE, CTL_EOL);
+ sysctlnode_machdep_cpu_id = node->sysctl_num;
+
+ sysctl_createv(clog, 0, NULL, &node,
+ CTLFLAG_PERMANENT|CTLFLAG_READONLY, CTLTYPE_INT,
+ "id_revidr",
+ SYSCTL_DESCR("REVIDR_EL1, Revision ID Register"),
+ aarch64_sysctl_machdep_sysreg_helper, 0, NULL, 0,
+ CTL_MACHDEP, CTL_CREATE, CTL_EOL);
+ sysctlnode_machdep_id_revidr = node->sysctl_num;
+
+ sysctl_createv(clog, 0, NULL, &node,
+ CTLFLAG_PERMANENT|CTLFLAG_READONLY, CTLTYPE_STRUCT,
+ "id_mvfr",
+ SYSCTL_DESCR("MVFRn_EL1, Media and VFP Feature Registers"),
+ aarch64_sysctl_machdep_sysreg_helper, 0, NULL, 0,
+ CTL_MACHDEP, CTL_CREATE, CTL_EOL);
+ sysctlnode_machdep_id_mvfr = node->sysctl_num;
+
+ sysctl_createv(clog, 0, NULL, &node,
+ CTLFLAG_PERMANENT|CTLFLAG_READONLY, CTLTYPE_STRUCT,
+ "id_mpidr",
+ SYSCTL_DESCR("MPIDR_EL1, Multiprocessor Affinity Register"),
+ aarch64_sysctl_machdep_sysreg_helper, 0, NULL, 0,
+ CTL_MACHDEP, CTL_CREATE, CTL_EOL);
+ sysctlnode_machdep_id_mpidr = node->sysctl_num;
+
+ sysctl_createv(clog, 0, NULL, &node,
+ CTLFLAG_PERMANENT|CTLFLAG_READONLY, CTLTYPE_STRUCT,
+ "id_aa64isar",
+ SYSCTL_DESCR("ID_AA64ISARn_EL1, "
+ "AArch64 Instruction Set Attribute Registers"),
+ aarch64_sysctl_machdep_sysreg_helper, 0, NULL, 0,
+ CTL_MACHDEP, CTL_CREATE, CTL_EOL);
+ sysctlnode_machdep_id_aa64isar = node->sysctl_num;
+
+ sysctl_createv(clog, 0, NULL, &node,
+ CTLFLAG_PERMANENT|CTLFLAG_READONLY, CTLTYPE_STRUCT,
+ "id_aa64mmfr",
+ SYSCTL_DESCR("ID_AA64MMFRn_EL1, "
+ "AArch64 Memory Model Feature Registers"),
+ aarch64_sysctl_machdep_sysreg_helper, 0, NULL, 0,
+ CTL_MACHDEP, CTL_CREATE, CTL_EOL);
+ sysctlnode_machdep_id_aa64mmfr = node->sysctl_num;
+
+ sysctl_createv(clog, 0, NULL, &node,
+ CTLFLAG_PERMANENT|CTLFLAG_READONLY, CTLTYPE_STRUCT,
+ "id_aa64pfr",
+ SYSCTL_DESCR("ID_AA64PFRn_EL1, "
+ "AArch64 Processor Feature Registers"),
+ aarch64_sysctl_machdep_sysreg_helper, 0, NULL, 0,
+ CTL_MACHDEP, CTL_CREATE, CTL_EOL);
+ sysctlnode_machdep_id_aa64pfr = node->sysctl_num;
+}
void
parse_mi_bootargs(char *args)