Can you try the following diff ?
The identifycpu diff caused a problem on acpi resume but it was fixed,
this reverts the whole thing.
Index: identcpu.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/identcpu.c,v
retrieving revision 1.36
retrieving revision 1.34
diff -d -u -p -r1.36 -r1.34
--- identcpu.c 22 Apr 2012 19:36:09 -0000 1.36
+++ identcpu.c 8 Jan 2012 14:39:26 -0000 1.34
@@ -1,4 +1,4 @@
-/* $OpenBSD: identcpu.c,v 1.36 2012/04/22 19:36:09 haesbaert Exp $ */
+/* $OpenBSD: identcpu.c,v 1.34 2012/01/08 14:39:26 haesbaert Exp $ */
/* $NetBSD: identcpu.c,v 1.1 2003/04/26 18:39:28 fvdl Exp $ */
/*
@@ -302,31 +302,27 @@ identifycpu(struct cpu_info *ci)
u_int64_t last_tsc;
u_int32_t dummy, val, pnfeatset;
u_int32_t brand[12];
- char mycpu_model[48];
+ u_int32_t vendor[4];
int i, max;
char *brandstr_from, *brandstr_to;
int skipspace;
CPUID(1, ci->ci_signature, val, dummy, ci->ci_feature_flags);
CPUID(0x80000000, pnfeatset, dummy, dummy, dummy);
- if (pnfeatset >= 0x80000001) {
- u_int32_t ecx;
-
+ if (pnfeatset >= 0x80000001)
CPUID(0x80000001, dummy, dummy,
- ecx, ci->ci_feature_eflags);
- if (ci->ci_flags & CPUF_PRIMARY)
- ecpu_ecxfeature = ecx;
- /* Let cpu_fature be the common bits */
- cpu_feature &= ci->ci_feature_flags;
- }
+ ecpu_ecxfeature, ci->ci_feature_eflags);
+ vendor[3] = 0;
+ CPUID(0, dummy, vendor[0], vendor[2], vendor[1]); /* yup, 0 2 1 */
CPUID(0x80000002, brand[0], brand[1], brand[2], brand[3]);
CPUID(0x80000003, brand[4], brand[5], brand[6], brand[7]);
CPUID(0x80000004, brand[8], brand[9], brand[10], brand[11]);
- strlcpy(mycpu_model, (char *)brand, sizeof(mycpu_model));
- /* Remove leading and duplicated spaces from mycpu_model */
- brandstr_from = brandstr_to = mycpu_model;
+ strlcpy(cpu_model, (char *)brand, sizeof(cpu_model));
+
+ /* Remove leading and duplicated spaces from cpu_model */
+ brandstr_from = brandstr_to = cpu_model;
skipspace = 1;
while (*brandstr_from != '\0') {
if (!skipspace || *brandstr_from != ' ') {
@@ -339,13 +335,8 @@ identifycpu(struct cpu_info *ci)
}
*brandstr_to = '\0';
- if (mycpu_model[0] == 0)
- strlcpy(mycpu_model, "Opteron or Athlon 64",
- sizeof(mycpu_model));
-
- /* If primary cpu, fill in the global cpu_model used by sysctl */
- if (ci->ci_flags & CPUF_PRIMARY)
- strlcpy(cpu_model, mycpu_model, sizeof(cpu_model));
+ if (cpu_model[0] == 0)
+ strlcpy(cpu_model, "Opteron or Athlon 64", sizeof(cpu_model));
ci->ci_family = (ci->ci_signature >> 8) & 0x0f;
ci->ci_model = (ci->ci_signature >> 4) & 0x0f;
@@ -360,16 +351,13 @@ identifycpu(struct cpu_info *ci)
amd_cpu_cacheinfo(ci);
- printf("%s: %s", ci->ci_dev->dv_xname, mycpu_model);
+ printf("%s: %s", ci->ci_dev->dv_xname, cpu_model);
if (ci->ci_tsc_freq != 0)
printf(", %lu.%02lu MHz", (ci->ci_tsc_freq + 4999) / 1000000,
((ci->ci_tsc_freq + 4999) / 10000) % 100);
-
- if (ci->ci_flags & CPUF_PRIMARY) {
- cpuspeed = (ci->ci_tsc_freq + 4999) / 1000000;
- cpu_cpuspeed = cpu_amd64speed;
- }
+ cpuspeed = (ci->ci_tsc_freq + 4999) / 1000000;
+ cpu_cpuspeed = cpu_amd64speed;
printf("\n%s: ", ci->ci_dev->dv_xname);
@@ -395,25 +383,25 @@ identifycpu(struct cpu_info *ci)
x86_print_cacheinfo(ci);
#ifndef SMALL_KERNEL
- if (ci->ci_flags & CPUF_PRIMARY) {
- if (pnfeatset > 0x80000007) {
- CPUID(0x80000007, dummy, dummy, dummy, pnfeatset);
+ if (pnfeatset > 0x80000007) {
+ CPUID(0x80000007, dummy, dummy, dummy, pnfeatset);
- if (pnfeatset & 0x06) {
- if ((ci->ci_signature & 0xF00) == 0xf00)
- setperf_setup = k8_powernow_init;
- }
- if (ci->ci_family >= 0x10)
- setperf_setup = k1x_init;
+ if (pnfeatset & 0x06) {
+ if ((ci->ci_signature & 0xF00) == 0xf00)
+ setperf_setup = k8_powernow_init;
}
+ if (ci->ci_family >= 0x10)
+ setperf_setup = k1x_init;
+ }
- if (cpu_ecxfeature & CPUIDECX_EST)
- setperf_setup = est_init;
-
- if (cpu_ecxfeature & CPUIDECX_AES)
- amd64_has_aesni = 1;
+ if (cpu_ecxfeature & CPUIDECX_EST) {
+ setperf_setup = est_init;
}
- if (!strncmp(mycpu_model, "Intel", 5)) {
+
+ if (cpu_ecxfeature & CPUIDECX_AES)
+ amd64_has_aesni = 1;
+
+ if (!strncmp(cpu_model, "Intel", 5)) {
u_int32_t cflushsz;
CPUID(0x01, dummy, cflushsz, dummy, dummy);
@@ -432,10 +420,13 @@ identifycpu(struct cpu_info *ci)
#endif
- if (!strcmp(cpu_vendor, "AuthenticAMD"))
+
+ /* AuthenticAMD: h t u A i t n e */
+ if (vendor[0] == 0x68747541 && vendor[1] == 0x69746e65 &&
+ vendor[2] == 0x444d4163) /* DMAc */
amd64_errata(ci);
- if (strncmp(mycpu_model, "VIA Nano processor", 18) == 0) {
+ if (strncmp(cpu_model, "VIA Nano processor", 18) == 0) {
ci->cpu_setup = via_nano_setup;
#ifndef SMALL_KERNEL
strlcpy(ci->ci_sensordev.xname, ci->ci_dev->dv_xname,
@@ -446,4 +437,11 @@ identifycpu(struct cpu_info *ci)
sensordev_install(&ci->ci_sensordev);
#endif
}
+}
+
+void
+cpu_probe_features(struct cpu_info *ci)
+{
+ ci->ci_feature_flags = cpu_feature;
+ ci->ci_signature = 0;
}
Index: cpu.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/cpu.c,v
retrieving revision 1.47
retrieving revision 1.45
diff -d -u -p -r1.47 -r1.45
--- cpu.c 4 Apr 2012 18:44:22 -0000 1.47
+++ cpu.c 25 Feb 2012 00:12:07 -0000 1.45
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.c,v 1.47 2012/04/04 18:44:22 mikeb Exp $ */
+/* $OpenBSD: cpu.c,v 1.45 2012/02/25 00:12:07 haesbaert Exp $ */
/* $NetBSD: cpu.c,v 1.1 2003/04/26 18:39:26 fvdl Exp $ */
/*-
@@ -333,6 +333,7 @@ cpu_attach(struct device *parent, struct
cpu_start_secondary(ci);
ncpus++;
if (ci->ci_flags & CPUF_PRESENT) {
+ identifycpu(ci);
ci->ci_next = cpu_info_list->ci_next;
cpu_info_list->ci_next = ci;
}
@@ -445,18 +446,6 @@ cpu_start_secondary(struct cpu_info *ci)
#endif
}
- if ((ci->ci_flags & CPUF_IDENTIFIED) == 0) {
- atomic_setbits_int(&ci->ci_flags, CPUF_IDENTIFY);
-
- /* wait for it to identify */
- for (i = 100000; (ci->ci_flags & CPUF_IDENTIFY) && i > 0; i--)
- delay(10);
-
- if (ci->ci_flags & CPUF_IDENTIFY)
- printf("%s: failed to identify\n",
- ci->ci_dev->dv_xname);
- }
-
CPU_START_CLEANUP(ci);
}
@@ -495,6 +484,9 @@ cpu_hatch(void *v)
cpu_init_msrs(ci);
+ cpu_probe_features(ci);
+ cpu_feature &= ci->ci_feature_flags;
+
#ifdef DEBUG
if (ci->ci_flags & CPUF_PRESENT)
panic("%s: already running!?", ci->ci_dev->dv_xname);
@@ -504,22 +496,6 @@ cpu_hatch(void *v)
lapic_enable();
lapic_startclock();
-
- if ((ci->ci_flags & CPUF_IDENTIFIED) == 0) {
- /*
- * We need to wait until we can identify, otherwise dmesg
- * output will be messy.
- */
- while ((ci->ci_flags & CPUF_IDENTIFY) == 0)
- delay(10);
-
- identifycpu(ci);
-
- /* Signal we're done */
- atomic_clearbits_int(&ci->ci_flags, CPUF_IDENTIFY);
- /* Prevent identifycpu() from running again */
- atomic_setbits_int(&ci->ci_flags, CPUF_IDENTIFIED);
- }
while ((ci->ci_flags & CPUF_GO) == 0)
delay(10);
Index: cpu.h
Index: ../include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/cpu.h,v
retrieving revision 1.72
retrieving revision 1.70
diff -d -u -p -r1.72 -r1.70
--- ../include/cpu.h 4 Apr 2012 18:44:22 -0000 1.72
+++ ../include/cpu.h 26 Dec 2011 23:07:04 -0000 1.70
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.h,v 1.72 2012/04/04 18:44:22 mikeb Exp $ */
+/* $OpenBSD: cpu.h,v 1.70 2011/12/26 23:07:04 haesbaert Exp $ */
/* $NetBSD: cpu.h,v 1.1 2003/04/26 18:39:39 fvdl Exp $ */
/*-
@@ -135,9 +135,6 @@ struct cpu_info {
#define CPUF_SP 0x0004 /* CPU is only processor */
#define CPUF_PRIMARY 0x0008 /* CPU is active primary processor */
-#define CPUF_IDENTIFY 0x0010 /* CPU may now identify */
-#define CPUF_IDENTIFIED 0x0020 /* CPU has been identified */
-
#define CPUF_PRESENT 0x1000 /* CPU is present */
#define CPUF_RUNNING 0x2000 /* CPU is running */
#define CPUF_PAUSE 0x4000 /* CPU is paused in DDB */
@@ -267,6 +264,7 @@ extern int cpuspeed;
/* identcpu.c */
void identifycpu(struct cpu_info *);
int cpu_amd64speed(int *);
+void cpu_probe_features(struct cpu_info *);
/* machdep.c */
void dumpconf(void);