On Tue, May 22, 2012 at 7:06 AM, Christiano F. Haesbaert
<[email protected]> wrote:
> Can you try the following diff ?
Did not fix the problem.
The March snapshot I was running was an SP kernel. The HDD came out of
a laptop with a single core; the MP kernel was never installed for me
to try it, when I moved the HDD to this laptop.
Let me know if you have other ideas,
--patrick
> 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);