1
0
Fork 0
mirror of https://github.com/anrieff/libcpuid synced 2025-06-07 00:51:40 +00:00

Merge upstream changes

Conflicts:
	libcpuid/rdmsr.c
This commit is contained in:
Xorg 2016-06-03 14:36:24 +02:00
commit 93cdd0de75
13 changed files with 107 additions and 47 deletions

View file

@ -1,4 +1,4 @@
AC_INIT([libcpuid CPU Identification library], [0.2.2], [libcpuid-devel@lists.sourceforge.net], [libcpuid]) AC_INIT([libcpuid CPU Identification library], [0.3.0], [libcpuid-devel@lists.sourceforge.net], [libcpuid])
AC_CONFIG_SRCDIR([libcpuid/libcpuid.h]) AC_CONFIG_SRCDIR([libcpuid/libcpuid.h])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
@ -19,9 +19,10 @@ dnl 11:0:3 Version 0.1.4: just an identification change, to reflect the detect
dnl 12:1:0 Version 0.2.0: two more fields to cpu_id_t dnl 12:1:0 Version 0.2.0: two more fields to cpu_id_t
dnl 12:1:1 Version 0.2.1: more processors support dnl 12:1:1 Version 0.2.1: more processors support
dnl 12:1:2 Version 0.2.2: more processors support, *BSD/Solaris support, updates to MSR stuff dnl 12:1:2 Version 0.2.2: more processors support, *BSD/Solaris support, updates to MSR stuff
LIBCPUID_CURRENT=12 dnl 13:2:0 Version 0.3.0: increment max Intel leaf 04 entries to 8
LIBCPUID_AGE=1 LIBCPUID_CURRENT=13
LIBCPUID_REVISION=2 LIBCPUID_AGE=2
LIBCPUID_REVISION=0
AC_SUBST([LIBCPUID_AGE]) AC_SUBST([LIBCPUID_AGE])
AC_SUBST([LIBCPUID_REVISION]) AC_SUBST([LIBCPUID_REVISION])
AC_SUBST([LIBCPUID_CURRENT]) AC_SUBST([LIBCPUID_CURRENT])

View file

@ -28,9 +28,7 @@
* This file contains a list of internal codes we use in detection. It is * This file contains a list of internal codes we use in detection. It is
* of no external use and isn't a complete list of AMD products. * of no external use and isn't a complete list of AMD products.
*/ */
CODE(NA), CODE2(OPTERON_GENERIC, 1000),
CODE(NO_CODE),
CODE(OPTERON_GENERIC),
CODE(OPTERON_800), CODE(OPTERON_800),
CODE(ATHLON_XP), CODE(ATHLON_XP),
CODE(ATHLON_XP_M), CODE(ATHLON_XP_M),

View file

@ -24,6 +24,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "libcpuid.h" #include "libcpuid.h"
#include "libcpuid_internal.h"
#include "recog_intel.h" #include "recog_intel.h"
#include "recog_amd.h" #include "recog_amd.h"
#include "asm-bits.h" #include "asm-bits.h"
@ -372,7 +373,7 @@ int cpuid_get_raw_data(struct cpu_raw_data_t* data)
cpu_exec_cpuid(i, data->basic_cpuid[i]); cpu_exec_cpuid(i, data->basic_cpuid[i]);
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
cpu_exec_cpuid(0x80000000 + i, data->ext_cpuid[i]); cpu_exec_cpuid(0x80000000 + i, data->ext_cpuid[i]);
for (i = 0; i < 4; i++) { for (i = 0; i < MAX_INTELFN4_LEVEL; i++) {
memset(data->intel_fn4[i], 0, sizeof(data->intel_fn4[i])); memset(data->intel_fn4[i], 0, sizeof(data->intel_fn4[i]));
data->intel_fn4[i][0] = 4; data->intel_fn4[i][0] = 4;
data->intel_fn4[i][2] = i; data->intel_fn4[i][2] = i;
@ -478,7 +479,7 @@ int cpuid_deserialize_raw_data(struct cpu_raw_data_t* data, const char* filename
return set_error(ERR_OK); return set_error(ERR_OK);
} }
int cpu_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data) int cpu_ident_internal(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal)
{ {
int r; int r;
struct cpu_raw_data_t myraw; struct cpu_raw_data_t myraw;
@ -492,10 +493,10 @@ int cpu_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
return set_error(r); return set_error(r);
switch (data->vendor) { switch (data->vendor) {
case VENDOR_INTEL: case VENDOR_INTEL:
r = cpuid_identify_intel(raw, data); r = cpuid_identify_intel(raw, data, internal);
break; break;
case VENDOR_AMD: case VENDOR_AMD:
r = cpuid_identify_amd(raw, data); r = cpuid_identify_amd(raw, data, internal);
break; break;
default: default:
break; break;
@ -503,6 +504,12 @@ int cpu_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
return set_error(r); return set_error(r);
} }
int cpu_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
{
struct internal_id_info_t throwaway;
return cpu_ident_internal(raw, data, &throwaway);
}
const char* cpu_feature_str(cpu_feature_t feature) const char* cpu_feature_str(cpu_feature_t feature)
{ {
const struct { cpu_feature_t feature; const char* name; } const struct { cpu_feature_t feature; const char* name; }

View file

@ -28,9 +28,7 @@
* This file contains a list of internal codes we use in detection. It is * This file contains a list of internal codes we use in detection. It is
* of no external use and isn't a complete list of intel products. * of no external use and isn't a complete list of intel products.
*/ */
CODE(NA), CODE2(PENTIUM, 2000),
CODE(NO_CODE),
CODE(PENTIUM),
CODE(MOBILE_PENTIUM), CODE(MOBILE_PENTIUM),
CODE(XEON), CODE(XEON),

View file

@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release" # PROP Intermediate_Dir "Release"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D VERSION=\"0.2.2\" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D VERSION=\"0.3.0\" /YX /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
@ -64,7 +64,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug" # PROP Intermediate_Dir "Debug"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D VERSION=\"0.2.2\" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D VERSION=\"0.3.0\" /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe

View file

@ -37,7 +37,7 @@
#define CPU_FLAGS_MAX 128 #define CPU_FLAGS_MAX 128
#define MAX_CPUID_LEVEL 32 #define MAX_CPUID_LEVEL 32
#define MAX_EXT_CPUID_LEVEL 32 #define MAX_EXT_CPUID_LEVEL 32
#define MAX_INTELFN4_LEVEL 4 #define MAX_INTELFN4_LEVEL 8
#define MAX_INTELFN11_LEVEL 4 #define MAX_INTELFN11_LEVEL 4
#define CPU_HINTS_MAX 16 #define CPU_HINTS_MAX 16

View file

@ -0,0 +1,63 @@
/*
* Copyright 2016 Veselin Georgiev,
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __LIBCPUID_INTERNAL_H__
#define __LIBCPUID_INTERNAL_H__
/*
* This file contains internal undocumented declarations and function prototypes
* for the workings of the internal library infrastructure.
*/
enum _common_codes_t {
NA = 0,
NO_CODE,
};
#define CODE(x) x
#define CODE2(x, y) x = y
enum _amd_code_t {
#include "amd_code_t.h"
};
typedef enum _amd_code_t amd_code_t;
enum _intel_code_t {
#include "intel_code_t.h"
};
typedef enum _intel_code_t intel_code_t;
#undef CODE
#undef CODE2
struct internal_id_info_t {
union {
amd_code_t amd;
intel_code_t intel;
} code;
int score; // detection (matchtable) score
};
int cpu_ident_internal(struct cpu_raw_data_t* raw, struct cpu_id_t* data,
struct internal_id_info_t* internal);
#endif /* __LIBCPUID_INTERNAL_H__ */

View file

@ -91,7 +91,7 @@ static int score(const struct match_entry_t* entry, const struct cpu_id_t* data,
return res; return res;
} }
void match_cpu_codename(const struct match_entry_t* matchtable, int count, int match_cpu_codename(const struct match_entry_t* matchtable, int count,
struct cpu_id_t* data, int brand_code, int model_code) struct cpu_id_t* data, int brand_code, int model_code)
{ {
int bestscore = -1; int bestscore = -1;
@ -112,6 +112,7 @@ void match_cpu_codename(const struct match_entry_t* matchtable, int count,
} }
} }
strcpy(data->cpu_codename, matchtable[bestindex].name); strcpy(data->cpu_codename, matchtable[bestindex].name);
return bestscore;
} }
void generic_get_cpu_list(const struct match_entry_t* matchtable, int count, void generic_get_cpu_list(const struct match_entry_t* matchtable, int count,

View file

@ -42,7 +42,8 @@ struct match_entry_t {
char name[32]; char name[32];
}; };
void match_cpu_codename(const struct match_entry_t* matchtable, int count, // returns the match score:
int match_cpu_codename(const struct match_entry_t* matchtable, int count,
struct cpu_id_t* data, int brand_code, int model_code); struct cpu_id_t* data, int brand_code, int model_code);
void warnf(const char* format, ...) void warnf(const char* format, ...)

View file

@ -28,18 +28,13 @@
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include "libcpuid.h" #include "libcpuid.h"
#include "recog_amd.h"
#include "libcpuid_util.h" #include "libcpuid_util.h"
#include "libcpuid_internal.h"
enum _amd_code_t { #include "recog_amd.h"
#define CODE(x) x
#include "amd_code_t.h"
#undef CODE
};
typedef enum _amd_code_t amd_code_t;
const struct amd_code_str { amd_code_t code; char *str; } amd_code_str[] = { const struct amd_code_str { amd_code_t code; char *str; } amd_code_str[] = {
#define CODE(x) { x, #x } #define CODE(x) { x, #x }
#define CODE2(x, y) CODE(x)
#include "amd_code_t.h" #include "amd_code_t.h"
#undef CODE #undef CODE
}; };
@ -454,7 +449,7 @@ static amd_code_t decode_amd_codename_part1(const char *bs)
return NO_CODE; return NO_CODE;
} }
static void decode_amd_codename(struct cpu_raw_data_t* raw, struct cpu_id_t* data) static void decode_amd_codename(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal)
{ {
amd_code_t code = decode_amd_codename_part1(data->brand_str); amd_code_t code = decode_amd_codename_part1(data->brand_str);
int i = 0; int i = 0;
@ -465,22 +460,22 @@ static void decode_amd_codename(struct cpu_raw_data_t* raw, struct cpu_id_t* dat
break; break;
} }
} }
if (code == ATHLON_64_X2 && data->l2_cache < 512)
code = SEMPRON_DUALCORE;
if (code_str) if (code_str)
debugf(2, "Detected AMD brand code: %d (%s)\n", code, code_str); debugf(2, "Detected AMD brand code: %d (%s)\n", code, code_str);
else else
debugf(2, "Detected AMD brand code: %d\n", code); debugf(2, "Detected AMD brand code: %d\n", code);
internal->code.amd = code;
if (code == ATHLON_64_X2 && data->l2_cache < 512) internal->score = match_cpu_codename(cpudb_amd, COUNT_OF(cpudb_amd), data, code, 0);
code = SEMPRON_DUALCORE;
match_cpu_codename(cpudb_amd, COUNT_OF(cpudb_amd), data, code, 0);
} }
int cpuid_identify_amd(struct cpu_raw_data_t* raw, struct cpu_id_t* data) int cpuid_identify_amd(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal)
{ {
load_amd_features(raw, data); load_amd_features(raw, data);
decode_amd_cache_info(raw, data); decode_amd_cache_info(raw, data);
decode_amd_number_of_cores(raw, data); decode_amd_number_of_cores(raw, data);
decode_amd_codename(raw, data); decode_amd_codename(raw, data, internal);
return 0; return 0;
} }

View file

@ -26,7 +26,7 @@
#ifndef __RECOG_AMD_H__ #ifndef __RECOG_AMD_H__
#define __RECOG_AMD_H__ #define __RECOG_AMD_H__
int cpuid_identify_amd(struct cpu_raw_data_t* raw, struct cpu_id_t* data); int cpuid_identify_amd(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal);
void cpuid_get_list_amd(struct cpu_list_t* list); void cpuid_get_list_amd(struct cpu_list_t* list);
#endif /* __RECOG_AMD_H__ */ #endif /* __RECOG_AMD_H__ */

View file

@ -26,19 +26,13 @@
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include "libcpuid.h" #include "libcpuid.h"
#include "recog_intel.h"
#include "libcpuid_util.h" #include "libcpuid_util.h"
#include "libcpuid_internal.h"
#include "recog_intel.h"
enum _intel_code_t {
#define CODE(x) x
#include "intel_code_t.h"
#undef CODE
};
typedef enum _intel_code_t intel_code_t;
const struct intel_bcode_str { intel_code_t code; char *str; } intel_bcode_str[] = { const struct intel_bcode_str { intel_code_t code; char *str; } intel_bcode_str[] = {
#define CODE(x) { x, #x } #define CODE(x) { x, #x }
#define CODE2(x, y) CODE(x)
#include "intel_code_t.h" #include "intel_code_t.h"
#undef CODE #undef CODE
}; };
@ -771,7 +765,7 @@ static intel_model_t get_model_code(struct cpu_id_t* data)
#undef HAVE #undef HAVE
} }
int cpuid_identify_intel(struct cpu_raw_data_t* raw, struct cpu_id_t* data) int cpuid_identify_intel(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal)
{ {
load_intel_features(raw, data); load_intel_features(raw, data);
if (raw->basic_cpuid[0][0] >= 4) { if (raw->basic_cpuid[0][0] >= 4) {
@ -798,7 +792,9 @@ int cpuid_identify_intel(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
debugf(2, "Detected Intel brand code: %d\n", brand_code); debugf(2, "Detected Intel brand code: %d\n", brand_code);
debugf(2, "Detected Intel model code: %d\n", model_code); debugf(2, "Detected Intel model code: %d\n", model_code);
match_cpu_codename(cpudb_intel, COUNT_OF(cpudb_intel), data, internal->code.intel = brand_code;
internal->score = match_cpu_codename(cpudb_intel, COUNT_OF(cpudb_intel), data,
brand_code, model_code); brand_code, model_code);
return 0; return 0;
} }

View file

@ -26,7 +26,7 @@
#ifndef __RECOG_INTEL_H__ #ifndef __RECOG_INTEL_H__
#define __RECOG_INTEL_H__ #define __RECOG_INTEL_H__
int cpuid_identify_intel(struct cpu_raw_data_t* raw, struct cpu_id_t* data); int cpuid_identify_intel(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal);
void cpuid_get_list_intel(struct cpu_list_t* list); void cpuid_get_list_intel(struct cpu_list_t* list);
#endif /*__RECOG_INTEL_H__*/ #endif /*__RECOG_INTEL_H__*/