NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
re: bin/41289: usr.sbin/cpuctl does not correctly identify new Intel CPUs
The following reply was made to PR bin/41289; it has been noted by GNATS.
From: Paul Goyette <paul%whooppee.com@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: pgoyette%NetBSD.org@localhost, gnats-admin%netbsd.org@localhost,
netbsd-bugs%netbsd.org@localhost
Subject: re: bin/41289: usr.sbin/cpuctl does not correctly identify new Intel
CPUs
Date: Mon, 27 Apr 2009 17:25:26 -0700 (PDT)
On Tue, 28 Apr 2009, matthew green wrote:
> The following reply was made to PR bin/41289; it has been noted by GNATS.
>
> From: matthew green <mrg%eterna.com.au@localhost>
> To: gnats-bugs%NetBSD.org@localhost
> Cc: gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost
> Subject: re: bin/41289: usr.sbin/cpuctl does not correctly identify new
> Intel CPUs
> Date: Tue, 28 Apr 2009 10:06:52 +1000
>
> hmm, i thought i send a PR about this already, but apparently not.
>
> this is an ugly patch i've been using... it needs work before i was
> even going to consider commiting it however..
Yeah, that's a bit ugly and it assumes that family 6 is the only one
that will ever have extended models.
I was thinking more along the lines of adding a pointer to the existing
entries. This would point to an array of arbitrary number of
struct ext_model_names {
int ext_model;
const char *ext_name[MAX_MODEL];
}
(with the end of array indicated by ext_model == 0).
Then the probe routine can check the extended model (in pseudocode)
if (CPUID2EXTMODEL(xxx) != 0)
if (ext_model_ptr != NULL)
scan thru *ext_model_ptr for matching ext_model
select proper name
else
/* extended id, but no extension names */
use a default value
else
do-what-we-do-already
>
>
> .mrg.
>
>
> Index: arch/i386.c
> ===================================================================
> RCS file: /cvsroot/src/usr.sbin/cpuctl/arch/i386.c,v
> retrieving revision 1.16
> diff -p -r1.16 i386.c
> *** arch/i386.c 16 Mar 2009 12:25:40 -0000 1.16
> --- arch/i386.c 28 Apr 2009 00:06:24 -0000
> *************** struct cpu_cpuid_nameclass {
> *** 133,139 ****
> void (*cpu_setup)(struct cpu_info *);
> void (*cpu_probe)(struct cpu_info *);
> void (*cpu_info)(struct cpu_info *);
> ! } cpu_family[CPU_MAXFAMILY - CPU_MINFAMILY + 1];
> };
>
> static const struct x86_cache_info intel_cpuid_cache_info[] =
> INTEL_CACHE_INFO;
> --- 133,139 ----
> void (*cpu_setup)(struct cpu_info *);
> void (*cpu_probe)(struct cpu_info *);
> void (*cpu_info)(struct cpu_info *);
> ! } cpu_family[CPU_MAXFAMILY - CPU_MINFAMILY + 1 /* XXX */ + 1];
> };
>
> static const struct x86_cache_info intel_cpuid_cache_info[] =
> INTEL_CACHE_INFO;
> *************** const struct cpu_cpuid_nameclass i386_cp
> *** 303,308 ****
> --- 303,323 ----
> NULL,
> intel_family_new_probe,
> NULL,
> + },
> + /* Extended Model 1, Family 6 */
> + {
> + CPUCLASS_686,
> + {
> + 0, 0, 0, 0, 0, 0, 0,
> + "Core2 (Yorkfield)",
> + 0, 0,
> + "Core2 (Wolfdale)",
> + 0, 0, 0, 0, 0,
> + "Core2" /* Default */
> + },
> + NULL,
> + intel_family_new_probe,
> + NULL,
> } }
> },
> {
> *************** identifycpu(const char *cpuname)
> *** 1183,1189 ****
> {
> const char *name, *modifier, *vendorname, *brand = "";
> int class = CPUCLASS_386, i, xmax;
> ! int modif, family, model;
> const struct cpu_cpuid_nameclass *cpup = NULL;
> const struct cpu_cpuid_family *cpufam;
> const char *feature_str[5];
> --- 1198,1204 ----
> {
> const char *name, *modifier, *vendorname, *brand = "";
> int class = CPUCLASS_386, i, xmax;
> ! int modif, family, model, extmodel;
> const struct cpu_cpuid_nameclass *cpup = NULL;
> const struct cpu_cpuid_family *cpufam;
> const char *feature_str[5];
> *************** identifycpu(const char *cpuname)
> *** 1216,1221 ****
> --- 1231,1237 ----
> family = CPUID2FAMILY(ci->ci_signature);
> if (family < CPU_MINFAMILY)
> errx(1, "identifycpu: strange family value");
> + extmodel = CPUID2EXTMODEL(ci->ci_signature);
> model = CPUID2MODEL(ci->ci_signature);
>
> for (i = 0; i < xmax; i++) {
> *************** identifycpu(const char *cpuname)
> *** 1242,1248 ****
> cpu_vendor = cpup->cpu_vendor;
> vendorname = cpup->cpu_vendorname;
> modifier = modifiers[modif];
> ! if (family > CPU_MAXFAMILY) {
> family = CPU_MAXFAMILY;
> model = CPU_DEFMODEL;
> } else if (model > CPU_MAXMODEL)
> --- 1258,1270 ----
> cpu_vendor = cpup->cpu_vendor;
> vendorname = cpup->cpu_vendorname;
> modifier = modifiers[modif];
> ! if (cpu_vendor == CPUVENDOR_INTEL) {
> ! /* XXX */
> ! if (extmodel == 1 && family == 6) {
> ! family = CPU_MAXFAMILY + 1;
> ! model =
> CPUID2STEPPING(ci->ci_signature);
> ! }
> ! } else if (family > CPU_MAXFAMILY) {
> family = CPU_MAXFAMILY;
> model = CPU_DEFMODEL;
> } else if (model > CPU_MAXMODEL)
>
>
-------------------------------------------------------------------------
| Paul Goyette | PGP DSS Key fingerprint: | E-mail addresses: |
| Customer Service | FA29 0E3B 35AF E8AE 6651 | paul at whooppee.com |
| Network Engineer | 0786 F758 55DE 53BA 7731 | pgoyette at juniper.net |
| Kernel Developer | | pgoyette at netbsd.org |
-------------------------------------------------------------------------
Home |
Main Index |
Thread Index |
Old Index