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);

Reply via email to