Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F174400678
D31346.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D31346.diff
View Options
diff --git a/sys/arm64/arm64/identcpu.c b/sys/arm64/arm64/identcpu.c
--- a/sys/arm64/arm64/identcpu.c
+++ b/sys/arm64/arm64/identcpu.c
@@ -47,6 +47,7 @@
#include <machine/md_var.h>
#include <machine/undefined.h>
+static void print_cpu_midr(struct sbuf *sb, u_int cpu);
static void print_cpu_features(u_int cpu);
#ifdef COMPAT_FREEBSD32
static u_long parse_cpu_features_hwcap32(void);
@@ -116,13 +117,6 @@
static u_int cpu_aff_levels;
struct cpu_desc {
- u_int cpu_impl;
- u_int cpu_part_num;
- u_int cpu_variant;
- u_int cpu_revision;
- const char *cpu_impl_name;
- const char *cpu_part_name;
-
uint64_t mpidr;
uint64_t id_aa64afr0;
uint64_t id_aa64afr1;
@@ -169,7 +163,7 @@
u_int part_id;
const char *part_name;
};
-#define CPU_PART_NONE { 0, "Unknown Processor" }
+#define CPU_PART_NONE { 0, NULL }
struct cpu_implementers {
u_int impl_id;
@@ -180,7 +174,7 @@
*/
const struct cpu_parts *cpu_parts;
};
-#define CPU_IMPLEMENTER_NONE { 0, "Unknown Implementer", cpu_parts_none }
+#define CPU_IMPLEMENTER_NONE { 0, NULL, NULL }
/*
* Per-implementer table of (PartNum, CPU Name) pairs.
@@ -1435,7 +1429,6 @@
USER_REG(ID_AA64PFR0_EL1, id_aa64pfr0),
USER_REG(ID_AA64PFR1_EL1, id_aa64pfr1),
-
#ifdef COMPAT_FREEBSD32
USER_REG(ID_ISAR5_EL1, id_isar5),
@@ -1754,10 +1747,17 @@
static void
cpu_features_sysinit(void *dummy __unused)
{
+ struct sbuf sb;
u_int cpu;
CPU_FOREACH(cpu)
print_cpu_features(cpu);
+
+ /* Fill in cpu_model for the hw.model sysctl */
+ sbuf_new(&sb, cpu_model, sizeof(cpu_model), SBUF_FIXEDLEN);
+ print_cpu_midr(&sb, 0);
+ sbuf_finish(&sb);
+ sbuf_delete(&sb);
}
/* Log features before APs are released and start printing to the dmesg. */
SYSINIT(cpu_features, SI_SUB_SMP - 1, SI_ORDER_ANY, cpu_features_sysinit, NULL);
@@ -1879,15 +1879,64 @@
print_register(sb, reg_name, reg, print_id_fields, fields);
}
+static void
+print_cpu_midr(struct sbuf *sb, u_int cpu)
+{
+ const struct cpu_parts *cpu_partsp;
+ const char *cpu_impl_name;
+ const char *cpu_part_name;
+ u_int midr;
+ u_int impl_id;
+ u_int part_id;
+
+ midr = pcpu_find(cpu)->pc_midr;
+
+ cpu_impl_name = NULL;
+ cpu_partsp = NULL;
+ impl_id = CPU_IMPL(midr);
+ for (int i = 0; cpu_implementers[i].impl_name != NULL; i++) {
+ if (impl_id == cpu_implementers[i].impl_id) {
+ cpu_impl_name = cpu_implementers[i].impl_name;
+ cpu_partsp = cpu_implementers[i].cpu_parts;
+ break;
+ }
+ }
+ /* Unknown implementer, so unknown part */
+ if (cpu_impl_name == NULL) {
+ sbuf_printf(sb, "Unknown Implementer (midr: %08x)", midr);
+ return;
+ }
+
+ KASSERT(cpu_partsp != NULL, ("%s: No parts table for implementer %s",
+ __func__, cpu_impl_name));
+
+ cpu_part_name = NULL;
+ part_id = CPU_PART(midr);
+ for (int i = 0; cpu_partsp[i].part_name != NULL; i++) {
+ if (part_id == cpu_partsp[i].part_id) {
+ cpu_part_name = cpu_partsp[i].part_name;
+ break;
+ }
+ }
+ /* Known Implementer, Unknown part */
+ if (cpu_part_name == NULL) {
+ sbuf_printf(sb, "%s Unknown CPU r%dp%d (midr: %08x)",
+ cpu_impl_name, CPU_VAR(midr), CPU_REV(midr), midr);
+ return;
+ }
+
+ sbuf_printf(sb, "%s %s r%dp%d", cpu_impl_name,
+ cpu_part_name, CPU_VAR(midr), CPU_REV(midr));
+}
+
static void
print_cpu_features(u_int cpu)
{
struct sbuf *sb;
sb = sbuf_new_auto();
- sbuf_printf(sb, "CPU%3d: %s %s r%dp%d", cpu,
- cpu_desc[cpu].cpu_impl_name, cpu_desc[cpu].cpu_part_name,
- cpu_desc[cpu].cpu_variant, cpu_desc[cpu].cpu_revision);
+ sbuf_printf(sb, "CPU%3u: ", cpu);
+ print_cpu_midr(sb, cpu);
sbuf_cat(sb, " affinity:");
switch(cpu_aff_levels) {
@@ -2058,43 +2107,6 @@
void
identify_cpu(u_int cpu)
{
- u_int midr;
- u_int impl_id;
- u_int part_id;
- size_t i;
- const struct cpu_parts *cpu_partsp = NULL;
-
- midr = get_midr();
-
- impl_id = CPU_IMPL(midr);
- for (i = 0; i < nitems(cpu_implementers); i++) {
- if (impl_id == cpu_implementers[i].impl_id ||
- cpu_implementers[i].impl_id == 0) {
- cpu_desc[cpu].cpu_impl = impl_id;
- cpu_desc[cpu].cpu_impl_name =
- cpu_implementers[i].impl_name;
- cpu_partsp = cpu_implementers[i].cpu_parts;
- break;
- }
- }
-
- part_id = CPU_PART(midr);
- for (i = 0; &cpu_partsp[i] != NULL; i++) {
- if (part_id == cpu_partsp[i].part_id ||
- cpu_partsp[i].part_id == 0) {
- cpu_desc[cpu].cpu_part_num = part_id;
- cpu_desc[cpu].cpu_part_name = cpu_partsp[i].part_name;
- break;
- }
- }
-
- cpu_desc[cpu].cpu_revision = CPU_REV(midr);
- cpu_desc[cpu].cpu_variant = CPU_VAR(midr);
-
- snprintf(cpu_model, sizeof(cpu_model), "%s %s r%dp%d",
- cpu_desc[cpu].cpu_impl_name, cpu_desc[cpu].cpu_part_name,
- cpu_desc[cpu].cpu_variant, cpu_desc[cpu].cpu_revision);
-
/* Save affinity for current CPU */
cpu_desc[cpu].mpidr = get_mpidr();
CPU_AFFINITY(cpu) = cpu_desc[cpu].mpidr & CPU_AFF_MASK;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Oct 3, 10:39 PM (3 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40158200
Default Alt Text
D31346.diff (4 KB)
Attached To
Mode
D31346: Only store the arm64 ID registers in the cpu_desc
Attached
Detach File
Event Timeline
Log In to Comment