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)