Support for hybrid CPU (#166)

* Set CMAKE_C_FLAGS_DEBUG to display warnings during build

CI workflows are reporting warnings. Adding more C flags here help to avoid that.

* Add new types

* Add set_cpu_affinity function

* Add cpu_identify_all function

* Add cpu_request_core_type function

* Add cpuid_get_all_raw_data, cpuid_serialize_all_raw_data and cpuid_deserialize_all_raw_data functions

* Detect hybrid architecture for Intel CPUs

* Update cpuid_tool to detect all CPU logical cores

* Rename tests subdirectories for Intel Core

* Update all tests

Since e4309a6c4bc3ad875711a1599cba01a205b3103e, new fields are reported by cpuid_tool

* Add Intel Alder Lake

Fix #157

* Remove convert_instlatx64.c

This tool is not useful anymore because the cpuid_deserialize_raw_data_internal() function can natively parse them since 5667e1401c

* Fix affinity_mask computation

* Define _GNU_SOURCE in configure.ac

Forgotten in 4f80964db5

* Use dynamic raw array in cpu_raw_data_array_t

* Add cpu_affinity_mask_t type

* Improve set_cpu_affinity function

- Print a warning if logical CPU number is not supported on operating system
- Return a boolean value in case of success instead of an integer

* Improve cpu_identify_all and cpu_request_core_type functions

* Use dynamic array for cpu_types in system_id_t

This commit also adds cleanups, fixes and consistency

* Tests: update Ryzen 5 Matisse with all CPU cores

* Add affinity_mask_str_r function and address other comments

- Fixed cpuid_grow_raw_data_array and cpu_raw_data_array_t.logical_cpu_t with the correct type
- Added a note about hard limit of cpu_raw_data_array_t
- Fixed a typo in cpuid_deserialize_raw_data_internal

* Fix build on Windows
This commit is contained in:
Xorg 2022-09-15 18:37:08 +02:00 committed by GitHub
parent 9710e7c0ba
commit 2b8023f733
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
157 changed files with 8473 additions and 384 deletions

1
.gitignore vendored
View File

@ -39,7 +39,6 @@ libcpuid/x64
cpuid_tool/x32
cpuid_tool/x64
*.vcxproj.user
tests/convert_instlatx64
build
docs
.vscode

View File

@ -28,6 +28,7 @@ if(UNIX)
set(exec_prefix "\${prefix}")
set(libdir "\${exec_prefix}/lib")
set(includedir "\${prefix}/include")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wuninitialized -Wstrict-prototypes -Wformat -Wformat-security")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/libcpuid.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libcpuid.pc" ESCAPE_QUOTES
@ONLY)
install(FILES "${PROJECT_BINARY_DIR}/libcpuid.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")

View File

@ -7,7 +7,7 @@ pkgconfig_DATA = libcpuid.pc
EXTRA_DIST = libcpuid.pc.in libcpuid_vc71.sln libcpuid_vc10.sln Readme.md
# CMake support:
EXTRA_DIST += CMakeLists.txt libcpuid/CMakeLists.txt tests/CMakeLists.txt cpuid_tool/CMakeLists.txt \
cmake/Config.cmake.in tests/convert_instlatx64.c
cmake/Config.cmake.in
consistency:
$(top_srcdir)/libcpuid/check-consistency.py $(top_srcdir)/libcpuid

View File

@ -63,6 +63,13 @@ the raw CPUID data and the expected decoded items) by using
and tests/intel to get an idea) and copy your test file to an
appropriate place within the tests directory hierarchy.
AIDA64 CPUID dumps (mostly found on [InstLatx64](http://instlatx64.atw.hu/)) are also supported.
To create a new test based on a AIDA64 CPUID dump, you can do:
```sh
cpuid_tool --load=aida64_raw.txt --outfile=report.txt --report
./tests/create_test.py aida64_raw.txt report.txt > tests/xxx/yyy/my-cpu.test
```
For non-developers, who still want to contribute tests for the project,
use [this page](http://libcpuid.sourceforge.net/bugreport.php) to report
misdetections or new CPUs that libcpuid doesn't handle well yet.

View File

@ -66,6 +66,10 @@ case "${host_os}" in
;;
esac
if test "$build_windows" = "no"; then
AM_CPPFLAGS="$AM_CPPFLAGS -D_GNU_SOURCE"
fi
AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"])
AC_SUBST(AM_CPPFLAGS)

View File

@ -58,6 +58,8 @@ char raw_data_file[256] = "";
char out_file[256] = "";
typedef enum {
NEED_CPUID_PRESENT,
NEED_ARCHITECTURE,
NEED_PURPOSE,
NEED_VENDOR_STR,
NEED_VENDOR_ID,
NEED_BRAND_STRING,
@ -69,6 +71,7 @@ typedef enum {
NEED_NUM_CORES,
NEED_NUM_LOGICAL,
NEED_TOTAL_CPUS,
NEED_AFFI_MASK,
NEED_L1D_SIZE,
NEED_L1I_SIZE,
NEED_L2_SIZE,
@ -117,6 +120,8 @@ FILE *fout;
const struct { output_data_switch sw; const char* synopsis; int ident_required; }
matchtable[] = {
{ NEED_CPUID_PRESENT, "--cpuid" , 0},
{ NEED_ARCHITECTURE , "--architecture" , 1},
{ NEED_PURPOSE , "--purpose" , 1},
{ NEED_VENDOR_STR , "--vendorstr" , 1},
{ NEED_VENDOR_ID , "--vendorid" , 1},
{ NEED_BRAND_STRING , "--brandstr" , 1},
@ -128,6 +133,7 @@ matchtable[] = {
{ NEED_NUM_CORES , "--cores" , 1},
{ NEED_NUM_LOGICAL , "--logical" , 1},
{ NEED_TOTAL_CPUS , "--total-cpus" , 1},
{ NEED_AFFI_MASK , "--affi-mask" , 1},
{ NEED_L1D_SIZE , "--l1d-cache" , 1},
{ NEED_L1I_SIZE , "--l1i-cache" , 1},
{ NEED_L2_SIZE , "--cache" , 1},
@ -337,8 +343,7 @@ static int check_need_raw_data(void)
return 0;
}
static void print_info(output_data_switch query, struct cpu_raw_data_t* raw,
struct cpu_id_t* data)
static void print_info(output_data_switch query, struct cpu_id_t* data)
{
int i, value;
struct msr_driver_t* handle;
@ -346,6 +351,12 @@ static void print_info(output_data_switch query, struct cpu_raw_data_t* raw,
case NEED_CPUID_PRESENT:
fprintf(fout, "%d\n", cpuid_present());
break;
case NEED_ARCHITECTURE:
fprintf(fout, "%s\n", cpu_architecture_str(data->architecture));
break;
case NEED_PURPOSE:
fprintf(fout, "%s\n", cpu_purpose_str(data->purpose));
break;
case NEED_VENDOR_STR:
fprintf(fout, "%s\n", data->vendor_str);
break;
@ -379,6 +390,9 @@ static void print_info(output_data_switch query, struct cpu_raw_data_t* raw,
case NEED_TOTAL_CPUS:
fprintf(fout, "%d\n", cpuid_get_total_cpus());
break;
case NEED_AFFI_MASK:
fprintf(fout, "0x%s\n", affinity_mask_str(&data->affinity_mask));
break;
case NEED_L1D_SIZE:
fprintf(fout, "%d\n", data->l1_data_cache);
break;
@ -547,8 +561,15 @@ int main(int argc, char** argv)
int parseres = parse_cmdline(argc, argv);
int i, readres, writeres;
int only_clock_queries;
struct cpu_raw_data_t raw;
struct cpu_id_t data;
uint8_t cpu_type_index;
struct cpu_raw_data_array_t raw_array = {
.with_affinity = false,
.num_raw = 0,
.raw = NULL
};
struct system_id_t data = {
.num_cpu_types = 0
};
if (parseres != 1)
return parseres;
@ -580,10 +601,10 @@ int main(int argc, char** argv)
/* We have a request to input raw CPUID data from file: */
if (!strcmp(raw_data_file, "-"))
/* Input from stdin */
readres = cpuid_deserialize_raw_data(&raw, "");
readres = cpuid_deserialize_all_raw_data(&raw_array, "");
else
/* Input from file */
readres = cpuid_deserialize_raw_data(&raw, raw_data_file);
readres = cpuid_deserialize_all_raw_data(&raw_array, raw_data_file);
if (readres < 0) {
if (!need_quiet) {
fprintf(stderr, "Cannot deserialize raw data from ");
@ -599,7 +620,7 @@ int main(int argc, char** argv)
} else {
if (check_need_raw_data()) {
/* Try to obtain raw CPUID data from the CPU: */
readres = cpuid_get_raw_data(&raw);
readres = cpuid_get_all_raw_data(&raw_array);
if (readres < 0) {
if (!need_quiet) {
fprintf(stderr, "Cannot obtain raw CPU data!\n");
@ -616,10 +637,10 @@ int main(int argc, char** argv)
printf("Writing raw CPUID dump to `%s'\n", raw_data_file);
if (!strcmp(raw_data_file, "-"))
/* Serialize to stdout */
writeres = cpuid_serialize_raw_data(&raw, "");
writeres = cpuid_serialize_all_raw_data(&raw_array, "");
else
/* Serialize to file */
writeres = cpuid_serialize_raw_data(&raw, raw_data_file);
writeres = cpuid_serialize_all_raw_data(&raw_array, raw_data_file);
if (writeres < 0) {
if (!need_quiet) {
fprintf(stderr, "Cannot serialize raw data to ");
@ -643,48 +664,53 @@ int main(int argc, char** argv)
* Try CPU identification
* (this fill the `data' structure with decoded CPU features)
*/
if (cpu_identify(&raw, &data) < 0)
if (cpu_identify_all(&raw_array, &data) < 0)
fprintf(fout, "Error identifying the CPU: %s\n", cpuid_error());
/* OK, now write what we have in `data'...: */
fprintf(fout, "CPU Info:\n------------------\n");
fprintf(fout, " vendor_str : `%s'\n", data.vendor_str);
fprintf(fout, " vendor id : %d\n", (int) data.vendor);
fprintf(fout, " brand_str : `%s'\n", data.brand_str);
fprintf(fout, " family : %d (%02Xh)\n", data.family, data.family);
fprintf(fout, " model : %d (%02Xh)\n", data.model, data.model);
fprintf(fout, " stepping : %d (%02Xh)\n", data.stepping, data.stepping);
fprintf(fout, " ext_family : %d (%02Xh)\n", data.ext_family, data.ext_family);
fprintf(fout, " ext_model : %d (%02Xh)\n", data.ext_model, data.ext_model);
fprintf(fout, " num_cores : %d\n", data.num_cores);
fprintf(fout, " num_logical: %d\n", data.num_logical_cpus);
fprintf(fout, " tot_logical: %d\n", data.total_logical_cpus);
fprintf(fout, " L1 D cache : %d KB\n", data.l1_data_cache);
fprintf(fout, " L1 I cache : %d KB\n", data.l1_instruction_cache);
fprintf(fout, " L2 cache : %d KB\n", data.l2_cache);
fprintf(fout, " L3 cache : %d KB\n", data.l3_cache);
fprintf(fout, " L4 cache : %d KB\n", data.l4_cache);
fprintf(fout, " L1D assoc. : %d-way\n", data.l1_data_assoc);
fprintf(fout, " L1I assoc. : %d-way\n", data.l1_instruction_assoc);
fprintf(fout, " L2 assoc. : %d-way\n", data.l2_assoc);
fprintf(fout, " L3 assoc. : %d-way\n", data.l3_assoc);
fprintf(fout, " L4 assoc. : %d-way\n", data.l4_assoc);
fprintf(fout, " L1D line sz: %d bytes\n", data.l1_data_cacheline);
fprintf(fout, " L1I line sz: %d bytes\n", data.l1_instruction_cacheline);
fprintf(fout, " L2 line sz : %d bytes\n", data.l2_cacheline);
fprintf(fout, " L3 line sz : %d bytes\n", data.l3_cacheline);
fprintf(fout, " L4 line sz : %d bytes\n", data.l4_cacheline);
fprintf(fout, " SSE units : %d bits (%s)\n", data.sse_size, data.detection_hints[CPU_HINT_SSE_SIZE_AUTH] ? "authoritative" : "non-authoritative");
fprintf(fout, " code name : `%s'\n", data.cpu_codename);
fprintf(fout, " features :");
/*
* Here we enumerate all CPU feature bits, and when a feature
* is present output its name:
*/
for (i = 0; i < NUM_CPU_FEATURES; i++)
if (data.flags[i])
fprintf(fout, " %s", cpu_feature_str(i));
fprintf(fout, "\n");
for (cpu_type_index = 0; cpu_type_index < data.num_cpu_types; cpu_type_index++) {
fprintf(fout, "CPU Info for type #%d:\n------------------\n", cpu_type_index);
fprintf(fout, " arch : %s\n", cpu_architecture_str(data.cpu_types[cpu_type_index].architecture));
fprintf(fout, " purpose : %s\n", cpu_purpose_str(data.cpu_types[cpu_type_index].purpose));
fprintf(fout, " vendor_str : `%s'\n", data.cpu_types[cpu_type_index].vendor_str);
fprintf(fout, " vendor id : %d\n", (int) data.cpu_types[cpu_type_index].vendor);
fprintf(fout, " brand_str : `%s'\n", data.cpu_types[cpu_type_index].brand_str);
fprintf(fout, " family : %d (%02Xh)\n", data.cpu_types[cpu_type_index].family, data.cpu_types[cpu_type_index].family);
fprintf(fout, " model : %d (%02Xh)\n", data.cpu_types[cpu_type_index].model, data.cpu_types[cpu_type_index].model);
fprintf(fout, " stepping : %d (%02Xh)\n", data.cpu_types[cpu_type_index].stepping, data.cpu_types[cpu_type_index].stepping);
fprintf(fout, " ext_family : %d (%02Xh)\n", data.cpu_types[cpu_type_index].ext_family, data.cpu_types[cpu_type_index].ext_family);
fprintf(fout, " ext_model : %d (%02Xh)\n", data.cpu_types[cpu_type_index].ext_model, data.cpu_types[cpu_type_index].ext_model);
fprintf(fout, " num_cores : %d\n", data.cpu_types[cpu_type_index].num_cores);
fprintf(fout, " num_logical: %d\n", data.cpu_types[cpu_type_index].num_logical_cpus);
fprintf(fout, " tot_logical: %d\n", data.cpu_types[cpu_type_index].total_logical_cpus);
fprintf(fout, " affi_mask : 0x%s\n", affinity_mask_str(&data.cpu_types[cpu_type_index].affinity_mask));
fprintf(fout, " L1 D cache : %d KB\n", data.cpu_types[cpu_type_index].l1_data_cache);
fprintf(fout, " L1 I cache : %d KB\n", data.cpu_types[cpu_type_index].l1_instruction_cache);
fprintf(fout, " L2 cache : %d KB\n", data.cpu_types[cpu_type_index].l2_cache);
fprintf(fout, " L3 cache : %d KB\n", data.cpu_types[cpu_type_index].l3_cache);
fprintf(fout, " L4 cache : %d KB\n", data.cpu_types[cpu_type_index].l4_cache);
fprintf(fout, " L1D assoc. : %d-way\n", data.cpu_types[cpu_type_index].l1_data_assoc);
fprintf(fout, " L1I assoc. : %d-way\n", data.cpu_types[cpu_type_index].l1_instruction_assoc);
fprintf(fout, " L2 assoc. : %d-way\n", data.cpu_types[cpu_type_index].l2_assoc);
fprintf(fout, " L3 assoc. : %d-way\n", data.cpu_types[cpu_type_index].l3_assoc);
fprintf(fout, " L4 assoc. : %d-way\n", data.cpu_types[cpu_type_index].l4_assoc);
fprintf(fout, " L1D line sz: %d bytes\n", data.cpu_types[cpu_type_index].l1_data_cacheline);
fprintf(fout, " L1I line sz: %d bytes\n", data.cpu_types[cpu_type_index].l1_instruction_cacheline);
fprintf(fout, " L2 line sz : %d bytes\n", data.cpu_types[cpu_type_index].l2_cacheline);
fprintf(fout, " L3 line sz : %d bytes\n", data.cpu_types[cpu_type_index].l3_cacheline);
fprintf(fout, " L4 line sz : %d bytes\n", data.cpu_types[cpu_type_index].l4_cacheline);
fprintf(fout, " SSE units : %d bits (%s)\n", data.cpu_types[cpu_type_index].sse_size, data.cpu_types[cpu_type_index].detection_hints[CPU_HINT_SSE_SIZE_AUTH] ? "authoritative" : "non-authoritative");
fprintf(fout, " code name : `%s'\n", data.cpu_types[cpu_type_index].cpu_codename);
fprintf(fout, " features :");
/*
* Here we enumerate all CPU feature bits, and when a feature
* is present output its name:
*/
for (i = 0; i < NUM_CPU_FEATURES; i++)
if (data.cpu_types[cpu_type_index].flags[i])
fprintf(fout, " %s", cpu_feature_str(i));
fprintf(fout, "\n");
}
/* Is CPU clock info requested? */
if (need_clockreport) {
@ -714,23 +740,30 @@ int main(int argc, char** argv)
}
/* OK, process all queries. */
if (((!need_report || !only_clock_queries) && num_requests > 0) || need_identify) {
/* Identify the CPU. Make it do cpuid_get_raw_data() itself */
if (check_need_raw_data() && cpu_identify(&raw, &data) < 0) {
/* Identify the CPU. Make it do cpuid_get_all_raw_data() itself */
if (check_need_raw_data() && cpu_identify_all(&raw_array, &data) < 0) {
if (!need_quiet)
fprintf(stderr,
"Error identifying the CPU: %s\n",
cpuid_error());
return -1;
}
for (i = 0; i < num_requests; i++)
print_info(requests[i], &raw, &data);
for (cpu_type_index = 0; cpu_type_index < data.num_cpu_types; cpu_type_index++) {
if (raw_array.with_affinity)
fprintf(fout, "--------------------------------------------------------------------------------\n");
for (i = 0; i < num_requests; i++)
print_info(requests[i], &data.cpu_types[cpu_type_index]);
}
}
if (need_cpulist) {
print_cpulist();
}
if (need_sgx) {
print_sgx_data(&raw, &data);
print_sgx_data(&raw_array.raw[0], &data.cpu_types[0]);
}
cpuid_free_raw_data_array(&raw_array);
cpuid_free_system_id(&data);
return 0;
}

View File

@ -8,8 +8,11 @@ set(cpuid_sources
asm-bits.c)
if(WIN32)
list(APPEND cpuid_sources msrdriver.c)
list(APPEND cpuid_sources msrdriver.c)
endif()
if(UNIX)
add_compile_definitions(_GNU_SOURCE)
endif(UNIX)
if("${MSVC_CXX_ARCHITECTURE_ID}" MATCHES "x64")
list(APPEND cpuid_sources masm-x64.asm)

View File

@ -35,6 +35,7 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
/* Implementation: */
@ -64,29 +65,59 @@ static void cpu_id_t_constructor(struct cpu_id_t* id)
id->l1_assoc = id->l1_data_assoc = id->l1_instruction_assoc = id->l2_assoc = id->l3_assoc = id->l4_assoc = -1;
id->l1_cacheline = id->l1_data_cacheline = id->l1_instruction_cacheline = id->l2_cacheline = id->l3_cacheline = id->l4_cacheline = -1;
id->sse_size = -1;
init_affinity_mask(&id->affinity_mask);
id->purpose = PURPOSE_GENERAL;
}
static int parse_token(const char* expected_token, const char *token,
const char *value, uint32_t array[][4], int limit, int *recognized)
static void cpu_raw_data_array_t_constructor(struct cpu_raw_data_array_t* raw_array, bool with_affinity)
{
char format[32];
int veax, vebx, vecx, vedx;
int index;
raw_array->with_affinity = with_affinity;
raw_array->num_raw = 0;
raw_array->raw = NULL;
}
if (*recognized) return 1; /* already recognized */
if (strncmp(token, expected_token, strlen(expected_token))) return 1; /* not what we search for */
sprintf(format, "%s[%%d]", expected_token);
*recognized = 1;
if (1 == sscanf(token, format, &index) && index >=0 && index < limit) {
if (4 == sscanf(value, "%x%x%x%x", &veax, &vebx, &vecx, &vedx)) {
array[index][0] = veax;
array[index][1] = vebx;
array[index][2] = vecx;
array[index][3] = vedx;
return 1;
}
static void system_id_t_constructor(struct system_id_t* system)
{
system->num_cpu_types = 0;
system->cpu_types = NULL;
}
static void cpuid_grow_raw_data_array(struct cpu_raw_data_array_t* raw_array, logical_cpu_t n)
{
logical_cpu_t i;
struct cpu_raw_data_t *tmp = NULL;
if ((n <= 0) || (n < raw_array->num_raw)) return;
debugf(3, "Growing cpu_raw_data_array_t from %u to %u items\n", raw_array->num_raw, n);
tmp = realloc(raw_array->raw, sizeof(struct cpu_raw_data_t) * n);
if (tmp == NULL) { /* Memory allocation failure */
set_error(ERR_NO_MEM);
return;
}
return 0;
for (i = raw_array->num_raw; i < n; i++)
raw_data_t_constructor(&tmp[i]);
raw_array->num_raw = n;
raw_array->raw = tmp;
}
static void cpuid_grow_system_id(struct system_id_t* system, uint8_t n)
{
uint8_t i;
struct cpu_id_t *tmp = NULL;
if ((n <= 0) || (n < system->num_cpu_types)) return;
debugf(3, "Growing system_id_t from %u to %u items\n", system->num_cpu_types, n);
tmp = realloc(system->cpu_types, sizeof(struct cpu_id_t) * n);
if (tmp == NULL) { /* Memory allocation failure */
set_error(ERR_NO_MEM);
return;
}
for (i = system->num_cpu_types; i < n; i++)
cpu_id_t_constructor(&tmp[i]);
system->num_cpu_types = n;
system->cpu_types = tmp;
}
/* get_total_cpus() system specific code: uses OS routines to determine total number of CPUs */
@ -95,6 +126,7 @@ static int parse_token(const char* expected_token, const char *token,
#include <mach/clock_types.h>
#include <mach/clock.h>
#include <mach/mach.h>
#include <mach/thread_policy.h>
static int get_total_cpus(void)
{
kern_return_t kr;
@ -107,7 +139,15 @@ static int get_total_cpus(void)
return basic_info.avail_cpus;
}
#define GET_TOTAL_CPUS_DEFINED
#endif
static bool set_cpu_affinity(logical_cpu_t logical_cpu)
{
thread_affinity_policy_data_t ap;
ap.affinity_tag = logical_cpu + 1;
return thread_policy_set(mach_thread_self(), THREAD_AFFINITY_POLICY, (thread_policy_t) &ap, THREAD_AFFINITY_POLICY_COUNT) == KERN_SUCCESS;
}
#define SET_CPU_AFFINITY
#endif /* __APPLE__ */
#ifdef _WIN32
#include <windows.h>
@ -118,7 +158,44 @@ static int get_total_cpus(void)
return system_info.dwNumberOfProcessors;
}
#define GET_TOTAL_CPUS_DEFINED
#endif
static bool set_cpu_affinity(logical_cpu_t logical_cpu)
{
/* Credits to https://github.com/PolygonTek/BlueshiftEngine/blob/fbc374cbc391e1147c744649f405a66a27c35d89/Source/Runtime/Private/Platform/Windows/PlatformWinThread.cpp#L27 */
#if (_WIN32_WINNT >= 0x0601)
int groups = GetActiveProcessorGroupCount();
int total_processors = 0;
int group = 0;
int number = 0;
HANDLE thread = GetCurrentThread();
GROUP_AFFINITY groupAffinity;
for (int i = 0; i < groups; i++) {
int processors = GetActiveProcessorCount(i);
if (total_processors + processors > logical_cpu) {
group = i;
number = logical_cpu - total_processors;
break;
}
total_processors += processors;
}
memset(&groupAffinity, 0, sizeof(groupAffinity));
groupAffinity.Group = (WORD) group;
groupAffinity.Mask = (KAFFINITY) (1ULL << number);
return SetThreadGroupAffinity(thread, &groupAffinity, NULL);
#else
if (logical_cpu > (sizeof(DWORD_PTR) * 8)) {
warnf("set_cpu_affinity for logical CPU %u is not supported in this operating system.\n", logical_cpu);
return -1;
}
HANDLE process = GetCurrentProcess();
DWORD_PTR processAffinityMask = 1ULL << logical_cpu;
return SetProcessAffinityMask(process, processAffinityMask);
#endif /* (_WIN32_WINNT >= 0x0601) */
}
#define SET_CPU_AFFINITY
#endif /* _WIN32 */
#ifdef __HAIKU__
#include <OS.h>
@ -129,7 +206,7 @@ static int get_total_cpus(void)
return info.cpu_count;
}
#define GET_TOTAL_CPUS_DEFINED
#endif
#endif /* __HAIKU__ */
#if defined linux || defined __linux__ || defined __sun
#include <sys/sysinfo.h>
@ -140,7 +217,36 @@ static int get_total_cpus(void)
return sysconf(_SC_NPROCESSORS_ONLN);
}
#define GET_TOTAL_CPUS_DEFINED
#endif
#endif /* defined linux || defined __linux__ || defined __sun */
#if defined linux || defined __linux__
#include <sched.h>
static bool set_cpu_affinity(logical_cpu_t logical_cpu)
{
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(logical_cpu, &cpuset);
return sched_setaffinity(0, sizeof(cpuset), &cpuset) == 0;
}
#define SET_CPU_AFFINITY
#endif /* defined linux || defined __linux__ */
#if defined sun || defined __sun
#include <sys/types.h>
#include <sys/processor.h>
#include <sys/procset.h>
static bool set_cpu_affinity(logical_cpu_t logical_cpu)
{
if (logical_cpu > (sizeof(processorid_t) * 8)) {
warnf("set_cpu_affinity for logical CPU %u is not supported in this operating system.\n", logical_cpu);
return -1;
}
return processor_bind(P_LWPID, P_MYID, logical_cpu, NULL) == 0;
}
#define SET_CPU_AFFINITY
#endif /* defined sun || defined __sun */
#if defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __bsdi__ || defined __QNX__
#include <sys/types.h>
@ -155,7 +261,51 @@ static int get_total_cpus(void)
return ncpus;
}
#define GET_TOTAL_CPUS_DEFINED
#endif
#endif /* defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __bsdi__ || defined __QNX__ */
#if defined __FreeBSD__
#include <sys/param.h>
#include <sys/cpuset.h>
static bool set_cpu_affinity(logical_cpu_t logical_cpu)
{
cpuset_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(logical_cpu, &cpuset);
return cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, sizeof(cpuset), &cpuset) == 0;
}
#define SET_CPU_AFFINITY
#endif /* defined __FreeBSD__ */
#if defined __DragonFly__
#include <pthread.h>
#include <pthread_np.h>
static bool set_cpu_affinity(logical_cpu_t logical_cpu)
{
cpuset_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(logical_cpu, &cpuset);
return pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset) == 0;
}
#define SET_CPU_AFFINITY
#endif /* defined __DragonFly__ */
#if defined __NetBSD__
#include <pthread.h>
#include <sched.h>
static bool set_cpu_affinity(logical_cpu_t logical_cpu)
{
cpuset_t *cpuset;
cpuset = cpuset_create();
cpuset_set((cpuid_t) logical_cpu, cpuset);
int ret = pthread_setaffinity_np(pthread_self(), cpuset_size(cpuset), cpuset);
cpuset_destroy(cpuset);
return ret == 0;
}
#define SET_CPU_AFFINITY
#endif /* defined __NetBSD__ */
#ifndef GET_TOTAL_CPUS_DEFINED
static int get_total_cpus(void)
@ -171,6 +321,208 @@ static int get_total_cpus(void)
}
#endif /* GET_TOTAL_CPUS_DEFINED */
#ifndef SET_CPU_AFFINITY
static bool set_cpu_affinity(logical_cpu_t logical_cpu)
{
static int warning_printed = 0;
if (!warning_printed) {
warning_printed = 1;
warnf("Your system is not supported by libcpuid -- don't know how to set the CPU affinity.\n");
}
return false;
}
#endif /* SET_CPU_AFFINITY */
static int cpuid_serialize_raw_data_internal(struct cpu_raw_data_t* single_raw, struct cpu_raw_data_array_t* raw_array, const char* filename)
{
int i;
bool end_loop = false;
const bool use_raw_array = (raw_array != NULL) && raw_array->num_raw > 0;
logical_cpu_t logical_cpu = 0;
struct cpu_raw_data_t* raw_ptr = use_raw_array ? &raw_array->raw[0] : single_raw;
FILE *f;
/* Open file descriptor */
f = !strcmp(filename, "") ? stdin : fopen(filename, "wt");
if (!f)
return set_error(ERR_OPEN);
debugf(1, "Writing RAW dump to '%s'\n", f == stdin ? "stdin" : filename);
/* Write RAW data to output file */
fprintf(f, "version=%s\n", VERSION);
while (!end_loop) {
if (use_raw_array) {
debugf(2, "Writing RAW dump for logical CPU %i\n", logical_cpu);
fprintf(f, "\n_________________ Logical CPU #%i _________________\n", logical_cpu);
raw_ptr = &raw_array->raw[logical_cpu];
}
for (i = 0; i < MAX_CPUID_LEVEL; i++)
fprintf(f, "basic_cpuid[%d]=%08x %08x %08x %08x\n", i,
raw_ptr->basic_cpuid[i][EAX], raw_ptr->basic_cpuid[i][EBX],
raw_ptr->basic_cpuid[i][ECX], raw_ptr->basic_cpuid[i][EDX]);
for (i = 0; i < MAX_EXT_CPUID_LEVEL; i++)
fprintf(f, "ext_cpuid[%d]=%08x %08x %08x %08x\n", i,
raw_ptr->ext_cpuid[i][EAX], raw_ptr->ext_cpuid[i][EBX],
raw_ptr->ext_cpuid[i][ECX], raw_ptr->ext_cpuid[i][EDX]);
for (i = 0; i < MAX_INTELFN4_LEVEL; i++)
fprintf(f, "intel_fn4[%d]=%08x %08x %08x %08x\n", i,
raw_ptr->intel_fn4[i][EAX], raw_ptr->intel_fn4[i][EBX],
raw_ptr->intel_fn4[i][ECX], raw_ptr->intel_fn4[i][EDX]);
for (i = 0; i < MAX_INTELFN11_LEVEL; i++)
fprintf(f, "intel_fn11[%d]=%08x %08x %08x %08x\n", i,
raw_ptr->intel_fn11[i][EAX], raw_ptr->intel_fn11[i][EBX],
raw_ptr->intel_fn11[i][ECX], raw_ptr->intel_fn11[i][EDX]);
for (i = 0; i < MAX_INTELFN12H_LEVEL; i++)
fprintf(f, "intel_fn12h[%d]=%08x %08x %08x %08x\n", i,
raw_ptr->intel_fn12h[i][EAX], raw_ptr->intel_fn12h[i][EBX],
raw_ptr->intel_fn12h[i][ECX], raw_ptr->intel_fn12h[i][EDX]);
for (i = 0; i < MAX_INTELFN14H_LEVEL; i++)
fprintf(f, "intel_fn14h[%d]=%08x %08x %08x %08x\n", i,
raw_ptr->intel_fn14h[i][EAX], raw_ptr->intel_fn14h[i][EBX],
raw_ptr->intel_fn14h[i][ECX], raw_ptr->intel_fn14h[i][EDX]);
for (i = 0; i < MAX_AMDFN8000001DH_LEVEL; i++)
fprintf(f, "amd_fn8000001dh[%d]=%08x %08x %08x %08x\n", i,
raw_ptr->amd_fn8000001dh[i][EAX], raw_ptr->amd_fn8000001dh[i][EBX],
raw_ptr->amd_fn8000001dh[i][ECX], raw_ptr->amd_fn8000001dh[i][EDX]);
logical_cpu++;
end_loop = ((use_raw_array && (logical_cpu >= raw_array->num_raw)) || !use_raw_array);
}
/* Close file descriptor */
if (strcmp(filename, ""))
fclose(f);
return set_error(ERR_OK);
}
#define RAW_ASSIGN_LINE(__line) __line[EAX] = eax ; __line[EBX] = ebx ; __line[ECX] = ecx ; __line[EDX] = edx
static int cpuid_deserialize_raw_data_internal(struct cpu_raw_data_t* single_raw, struct cpu_raw_data_array_t* raw_array, const char* filename)
{
int i;
int cur_line = 0;
int assigned = 0;
int subleaf = 0;
bool is_libcpuid_dump = true;
bool is_aida64_dump = false;
const bool use_raw_array = (raw_array != NULL);
logical_cpu_t logical_cpu = 0;
uint32_t addr, eax, ebx, ecx, edx;
char version[8] = "";
char line[100];
struct cpu_raw_data_t* raw_ptr = single_raw;
FILE *f;
/* Open file descriptor */
f = !strcmp(filename, "") ? stdin : fopen(filename, "rt");
if (!f)
return set_error(ERR_OPEN);
debugf(1, "Opening RAW dump from '%s'\n", f == stdin ? "stdin" : filename);
if (use_raw_array)
cpu_raw_data_array_t_constructor(raw_array, false);
/* Parse file and store data in cpu_raw_data_t */
while (fgets(line, sizeof(line), f) != NULL) {
i = -1;
line[strcspn(line, "\n")] = '\0';
if (line[0] == '\0') // Skip empty lines
continue;
cur_line++;
if (cur_line == 1) {
if ((sscanf(line, "version=%s", version) >= 1) || (sscanf(line, "basic_cpuid[%d]=%x %x %x %x", &i, &eax, &ebx, &ecx, &edx) >= 5)) {
is_libcpuid_dump = true;
is_aida64_dump = false;
if (version[0] != '\0') {
debugf(2, "Recognized version '%s' from RAW dump\n", version);
continue;
}
if (i >= 0) {
debugf(2, "Parsing RAW dump for a single CPU dump\n");
cpuid_grow_raw_data_array(raw_array, 1);
raw_ptr = &raw_array->raw[0];
raw_array->with_affinity = false;
}
}
else if (!strcmp(line, "------[ Versions ]------") || !strcmp(line, "------[ Logical CPU #0 ]------") || !strcmp(line, "------[ CPUID Registers / Logical CPU #0 ]------")) {
is_libcpuid_dump = false;
is_aida64_dump = true;
debugf(2, "Recognized AIDA64 RAW dump\n");
}
}
if (is_libcpuid_dump) {
if (use_raw_array && (sscanf(line, "_________________ Logical CPU #%hi _________________", &logical_cpu) >= 1)) {
debugf(2, "Parsing RAW dump for logical CPU %i\n", logical_cpu);
cpuid_grow_raw_data_array(raw_array, logical_cpu + 1);
raw_ptr = &raw_array->raw[logical_cpu];
raw_array->with_affinity = true;
}
else if ((sscanf(line, "basic_cpuid[%d]=%x %x %x %x", &i, &eax, &ebx, &ecx, &edx) >= 5) && (i >= 0) && (i < MAX_CPUID_LEVEL)) {
RAW_ASSIGN_LINE(raw_ptr->basic_cpuid[i]);
}
else if ((sscanf(line, "ext_cpuid[%d]=%x %x %x %x", &i, &eax, &ebx, &ecx, &edx) >= 5) && (i >= 0) && (i < MAX_EXT_CPUID_LEVEL)) {
RAW_ASSIGN_LINE(raw_ptr->ext_cpuid[i]);
}
else if ((sscanf(line, "intel_fn4[%d]=%x %x %x %x", &i, &eax, &ebx, &ecx, &edx) >= 5) && (i >= 0) && (i < MAX_INTELFN4_LEVEL)) {
RAW_ASSIGN_LINE(raw_ptr->intel_fn4[i]);
}
else if ((sscanf(line, "intel_fn11[%d]=%x %x %x %x", &i, &eax, &ebx, &ecx, &edx) >= 5) && (i >= 0) && (i < MAX_INTELFN11_LEVEL)) {
RAW_ASSIGN_LINE(raw_ptr->intel_fn11[i]);
}
else if ((sscanf(line, "intel_fn12h[%d]=%x %x %x %x", &i, &eax, &ebx, &ecx, &edx) >= 5) && (i >= 0) && (i < MAX_INTELFN12H_LEVEL)) {
RAW_ASSIGN_LINE(raw_ptr->intel_fn12h[i]);
}
else if ((sscanf(line, "intel_fn14h[%d]=%x %x %x %x", &i, &eax, &ebx, &ecx, &edx) >= 5) && (i >= 0) && (i < MAX_INTELFN14H_LEVEL)) {
RAW_ASSIGN_LINE(raw_ptr->intel_fn14h[i]);
}
else if ((sscanf(line, "amd_fn8000001dh[%d]=%x %x %x %x", &i, &eax, &ebx, &ecx, &edx) >= 5) && (i >= 0) && (i < MAX_AMDFN8000001DH_LEVEL)) {
RAW_ASSIGN_LINE(raw_ptr->amd_fn8000001dh[i]);
}
else if (line[0] != '\0') {
warnf("Warning: file '%s', line %d: '%s' not understood!\n", filename, cur_line, line);
}
}
else if (is_aida64_dump) {
if (use_raw_array && ((sscanf(line, "------[ Logical CPU #%hi ]------", &logical_cpu) >= 1) || \
(sscanf(line, "------[ CPUID Registers / Logical CPU #%hi ]------", &logical_cpu) >= 1))) {
debugf(2, "Parsing AIDA64 RAW dump for logical CPU %i\n", logical_cpu);
cpuid_grow_raw_data_array(raw_array, logical_cpu + 1);
raw_ptr = &raw_array->raw[logical_cpu];
raw_array->with_affinity = true;
continue;
}
subleaf = 0;
assigned = sscanf(line, "CPUID %x: %x-%x-%x-%x [SL %02i]", &addr, &eax, &ebx, &ecx, &edx, &subleaf);
debugf(3, "RAW line %d: %i items assigned for string '%s'\n", cur_line, assigned, line);
if ((assigned >= 5) && (subleaf == 0)) {
if (addr < MAX_CPUID_LEVEL) {
i = (int) addr;
RAW_ASSIGN_LINE(raw_ptr->basic_cpuid[i]);
}
else if ((addr >= ADDRESS_EXT_CPUID_START) && (addr < ADDRESS_EXT_CPUID_END)) {
i = (int) addr - ADDRESS_EXT_CPUID_START;
RAW_ASSIGN_LINE(raw_ptr->ext_cpuid[i]);
}
}
if (assigned >= 6) {
i = subleaf;
switch (addr) {
case 0x00000004: RAW_ASSIGN_LINE(raw_ptr->intel_fn4[i]); break;
case 0x0000000B: RAW_ASSIGN_LINE(raw_ptr->intel_fn11[i]); break;
case 0x00000012: RAW_ASSIGN_LINE(raw_ptr->intel_fn12h[i]); break;
case 0x00000014: RAW_ASSIGN_LINE(raw_ptr->intel_fn14h[i]); break;
case 0x8000001D: RAW_ASSIGN_LINE(raw_ptr->amd_fn8000001dh[i]); break;
default: break;
}
}
}
}
/* Close file descriptor */
if (strcmp(filename, ""))
fclose(f);
return set_error(ERR_OK);
}
#undef RAW_ASSIGN_LINE
static void load_features_common(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
{
@ -310,6 +662,7 @@ static int cpuid_basic_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* dat
if (data->vendor == VENDOR_UNKNOWN)
return set_error(ERR_CPU_UNKN);
data->architecture = ARCHITECTURE_X86;
basic = raw->basic_cpuid[0][EAX];
if (basic >= 1) {
data->family = (raw->basic_cpuid[1][EAX] >> 8) & 0xf;
@ -442,110 +795,49 @@ int cpuid_get_raw_data(struct cpu_raw_data_t* data)
return set_error(ERR_OK);
}
int cpuid_get_all_raw_data(struct cpu_raw_data_array_t* data)
{
int cur_error = set_error(ERR_OK);
int ret_error = set_error(ERR_OK);
logical_cpu_t logical_cpu = 0;
struct cpu_raw_data_t* raw_ptr = NULL;
if (data == NULL)
return set_error(ERR_HANDLE);
cpu_raw_data_array_t_constructor(data, true);
while (set_cpu_affinity(logical_cpu)) {
debugf(2, "Getting RAW dump for logical CPU %i\n", logical_cpu);
cpuid_grow_raw_data_array(data, logical_cpu + 1);
raw_ptr = &data->raw[logical_cpu];
cur_error = cpuid_get_raw_data(raw_ptr);
if (ret_error == ERR_OK)
ret_error = cur_error;
logical_cpu++;
}
return ret_error;
}
int cpuid_serialize_raw_data(struct cpu_raw_data_t* data, const char* filename)
{
int i;
FILE *f;
return cpuid_serialize_raw_data_internal(data, NULL, filename);
}
if (!strcmp(filename, ""))
f = stdout;
else
f = fopen(filename, "wt");
if (!f) return set_error(ERR_OPEN);
fprintf(f, "version=%s\n", VERSION);
for (i = 0; i < MAX_CPUID_LEVEL; i++)
fprintf(f, "basic_cpuid[%d]=%08x %08x %08x %08x\n", i,
data->basic_cpuid[i][EAX], data->basic_cpuid[i][EBX],
data->basic_cpuid[i][ECX], data->basic_cpuid[i][EDX]);
for (i = 0; i < MAX_EXT_CPUID_LEVEL; i++)
fprintf(f, "ext_cpuid[%d]=%08x %08x %08x %08x\n", i,
data->ext_cpuid[i][EAX], data->ext_cpuid[i][EBX],
data->ext_cpuid[i][ECX], data->ext_cpuid[i][EDX]);
for (i = 0; i < MAX_INTELFN4_LEVEL; i++)
fprintf(f, "intel_fn4[%d]=%08x %08x %08x %08x\n", i,
data->intel_fn4[i][EAX], data->intel_fn4[i][EBX],
data->intel_fn4[i][ECX], data->intel_fn4[i][EDX]);
for (i = 0; i < MAX_INTELFN11_LEVEL; i++)
fprintf(f, "intel_fn11[%d]=%08x %08x %08x %08x\n", i,
data->intel_fn11[i][EAX], data->intel_fn11[i][EBX],
data->intel_fn11[i][ECX], data->intel_fn11[i][EDX]);
for (i = 0; i < MAX_INTELFN12H_LEVEL; i++)
fprintf(f, "intel_fn12h[%d]=%08x %08x %08x %08x\n", i,
data->intel_fn12h[i][EAX], data->intel_fn12h[i][EBX],
data->intel_fn12h[i][ECX], data->intel_fn12h[i][EDX]);
for (i = 0; i < MAX_INTELFN14H_LEVEL; i++)
fprintf(f, "intel_fn14h[%d]=%08x %08x %08x %08x\n", i,
data->intel_fn14h[i][EAX], data->intel_fn14h[i][EBX],
data->intel_fn14h[i][ECX], data->intel_fn14h[i][EDX]);
for (i = 0; i < MAX_AMDFN8000001DH_LEVEL; i++)
fprintf(f, "amd_fn8000001dh[%d]=%08x %08x %08x %08x\n", i,
data->amd_fn8000001dh[i][EAX], data->amd_fn8000001dh[i][EBX],
data->amd_fn8000001dh[i][ECX], data->amd_fn8000001dh[i][EDX]);
if (strcmp(filename, ""))
fclose(f);
return set_error(ERR_OK);
int cpuid_serialize_all_raw_data(struct cpu_raw_data_array_t* data, const char* filename)
{
return cpuid_serialize_raw_data_internal(NULL, data, filename);
}
int cpuid_deserialize_raw_data(struct cpu_raw_data_t* data, const char* filename)
{
int i, len;
char line[100];
char token[100];
char *value;
int syntax;
int cur_line = 0;
int recognized;
FILE *f;
raw_data_t_constructor(data);
return cpuid_deserialize_raw_data_internal(data, NULL, filename);
}
if (!strcmp(filename, ""))
f = stdin;
else
f = fopen(filename, "rt");
if (!f) return set_error(ERR_OPEN);
while (fgets(line, sizeof(line), f)) {
++cur_line;
len = (int) strlen(line);
if (len < 2) continue;
if (line[len - 1] == '\n')
line[--len] = '\0';
for (i = 0; i < len && line[i] != '='; i++)
if (i >= len && i < 1 && len - i - 1 <= 0) {
fclose(f);
return set_error(ERR_BADFMT);
}
strncpy(token, line, i);
token[i] = '\0';
value = &line[i + 1];
/* try to recognize the line */
recognized = 0;
if (!strcmp(token, "version") || !strcmp(token, "build_date")) {
recognized = 1;
}
syntax = 1;
syntax = syntax && parse_token("basic_cpuid", token, value, data->basic_cpuid, MAX_CPUID_LEVEL, &recognized);
syntax = syntax && parse_token("ext_cpuid", token, value, data->ext_cpuid, MAX_EXT_CPUID_LEVEL, &recognized);
syntax = syntax && parse_token("intel_fn4", token, value, data->intel_fn4, MAX_INTELFN4_LEVEL, &recognized);
syntax = syntax && parse_token("intel_fn11", token, value, data->intel_fn11, MAX_INTELFN11_LEVEL, &recognized);
syntax = syntax && parse_token("intel_fn12h", token, value, data->intel_fn12h, MAX_INTELFN12H_LEVEL, &recognized);
syntax = syntax && parse_token("intel_fn14h", token, value, data->intel_fn14h, MAX_INTELFN14H_LEVEL, &recognized);
syntax = syntax && parse_token("amd_fn8000001dh", token, value, data->amd_fn8000001dh, MAX_AMDFN8000001DH_LEVEL, &recognized);
if (!syntax) {
warnf("Error: %s:%d: Syntax error\n", filename, cur_line);
fclose(f);
return set_error(ERR_BADFMT);
}
if (!recognized) {
warnf("Warning: %s:%d not understood!\n", filename, cur_line);
}
}
if (strcmp(filename, ""))
fclose(f);
return set_error(ERR_OK);
int cpuid_deserialize_all_raw_data(struct cpu_raw_data_array_t* data, const char* filename)
{
return cpuid_deserialize_raw_data_internal(NULL, data, filename);
}
int cpu_ident_internal(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal)
@ -558,6 +850,8 @@ int cpu_ident_internal(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct
raw = &myraw;
}
cpu_id_t_constructor(data);
internal->smt_id = -1;
internal->core_id = -1;
if ((r = cpuid_basic_identify(raw, data)) < 0)
return set_error(r);
switch (data->vendor) {
@ -578,10 +872,195 @@ int cpu_ident_internal(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct
return set_error(r);
}
static cpu_purpose_t cpu_ident_purpose(struct cpu_raw_data_t* raw)
{
cpu_vendor_t vendor = VENDOR_UNKNOWN;
cpu_purpose_t purpose = PURPOSE_GENERAL;
char vendor_str[VENDOR_STR_MAX];
vendor = cpuid_vendor_identify(raw->basic_cpuid[0], vendor_str);
if (vendor == VENDOR_UNKNOWN) {
set_error(ERR_CPU_UNKN);
return purpose;
}
switch (vendor) {
case VENDOR_INTEL:
purpose = cpuid_identify_purpose_intel(raw);
break;
default:
purpose = PURPOSE_GENERAL;
break;
}
debugf(3, "Identified a '%s' CPU core type\n", cpu_purpose_str(purpose));
return purpose;
}
int cpu_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
{
int r;
struct internal_id_info_t throwaway;
return cpu_ident_internal(raw, data, &throwaway);
r = cpu_ident_internal(raw, data, &throwaway);
return r;
}
int cpu_identify_all(struct cpu_raw_data_array_t* raw_array, struct system_id_t* system)
{
int cur_error = set_error(ERR_OK);
int ret_error = set_error(ERR_OK);
double smt_divisor;
bool is_new_cpu_type;
bool is_smt_supported;
uint8_t cpu_type_index = 0;
int32_t num_logical_cpus = 1;
logical_cpu_t logical_cpu = 0;
cpu_purpose_t purpose;
cpu_affinity_mask_t affinity_mask;
struct cpu_raw_data_array_t my_raw_array;
struct internal_id_info_t throwaway;
if (system == NULL)
return set_error(ERR_HANDLE);
if (!raw_array) {
if ((ret_error = cpuid_get_all_raw_data(&my_raw_array)) < 0)
return set_error(ret_error);
raw_array = &my_raw_array;
}
system_id_t_constructor(system);
if (raw_array->with_affinity) {
init_affinity_mask(&affinity_mask);
set_affinity_mask_bit(0, &affinity_mask);
}
/* Iterate over all RAW */
for (logical_cpu = 0; logical_cpu < raw_array->num_raw; logical_cpu++) {
is_new_cpu_type = false;
debugf(2, "Identifying logical core %u\n", logical_cpu);
purpose = cpu_ident_purpose(&raw_array->raw[logical_cpu]);
/* Put data to system->cpu_types on the first iteration or when purpose is different than previous core */
if ((system->num_cpu_types == 0) || (purpose != system->cpu_types[system->num_cpu_types - 1].purpose)) {
is_new_cpu_type = true;
cpu_type_index = system->num_cpu_types;
cpuid_grow_system_id(system, system->num_cpu_types + 1);
cur_error = cpu_ident_internal(&raw_array->raw[logical_cpu], &system->cpu_types[cpu_type_index], &throwaway);
if (ret_error == ERR_OK)
ret_error = cur_error;
}
/* Increment logical and physical CPU counters for current purpose */
else if (raw_array->with_affinity) {
set_affinity_mask_bit(logical_cpu, &affinity_mask);
num_logical_cpus++;
}
/* Update logical and physical CPU counters in system->cpu_types on the last iteration or when purpose is different than previous core */
if (raw_array->with_affinity && ((logical_cpu + 1 == raw_array->num_raw) || (is_new_cpu_type && (system->num_cpu_types > 1)))) {
cpu_type_index = is_new_cpu_type && raw_array->with_affinity ? system->num_cpu_types - 2 : system->num_cpu_types - 1;
is_smt_supported = (system->cpu_types[cpu_type_index].num_logical_cpus % system->cpu_types[cpu_type_index].num_cores) == 0;
smt_divisor = is_smt_supported ? system->cpu_types[cpu_type_index].num_logical_cpus / system->cpu_types[cpu_type_index].num_cores : 1.0;
/* Save current values in system->cpu_types[cpu_type_index] */
copy_affinity_mask(&system->cpu_types[cpu_type_index].affinity_mask, &affinity_mask);
system->cpu_types[cpu_type_index].num_cores = num_logical_cpus / smt_divisor;
system->cpu_types[cpu_type_index].num_logical_cpus = num_logical_cpus;
/* Reset values for the next purpose */
init_affinity_mask(&affinity_mask);
set_affinity_mask_bit(logical_cpu, &affinity_mask);
num_logical_cpus = 1;
}
}
/* Update the total_logical_cpus value for each purpose */
for (cpu_type_index = 0; cpu_type_index < system->num_cpu_types; cpu_type_index++)
system->cpu_types[cpu_type_index].total_logical_cpus = logical_cpu;
return ret_error;
}
int cpu_request_core_type(cpu_purpose_t purpose, struct cpu_raw_data_array_t* raw_array, struct cpu_id_t* data)
{
int error;
logical_cpu_t logical_cpu = 0;
struct cpu_raw_data_array_t my_raw_array;
struct internal_id_info_t throwaway;
if (!raw_array) {
if ((error = cpuid_get_all_raw_data(&my_raw_array)) < 0)
return set_error(error);
raw_array = &my_raw_array;
}
for (logical_cpu = 0; logical_cpu < raw_array->num_raw; logical_cpu++) {
if (cpu_ident_purpose(&raw_array->raw[logical_cpu]) == purpose) {
cpu_ident_internal(&raw_array->raw[logical_cpu], data, &throwaway);
return set_error(ERR_OK);
}
}
return set_error(ERR_NOT_FOUND);
}
const char* cpu_architecture_str(cpu_architecture_t architecture)
{
const struct { cpu_architecture_t architecture; const char* name; }
matchtable[] = {
{ ARCHITECTURE_UNKNOWN, "unknown" },
{ ARCHITECTURE_X86, "x86" },
{ ARCHITECTURE_ARM, "ARM" },
};
unsigned i, n = COUNT_OF(matchtable);
if (n != NUM_CPU_ARCHITECTURES + 1) {
warnf("Warning: incomplete library, architecture matchtable size differs from the actual number of architectures.\n");
}
for (i = 0; i < n; i++)
if (matchtable[i].architecture == architecture)
return matchtable[i].name;
return "";
}
const char* cpu_purpose_str(cpu_purpose_t purpose)
{
const struct { cpu_purpose_t purpose; const char* name; }
matchtable[] = {
{ PURPOSE_GENERAL, "general" },
{ PURPOSE_PERFORMANCE, "performance" },
{ PURPOSE_EFFICIENCY, "efficiency" },
};
unsigned i, n = COUNT_OF(matchtable);
if (n != NUM_CPU_PURPOSES) {
warnf("Warning: incomplete library, purpose matchtable size differs from the actual number of purposes.\n");
}
for (i = 0; i < n; i++)
if (matchtable[i].purpose == purpose)
return matchtable[i].name;
return "";
}
char* affinity_mask_str_r(cpu_affinity_mask_t* affinity_mask, char* buffer, uint32_t buffer_len)
{
logical_cpu_t mask_index = __MASK_SETSIZE - 1;
logical_cpu_t str_index = 0;
bool do_print = false;
while (str_index + 1 < buffer_len) {
if (do_print || (mask_index < 4) || (affinity_mask->__bits[mask_index] != 0x00)) {
snprintf(&buffer[str_index], 3, "%02X", affinity_mask->__bits[mask_index]);
do_print = true;
str_index += 2;
}
/* mask_index in unsigned, so we cannot decrement it beyond 0 */
if (mask_index == 0)
break;
mask_index--;
}
buffer[str_index] = '\0';
return buffer;
}
char* affinity_mask_str(cpu_affinity_mask_t* affinity_mask)
{
static char buffer[__MASK_SETSIZE + 1] = "";
return affinity_mask_str_r(affinity_mask, buffer, __MASK_SETSIZE + 1);
}
const char* cpu_feature_str(cpu_feature_t feature)
@ -733,6 +1212,7 @@ const char* cpuid_error(void)
{ ERR_INVCNB , "Invalid core number"},
{ ERR_HANDLE_R , "Error on handle read"},
{ ERR_INVRANGE , "Invalid given range"},
{ ERR_NOT_FOUND, "Requested type not found"},
};
unsigned i;
for (i = 0; i < COUNT_OF(matchtable); i++)
@ -827,3 +1307,17 @@ void cpuid_free_cpu_list(struct cpu_list_t* list)
free(list->names[i]);
free(list->names);
}
void cpuid_free_raw_data_array(struct cpu_raw_data_array_t* raw_array)
{
if (raw_array->num_raw <= 0) return;
free(raw_array->raw);
raw_array->num_raw = 0;
}
void cpuid_free_system_id(struct system_id_t* system)
{
if (system->num_cpu_types <= 0) return;
free(system->cpu_types);
system->num_cpu_types = 0;
}

View File

@ -33,3 +33,14 @@ cpuid_get_vendor @29
cpu_rdmsr_range @30
cpuid_get_epc @31
msr_serialize_raw_data @32
cpuid_get_all_raw_data @33
cpuid_serialize_all_raw_data @34
cpuid_deserialize_all_raw_data @35
cpu_identify_all @36
cpu_request_core_type @37
cpu_architecture_str @38
cpu_purpose_str @39
cpuid_free_raw_data_array @40
affinity_mask_str @41
cpuid_free_system_id @42
affinity_mask_str_r @43

View File

@ -90,6 +90,9 @@
* @brief LibCPUID provides CPU identification
@{ */
/* Include C99 booleans: */
#include <stdbool.h>
/* Include some integer type specifications: */
#include "libcpuid_types.h"
@ -121,6 +124,30 @@ typedef enum {
} cpu_vendor_t;
#define NUM_CPU_VENDORS NUM_CPU_VENDORS
/**
* @brief CPU architecture
*/
typedef enum {
ARCHITECTURE_X86 = 0, /*!< x86 CPU */
ARCHITECTURE_ARM, /*!< ARM CPU */
NUM_CPU_ARCHITECTURES, /*!< Valid CPU architecture ids: 0..NUM_CPU_ARCHITECTURES - 1 */
ARCHITECTURE_UNKNOWN = -1,
} cpu_architecture_t;
#define NUM_CPU_ARCHITECTURES NUM_CPU_ARCHITECTURES
/**
* @brief CPU purpose
*/
typedef enum {
PURPOSE_GENERAL = 0, /*!< general purpose CPU */
PURPOSE_PERFORMANCE, /*!< performance CPU */
PURPOSE_EFFICIENCY, /*!< efficiency CPU */
NUM_CPU_PURPOSES, /*!< Valid CPU purpose ids: 0..NUM_CPU_PURPOSES - 1 */
} cpu_purpose_t;
#define NUM_CPU_PURPOSES NUM_CPU_PURPOSES
/**
* @brief Contains just the raw CPUID data.
*
@ -163,6 +190,29 @@ struct cpu_raw_data_t {
uint32_t amd_fn8000001dh[MAX_AMDFN8000001DH_LEVEL][NUM_REGS];
};
/**
* @brief Contains an array of raw CPUID data.
*
* This contains one \ref cpu_raw_data_t for each logical CPU.
*
* @note There is a hard limit of raw array: it is bounded by the logical_cpu_t type.
* In other words, the limit is 65536 logical CPUs in the system.
*/
struct cpu_raw_data_array_t {
/** Indicates if \ref raw was obtained by using CPU affinity
* if false, \ref raw contains a single data from an old dump (versions 0.5.1 and below).
* if true, \ref raw contains data from a new dump (versions 0.6.0 and above).
* if true and if \ref num_raw is 1, it indicates only one logical core was detected on the system.
*/
bool with_affinity;
/** \ref raw length */
logical_cpu_t num_raw;
/** array of raw CPUID data */
struct cpu_raw_data_t* raw;
};
/**
* @brief This contains information about SGX features of the processor
* Example usage:
@ -231,6 +281,9 @@ struct cpu_sgx_t {
* @brief This contains the recognized CPU features/info
*/
struct cpu_id_t {
/** contains the CPU architecture ID (e.g. ARCHITECTURE_X86) */
cpu_architecture_t architecture;
/** contains the CPU vendor string, e.g. "GenuineIntel" */
char vendor_str[VENDOR_STR_MAX];
@ -385,6 +438,23 @@ struct cpu_id_t {
/** contains information about SGX features if the processor, if present */
struct cpu_sgx_t sgx;
/** bitmask of the affinity ids this processor type is occupying */
cpu_affinity_mask_t affinity_mask;
/** processor type purpose, relevant in case of hybrid CPU (e.g. PURPOSE_PERFORMANCE) */
cpu_purpose_t purpose;
};
/**
* @brief This contains the recognized features/info for all CPUs on the system
*/
struct system_id_t {
/** count of different processor types in the system (e.g. performance, efficiency, ...) */
uint8_t num_cpu_types;
/** array of recognized CPU features/info for each different processor types in the system */
struct cpu_id_t* cpu_types;
};
/**
@ -587,6 +657,7 @@ typedef enum {
ERR_INVCNB = -14, /*!< Invalid core number */
ERR_HANDLE_R = -15, /*!< Error on handle read */
ERR_INVRANGE = -16, /*!< Invalid given range */
ERR_NOT_FOUND= -17, /*!< Requested type not found */
} cpu_error_t;
/**
@ -645,6 +716,17 @@ void cpu_exec_cpuid_ext(uint32_t* regs);
*/
int cpuid_get_raw_data(struct cpu_raw_data_t* data);
/**
* @brief Obtains the raw CPUID data from all CPUs
* @param data - a pointer to cpu_raw_data_array_t structure
* @note As the memory is dynamically allocated, be sure to call
* cpuid_free_raw_data_array() after you're done with the data
* @returns zero if successful, and some negative number on error.
* The error message can be obtained by calling \ref cpuid_error.
* @see cpu_error_t
*/
int cpuid_get_all_raw_data(struct cpu_raw_data_array_t* data);
/**
* @brief Writes the raw CPUID data to a text file
* @param data - a pointer to cpu_raw_data_t structure
@ -664,6 +746,25 @@ int cpuid_get_raw_data(struct cpu_raw_data_t* data);
*/
int cpuid_serialize_raw_data(struct cpu_raw_data_t* data, const char* filename);
/**
* @brief Writes all the raw CPUID data to a text file
* @param data - a pointer to cpu_raw_data_array_t structure
* @param filename - the path of the file, where the serialized data for all CPUs
* should be written. If empty, stdout will be used.
* @note This is intended primarily for debugging. On some processor, which is
* not currently supported or not completely recognized by cpu_identify_all,
* one can still successfully get the raw data and write it to a file.
* libcpuid developers can later import this file and debug the detection
* code as if running on the actual hardware.
* The file is simple text format of "something=value" pairs. Version info
* is also written, but the format is not intended to be neither backward-
* nor forward compatible.
* @returns zero if successful, and some negative number on error.
* The error message can be obtained by calling \ref cpuid_error.
* @see cpu_error_t
*/
int cpuid_serialize_all_raw_data(struct cpu_raw_data_array_t* data, const char* filename);
/**
* @brief Reads raw CPUID data from file
* @param data - a pointer to cpu_raw_data_t structure. The deserialized data will
@ -678,6 +779,22 @@ int cpuid_serialize_raw_data(struct cpu_raw_data_t* data, const char* filename);
*/
int cpuid_deserialize_raw_data(struct cpu_raw_data_t* data, const char* filename);
/**
* @brief Reads all raw CPUID data from file
* @param data - a pointer to cpu_raw_data_array_t structure. The deserialized array data will
* be written here.
* @param filename - the path of the file, containing the serialized raw data.
* If empty, stdin will be used.
* @note This function may fail, if the file is created by different version of
* the library. Also, see the notes on cpuid_serialize_all_raw_data.
* @note As the memory is dynamically allocated, be sure to call
* cpuid_free_raw_data_array() after you're done with the data
* @returns zero if successful, and some negative number on error.
* The error message can be obtained by calling \ref cpuid_error.
* @see cpu_error_t
*/
int cpuid_deserialize_all_raw_data(struct cpu_raw_data_array_t* data, const char* filename);
/**
* @brief Identifies the CPU
* @param raw - Input - a pointer to the raw CPUID data, which is obtained
@ -703,6 +820,67 @@ int cpuid_deserialize_raw_data(struct cpu_raw_data_t* data, const char* filename
*/
int cpu_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data);
/**
* @brief Identifies all the CPUs
* @param raw_array - Input - a pointer to the array of raw CPUID data, which is obtained
* either by cpuid_get_all_raw_data or cpuid_deserialize_all_raw_data.
* Can also be NULL, in which case the functions calls
* cpuid_get_all_raw_data itself.
* @param system - Output - the decoded CPU features/info is written here for each CPU type.
* @note The function is similar to cpu_identify. Refer to cpu_identify notes.
* @note As the memory is dynamically allocated, be sure to call
* cpuid_free_raw_data_array() and cpuid_free_system_id() after you're done with the data
* @returns zero if successful, and some negative number on error.
* The error message can be obtained by calling \ref cpuid_error.
* @see cpu_error_t
*/
int cpu_identify_all(struct cpu_raw_data_array_t* raw_array, struct system_id_t* system);
/**
* @brief Identifies a given CPU type
* @param purpose - Input - a \ref cpu_purpose_t to request
* @param raw_array - Optional input - a pointer to the array of raw CPUID data, which is obtained
* either by cpuid_get_all_raw_data or cpuid_deserialize_all_raw_data.
* Can also be NULL, in which case the functions calls
* cpuid_get_all_raw_data itself.
* @param data - Output - the decoded CPU features/info is written here.
* @returns zero if successful, and some negative number on error (like ERR_NOT_FOUND if CPU type not found).
* The error message can be obtained by calling \ref cpuid_error.
* @see cpu_error_t
*/
int cpu_request_core_type(cpu_purpose_t purpose, struct cpu_raw_data_array_t* raw_array, struct cpu_id_t* data);
/**
* @brief Returns the short textual representation of a CPU architecture
* @param architecture - the architecture, whose textual representation is wanted.
* @returns a constant string like "x86", "ARM", etc.
*/
const char* cpu_architecture_str(cpu_architecture_t architecture);
/**
* @brief Returns the short textual representation of a CPU purpose
* @param purpose - the purpose, whose textual representation is wanted.
* @returns a constant string like "general", "performance", "efficiency", etc.
*/
const char* cpu_purpose_str(cpu_purpose_t purpose);
/**
* @brief Returns textual representation of a CPU affinity mask (thread-safe)
* @param affinity_mask - Input - the affinity mask (in hexadecimal), whose textual representation is wanted.
* @param buffer - Output - an allocated string where to store the textual representation, like "0000FFFF", "00FF0000", etc.
* @param buffer_len - Input - the size of buffer.
* @returns a pointer on buffer
*/
char* affinity_mask_str_r(cpu_affinity_mask_t* affinity_mask, char* buffer, uint32_t buffer_len);
/**
* @brief Returns textual representation of a CPU affinity mask
* @param affinity_mask - the affinity mask (in hexadecimal), whose textual representation is wanted.
* @note This function is not thread-safe
* @returns a string like "0000FFFF", "00FF0000", etc.
*/
char* affinity_mask_str(cpu_affinity_mask_t *affinity_mask);
/**
* @brief Returns the short textual representation of a CPU flag
* @param feature - the feature, whose textual representation is wanted.
@ -1029,6 +1207,26 @@ void cpuid_get_cpu_list(cpu_vendor_t vendor, struct cpu_list_t* list);
*/
void cpuid_free_cpu_list(struct cpu_list_t* list);
/**
* @brief Frees a RAW array
*
* This function deletes all the memory associated with a RAW array, as obtained
* by cpuid_get_all_raw_data(), cpuid_deserialize_all_raw_data() and cpu_identify_all()
*
* @param raw_array - the RAW array to be free()'d.
*/
void cpuid_free_raw_data_array(struct cpu_raw_data_array_t* raw_array);
/**
* @brief Frees a system ID type
*
* This function deletes all the memory associated with a system ID, as obtained
* by cpu_identify_all()
*
* @param system - the system ID to be free()'d.
*/
void cpuid_free_system_id(struct system_id_t* system);
struct msr_driver_t;
/**
* @brief Starts/opens a driver, needed to read MSRs (Model Specific Registers)

View File

@ -30,3 +30,14 @@ cpuid_get_vendor
cpu_rdmsr_range
cpuid_get_epc
msr_serialize_raw_data
cpuid_get_all_raw_data
cpuid_serialize_all_raw_data
cpuid_deserialize_all_raw_data
cpu_identify_all
cpu_request_core_type
cpu_architecture_str
cpu_purpose_str
cpuid_free_raw_data_array
affinity_mask_str
cpuid_free_system_id
affinity_mask_str_r

View File

@ -44,6 +44,8 @@
#define MAX_AMDFN8000001DH_LEVEL 4
#define CPU_HINTS_MAX 16
#define SGX_FLAGS_MAX 14
#define ADDRESS_EXT_CPUID_START 0x80000000
#define ADDRESS_EXT_CPUID_END ADDRESS_EXT_CPUID_START + MAX_EXT_CPUID_LEVEL
typedef enum {
EAX,

View File

@ -59,6 +59,8 @@ struct internal_id_info_t {
} code;
uint64_t bits;
int score; // detection (matchtable) score
int32_t smt_id;
int32_t core_id;
};
#define LBIT(x) (((long long) 1) << x)

View File

@ -60,4 +60,12 @@ typedef unsigned short uint16_t;
#endif
typedef uint16_t logical_cpu_t;
#define __MASK_NCPUBITS 8
#define __MASK_SETSIZE (1ULL << (sizeof(logical_cpu_t) * __MASK_NCPUBITS)) / __MASK_NCPUBITS
struct _cpu_affinity_mask_t {
uint8_t __bits[__MASK_SETSIZE];
};
typedef struct _cpu_affinity_mask_t cpu_affinity_mask_t;
#endif /* __LIBCPUID_TYPES_H__ */

View File

@ -237,3 +237,31 @@ void debug_print_lbits(int debuglevel, uint64_t mask)
}
debugf(2, "\n");
}
/* Functions to manage cpu_affinity_mask_t type
* Adapted from https://electronics.stackexchange.com/a/200070
*/
void inline init_affinity_mask(cpu_affinity_mask_t *affinity_mask)
{
memset(affinity_mask->__bits, 0x00, __MASK_SETSIZE);
}
void inline copy_affinity_mask(cpu_affinity_mask_t *dest_affinity_mask, cpu_affinity_mask_t *src_affinity_mask)
{
memcpy(dest_affinity_mask->__bits, src_affinity_mask->__bits, __MASK_SETSIZE);
}
void inline set_affinity_mask_bit(logical_cpu_t logical_cpu, cpu_affinity_mask_t *affinity_mask)
{
affinity_mask->__bits[logical_cpu / __MASK_NCPUBITS] |= 0x1 << (logical_cpu % __MASK_NCPUBITS);
}
bool inline get_affinity_mask_bit(logical_cpu_t logical_cpu, cpu_affinity_mask_t *affinity_mask)
{
return (affinity_mask->__bits[logical_cpu / __MASK_NCPUBITS] & (0x1 << (logical_cpu % __MASK_NCPUBITS))) != 0x00;
}
void inline clear_affinity_mask_bit(logical_cpu_t logical_cpu, cpu_affinity_mask_t *affinity_mask)
{
affinity_mask->__bits[logical_cpu / __MASK_NCPUBITS] &= ~(0x1 << (logical_cpu % __MASK_NCPUBITS));
}

View File

@ -95,4 +95,23 @@ int set_error(cpu_error_t err);
extern libcpuid_warn_fn_t _warn_fun;
extern int _current_verboselevel;
/*
* Manage cpu_affinity_mask_t type
*/
/* initialize affinity_mask */
extern inline void init_affinity_mask(cpu_affinity_mask_t *affinity_mask);
/* copy one affinity_mask to another one */
extern inline void copy_affinity_mask(cpu_affinity_mask_t *dest_affinity_mask, cpu_affinity_mask_t *src_affinity_mask);
/* set bit corresponding to 'logical_cpu' to '1' */
extern inline void set_affinity_mask_bit(logical_cpu_t logical_cpu, cpu_affinity_mask_t *affinity_mask);
/* get bit corresponding to 'logical_cpu' */
extern inline bool get_affinity_mask_bit(logical_cpu_t logical_cpu, cpu_affinity_mask_t *affinity_mask);
/* set bit corresponding to 'logical_cpu' to '0' */
void clear_affinity_mask_bit(logical_cpu_t logical_cpu, cpu_affinity_mask_t *affinity_mask);
#endif /* __LIBCPUID_UTIL_H__ */

View File

@ -64,6 +64,7 @@ enum _intel_model_t {
_9xxx, /* Core i[3579] 9xxx */
_10xxx, /* Core i[3579] 10xxx */
_11xxx, /* Core i[3579] 11xxx */
_12xxx, /* Core i[3579] 11xxx */
};
typedef enum _intel_model_t intel_model_t;
@ -423,6 +424,16 @@ const struct match_entry_t cpudb_intel[] = {
{ 6, 12, -1, -1, 140, -1, -1, -1, NC, CORE_|_I_|_3 ,_11xxx, "Tiger Lake (Core i3)" },
{ 6, 12, -1, -1, 140, 2, -1, -1, NC, PENTIUM_ , 0, "Tiger Lake (Pentium)" },
{ 6, 12, -1, -1, 140, 2, -1, -1, NC, CELERON_ , 0, "Tiger Lake (Celeron)" },
/* Alder Lake CPUs (12th gen, 10nm, mobile processors): */
{ 6, 7, -1, -1, 151, -1, -1, -1, NC, CORE_|_I_|_9 ,_12xxx, "Alder Lake-S (Core i9)" },
{ 6, 7, -1, -1, 151, -1, -1, -1, NC, CORE_|_I_|_7 ,_12xxx, "Alder Lake-S (Core i7)" },
{ 6, 7, -1, -1, 151, -1, -1, -1, NC, CORE_|_I_|_5 ,_12xxx, "Alder Lake-S (Core i5)" },
{ 6, 7, -1, -1, 151, -1, -1, -1, NC, CORE_|_I_|_3 ,_12xxx, "Alder Lake-S (Core i3)" },
{ 6, 10, -1, -1, 154, -1, -1, -1, NC, CORE_|_I_|_9 ,_12xxx, "Alder Lake-P (Core i9)" },
{ 6, 10, -1, -1, 154, -1, -1, -1, NC, CORE_|_I_|_7 ,_12xxx, "Alder Lake-P (Core i7)" },
{ 6, 10, -1, -1, 154, -1, -1, -1, NC, CORE_|_I_|_5 ,_12xxx, "Alder Lake-P (Core i5)" },
{ 6, 10, -1, -1, 154, -1, -1, -1, NC, CORE_|_I_|_3 ,_12xxx, "Alder Lake-P (Core i3)" },
/* F M S EF EM C L2 L3 Brand */
@ -667,21 +678,34 @@ static void decode_intel_deterministic_cache_info(struct cpu_raw_data_t* raw,
}
static int decode_intel_extended_topology(struct cpu_raw_data_t* raw,
struct cpu_id_t* data)
struct cpu_id_t* data,
struct internal_id_info_t* internal)
{
int i, level_type, num_smt = -1, num_core = -1;
for (i = 0; i < MAX_INTELFN11_LEVEL; i++) {
level_type = (raw->intel_fn11[i][ECX] & 0xff00) >> 8;
uint8_t apic_package_shift = 0, apic_shift = 0, apic_next_shift;
uint32_t apic_id, unique_id;
for (i = 0; (raw->intel_fn11[i][EAX] != 0x0) && (raw->intel_fn11[i][EBX] != 0x0) && (i < MAX_INTELFN11_LEVEL); i++)
apic_package_shift = EXTRACTS_BITS(raw->intel_fn11[i][EAX], 4, 0);
for (i = 0; (raw->intel_fn11[i][EAX] != 0x0) && (raw->intel_fn11[i][EBX] != 0x0) && (i < MAX_INTELFN11_LEVEL); i++) {
level_type = EXTRACTS_BITS(raw->intel_fn11[i][ECX], 15, 8);
apic_next_shift = EXTRACTS_BITS(raw->intel_fn11[i][EAX], 4, 0);
apic_id = raw->intel_fn11[i][EDX];
unique_id = (apic_id >> apic_shift) & ((1 << (apic_package_shift - apic_shift)) - 1);
switch (level_type) {
case 0x01:
num_smt = raw->intel_fn11[i][EBX] & 0xffff;
num_smt = EXTRACTS_BITS(raw->intel_fn11[i][EBX], 15, 0);
internal->smt_id = unique_id;
break;
case 0x02:
num_core = raw->intel_fn11[i][EBX] & 0xffff;
num_core = EXTRACTS_BITS(raw->intel_fn11[i][EBX], 15, 0);
internal->core_id = unique_id;
break;
default:
break;
}
apic_shift = apic_next_shift;
}
if (num_smt == -1 || num_core == -1) return 0;
data->num_logical_cpus = num_core;
@ -694,12 +718,13 @@ static int decode_intel_extended_topology(struct cpu_raw_data_t* raw,
}
static void decode_intel_number_of_cores(struct cpu_raw_data_t* raw,
struct cpu_id_t* data)
struct cpu_id_t* data,
struct internal_id_info_t* internal)
{
int logical_cpus = -1, num_cores = -1;
if (raw->basic_cpuid[0][EAX] >= 11) {
if (decode_intel_extended_topology(raw, data)) return;
if (decode_intel_extended_topology(raw, data, internal)) return;
}
if (raw->basic_cpuid[0][EAX] >= 1) {
@ -982,7 +1007,8 @@ int cpuid_identify_intel(struct cpu_raw_data_t* raw, struct cpu_id_t* data, stru
} else if (raw->basic_cpuid[0][EAX] >= 2) {
decode_intel_oldstyle_cache_info(raw, data);
}
decode_intel_number_of_cores(raw, data);
decode_intel_number_of_cores(raw, data, internal);
data->purpose = cpuid_identify_purpose_intel(raw);
brand = get_brand_code_and_bits(data);
model_code = get_model_code(data);
@ -1020,3 +1046,27 @@ void cpuid_get_list_intel(struct cpu_list_t* list)
{
generic_get_cpu_list(cpudb_intel, COUNT_OF(cpudb_intel), list);
}
cpu_purpose_t cpuid_identify_purpose_intel(struct cpu_raw_data_t* raw)
{
/* Check for hybrid architecture
From Intel® 64 and IA-32 Architectures Software Developers Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4
Available at https://cdrdv2.intel.com/v1/dl/getContent/671200
- CPUID[7h] is Structured Extended Feature Flags Enumeration Leaf (Output depends on ECX input value)
EDX, bit 15: Hybrid. If 1, the processor is identified as a hybrid part.
- CPUID[1Ah] is Hybrid Information Enumeration Leaf (EAX = 1AH, ECX = 0)
EAX, bits 31-24: Core type
*/
if (EXTRACTS_BIT(raw->basic_cpuid[0x7][EDX], 15) == 0x1) {
debugf(3, "Detected Intel CPU hybrid architecture\n");
switch (EXTRACTS_BITS(raw->basic_cpuid[0x1a][EAX], 31, 24)) {
case 0x20: /* Atom */ return PURPOSE_EFFICIENCY;
case 0x40: /* Core */ return PURPOSE_PERFORMANCE;
default: return PURPOSE_GENERAL;
}
}
return PURPOSE_GENERAL;
}

View File

@ -28,5 +28,6 @@
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);
cpu_purpose_t cpuid_identify_purpose_intel(struct cpu_raw_data_t* raw);
#endif /*__RECOG_INTEL_H__*/

View File

@ -1,8 +1,3 @@
if(UNIX)
add_executable(convert_instlatx64 convert_instlatx64.c)
target_link_libraries(convert_instlatx64 PUBLIC cpuid)
endif(UNIX)
add_custom_target(test DEPENDS test-fast)
add_custom_target(

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
1
0

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
1
2

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=ffffffff ffffffff ffffffff ffffffff
amd_fn8000001dh[2]=ffffffff ffffffff ffffffff ffffffff
amd_fn8000001dh[3]=ffffffff ffffffff ffffffff ffffffff
--------------------------------------------------------------------------------
x86
general
15
0
1

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
2
0

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
6
3

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
2
3

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
5
2

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
5
2

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
5
2

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
6
2

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
9
1

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
4
2

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
4
2

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
10
0

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
2
3

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
6
2

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
8
1

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
8
1

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
10
0

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
11
2

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
12
2

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
12
2

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
12
0

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
3
2

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
15
1

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
4
2

View File

@ -43,6 +43,8 @@ ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000000 00000100 00000000 00000000
ext_cpuid[31]=0000000f 0000016f 0000000f 00000000
--------------------------------------------------------------------------------
x86
general
15
8
1

View File

@ -43,6 +43,8 @@ ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000000 00000100 00000000 00000000
ext_cpuid[31]=0000000f 0000016f 0000000f 00000000
--------------------------------------------------------------------------------
x86
general
15
8
2

View File

@ -43,6 +43,8 @@ ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000000 00000100 00000300 00000000
ext_cpuid[31]=0000000f 0000016f 0000000f 00000001
--------------------------------------------------------------------------------
x86
general
15
8
2

View File

@ -43,6 +43,8 @@ ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000000 00000100 00000300 00000000
ext_cpuid[31]=0000000f 0000016f 0000000f 00000001
--------------------------------------------------------------------------------
x86
general
15
1
2

View File

@ -75,6 +75,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
1
0

View File

@ -43,6 +43,8 @@ ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000000 00000100 00000000 00000000
ext_cpuid[31]=0000000f 0000016f 0000000f 00000000
--------------------------------------------------------------------------------
x86
general
15
1
0

View File

@ -43,6 +43,8 @@ ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000000 00000100 00000000 00000000
ext_cpuid[31]=00000007 0000016f 0000000f 00000000
--------------------------------------------------------------------------------
x86
general
15
1
1

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
1
1

View File

@ -43,6 +43,8 @@ ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000000 00000100 00000100 00000000
ext_cpuid[31]=00000007 0000016f 0000000f 00000001
--------------------------------------------------------------------------------
x86
general
15
1
1

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0001c163 03c0003f 00003fff 00000001
--------------------------------------------------------------------------------
x86
general
15
1
0

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00000fff 00000001
--------------------------------------------------------------------------------
x86
general
15
8
1

View File

@ -1,5 +1,654 @@
_________________ Logical CPU #0 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 050c0800 7ed8320b 178bfbff
basic_cpuid[1]=00870f10 000c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 00000000
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000000 00000100 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 00000000
intel_fn11[1]=00000007 0000000c 00000201 00000000
intel_fn11[2]=00000000 00000000 00000002 00000000
intel_fn11[3]=00000000 00000000 00000003 00000000
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #1 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 020c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 00000002
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000002 00000101 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 00000002
intel_fn11[1]=00000007 0000000c 00000201 00000002
intel_fn11[2]=00000000 00000000 00000002 00000002
intel_fn11[3]=00000000 00000000 00000003 00000002
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #2 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 040c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 00000004
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000004 00000102 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 00000004
intel_fn11[1]=00000007 0000000c 00000201 00000004
intel_fn11[2]=00000000 00000000 00000002 00000004
intel_fn11[3]=00000000 00000000 00000003 00000004
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #3 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 080c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 00000008
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000008 00000104 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 00000008
intel_fn11[1]=00000007 0000000c 00000201 00000008
intel_fn11[2]=00000000 00000000 00000002 00000008
intel_fn11[3]=00000000 00000000 00000003 00000008
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #4 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 0a0c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 0000000a
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=0000000a 00000105 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 0000000a
intel_fn11[1]=00000007 0000000c 00000201 0000000a
intel_fn11[2]=00000000 00000000 00000002 0000000a
intel_fn11[3]=00000000 00000000 00000003 0000000a
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #5 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 0c0c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 0000000c
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=0000000c 00000106 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 0000000c
intel_fn11[1]=00000007 0000000c 00000201 0000000c
intel_fn11[2]=00000000 00000000 00000002 0000000c
intel_fn11[3]=00000000 00000000 00000003 0000000c
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #6 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 010c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 00000001
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000001 00000100 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 00000001
intel_fn11[1]=00000007 0000000c 00000201 00000001
intel_fn11[2]=00000000 00000000 00000002 00000001
intel_fn11[3]=00000000 00000000 00000003 00000001
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #7 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 030c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 00000003
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000003 00000101 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 00000003
intel_fn11[1]=00000007 0000000c 00000201 00000003
intel_fn11[2]=00000000 00000000 00000002 00000003
intel_fn11[3]=00000000 00000000 00000003 00000003
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #8 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 050c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
@ -78,7 +727,252 @@ amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #9 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 090c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 00000009
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=00000009 00000104 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 00000009
intel_fn11[1]=00000007 0000000c 00000201 00000009
intel_fn11[2]=00000000 00000000 00000002 00000009
intel_fn11[3]=00000000 00000000 00000003 00000009
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #10 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 0b0c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 0000000b
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=0000000b 00000105 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 0000000b
intel_fn11[1]=00000007 0000000c 00000201 0000000b
intel_fn11[2]=00000000 00000000 00000002 0000000b
intel_fn11[3]=00000000 00000000 00000003 0000000b
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
_________________ Logical CPU #11 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65
basic_cpuid[1]=00870f10 0d0c0800 7ef8320b 178bfbff
basic_cpuid[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=00000000 00000000 00000000 00000000
basic_cpuid[5]=00000040 00000040 00000003 00000011
basic_cpuid[6]=00000004 00000000 00000001 00000000
basic_cpuid[7]=00000000 219c91a9 00400004 00000000
basic_cpuid[8]=00000000 00000000 00000000 00000000
basic_cpuid[9]=00000000 00000000 00000000 00000000
basic_cpuid[10]=00000000 00000000 00000000 00000000
basic_cpuid[11]=00000001 00000002 00000100 0000000d
basic_cpuid[12]=00000000 00000000 00000000 00000000
basic_cpuid[13]=00000207 00000340 00000380 00000000
basic_cpuid[14]=00000000 00000000 00000000 00000000
basic_cpuid[15]=00000000 000000ff 00000000 00000002
basic_cpuid[16]=00000000 00000002 00000000 00000000
basic_cpuid[17]=00000000 00000000 00000000 00000000
basic_cpuid[18]=00000000 00000000 00000000 00000000
basic_cpuid[19]=00000000 00000000 00000000 00000000
basic_cpuid[20]=00000000 00000000 00000000 00000000
basic_cpuid[21]=00000000 00000000 00000000 00000000
basic_cpuid[22]=00000000 00000000 00000000 00000000
basic_cpuid[23]=00000000 00000000 00000000 00000000
basic_cpuid[24]=00000000 00000000 00000000 00000000
basic_cpuid[25]=00000000 00000000 00000000 00000000
basic_cpuid[26]=00000000 00000000 00000000 00000000
basic_cpuid[27]=00000000 00000000 00000000 00000000
basic_cpuid[28]=00000000 00000000 00000000 00000000
basic_cpuid[29]=00000000 00000000 00000000 00000000
basic_cpuid[30]=00000000 00000000 00000000 00000000
basic_cpuid[31]=00000000 00000000 00000000 00000000
ext_cpuid[0]=80000020 68747541 444d4163 69746e65
ext_cpuid[1]=00870f10 20000000 75c237ff 2fd3fbff
ext_cpuid[2]=20444d41 657a7952 2035206e 30303633
ext_cpuid[3]=2d362058 65726f43 6f725020 73736563
ext_cpuid[4]=2020726f 20202020 20202020 00202020
ext_cpuid[5]=ff40ff40 ff40ff40 20080140 20080140
ext_cpuid[6]=48006400 68006400 02006140 01009140
ext_cpuid[7]=00000000 0000001b 00000000 00006799
ext_cpuid[8]=00003030 010cb657 0000700b 00010000
ext_cpuid[9]=00000000 00000000 00000000 00000000
ext_cpuid[10]=00000001 00008000 00000000 0013bcff
ext_cpuid[11]=00000000 00000000 00000000 00000000
ext_cpuid[12]=00000000 00000000 00000000 00000000
ext_cpuid[13]=00000000 00000000 00000000 00000000
ext_cpuid[14]=00000000 00000000 00000000 00000000
ext_cpuid[15]=00000000 00000000 00000000 00000000
ext_cpuid[16]=00000000 00000000 00000000 00000000
ext_cpuid[17]=00000000 00000000 00000000 00000000
ext_cpuid[18]=00000000 00000000 00000000 00000000
ext_cpuid[19]=00000000 00000000 00000000 00000000
ext_cpuid[20]=00000000 00000000 00000000 00000000
ext_cpuid[21]=00000000 00000000 00000000 00000000
ext_cpuid[22]=00000000 00000000 00000000 00000000
ext_cpuid[23]=00000000 00000000 00000000 00000000
ext_cpuid[24]=00000000 00000000 00000000 00000000
ext_cpuid[25]=f040f040 00000000 00000000 00000000
ext_cpuid[26]=00000006 00000000 00000000 00000000
ext_cpuid[27]=000003ff 00000000 00000000 00000000
ext_cpuid[28]=00000000 00000000 00000000 00000000
ext_cpuid[29]=00004121 01c0003f 0000003f 00000000
ext_cpuid[30]=0000000d 00000106 00000000 00000000
ext_cpuid[31]=0001000f 0000016f 000001fd 00000001
intel_fn4[0]=00000000 00000000 00000000 00000000
intel_fn4[1]=00000000 00000000 00000000 00000000
intel_fn4[2]=00000000 00000000 00000000 00000000
intel_fn4[3]=00000000 00000000 00000000 00000000
intel_fn4[4]=00000000 00000000 00000000 00000000
intel_fn4[5]=00000000 00000000 00000000 00000000
intel_fn4[6]=00000000 00000000 00000000 00000000
intel_fn4[7]=00000000 00000000 00000000 00000000
intel_fn11[0]=00000001 00000002 00000100 0000000d
intel_fn11[1]=00000007 0000000c 00000201 0000000d
intel_fn11[2]=00000000 00000000 00000002 0000000d
intel_fn11[3]=00000000 00000000 00000003 0000000d
amd_fn8000001dh[0]=00004121 01c0003f 0000003f 00000000
amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
--------------------------------------------------------------------------------
x86
general
15
1
0

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00000122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00000143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00008163 03c0003f 00000fff 00000001
--------------------------------------------------------------------------------
x86
general
15
0
1

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0001c163 03c0003f 00000fff 00000001
--------------------------------------------------------------------------------
x86
general
15
8
1

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0001c163 03c0003f 00003fff 00000001
--------------------------------------------------------------------------------
x86
general
15
1
0

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0001c163 03c0003f 00000fff 00000001
--------------------------------------------------------------------------------
x86
general
15
0
1

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001
--------------------------------------------------------------------------------
x86
general
15
1
0

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0001c163 03c0003f 00003fff 00000001
--------------------------------------------------------------------------------
x86
general
15
1
0

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0003c163 03c0003f 00007fff 00000001
--------------------------------------------------------------------------------
x86
general
15
1
1

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0003c163 03c0003f 00003fff 00000001
--------------------------------------------------------------------------------
x86
general
15
0
0

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0003c163 03c0003f 00003fff 00000001
--------------------------------------------------------------------------------
x86
general
15
4
1

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=ffffffff ffffffff ffffffff ffffffff
amd_fn8000001dh[2]=ffffffff ffffffff ffffffff ffffffff
amd_fn8000001dh[3]=ffffffff ffffffff ffffffff ffffffff
--------------------------------------------------------------------------------
x86
general
15
1
2

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0003c163 03c0003f 00003fff 00000001
--------------------------------------------------------------------------------
x86
general
15
0
0

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0003c163 03c0003f 00003fff 00000001
--------------------------------------------------------------------------------
x86
general
15
4
1

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0003c163 03c0003f 00007fff 00000001
--------------------------------------------------------------------------------
x86
general
15
1
0

View File

@ -1,180 +0,0 @@
/* This program can be used to convert CPUID Dump from http://instlatx64.atw.hu/
* To build: gcc convert_instlatx64.c -o convert_instlatx64
* To run: ./convert_instlatx64 <input file (from instlatx64)> <output file (without extension)>
* Then, you can use the create_test.py script to create the test file */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include "../libcpuid/libcpuid.h"
#define LINE_LEN 60
#define FILENAME_LEN 128
#define LIB_DIR_LEN 1024
#define TOOL_LEN 2048
#define CMD_LEN 4096
#define EXT_CPUID 0x80000000
#define NOT_AFFECTED(__line) (__line[0] == 0xffffffff) && (__line[1] == 0xffffffff) && (__line[2] == 0xffffffff) && (__line[3] == 0xffffffff)
#define AFFECT_DATA_LINE(__line) __line[0] = eax ; __line[1] = ebx ; __line[2] = ecx ; __line[3] = edx
#define AFFECT_DATA_SUBLEAF(__array) __array[subleaf][0] = eax ; __array[subleaf][1] = ebx ; __array[subleaf][2] = ecx ; __array[subleaf][3] = edx
int serialize_raw_data(struct cpu_raw_data_t* data, FILE *f)
{
int i;
for (i = 0; i < MAX_CPUID_LEVEL; i++)
fprintf(f, "basic_cpuid[%d]=%08x %08x %08x %08x\n", i,
data->basic_cpuid[i][EAX], data->basic_cpuid[i][EBX],
data->basic_cpuid[i][ECX], data->basic_cpuid[i][EDX]);
for (i = 0; i < MAX_EXT_CPUID_LEVEL; i++)
fprintf(f, "ext_cpuid[%d]=%08x %08x %08x %08x\n", i,
data->ext_cpuid[i][EAX], data->ext_cpuid[i][EBX],
data->ext_cpuid[i][ECX], data->ext_cpuid[i][EDX]);
for (i = 0; i < MAX_INTELFN4_LEVEL; i++)
fprintf(f, "intel_fn4[%d]=%08x %08x %08x %08x\n", i,
data->intel_fn4[i][EAX], data->intel_fn4[i][EBX],
data->intel_fn4[i][ECX], data->intel_fn4[i][EDX]);
for (i = 0; i < MAX_INTELFN11_LEVEL; i++)
fprintf(f, "intel_fn11[%d]=%08x %08x %08x %08x\n", i,
data->intel_fn11[i][EAX], data->intel_fn11[i][EBX],
data->intel_fn11[i][ECX], data->intel_fn11[i][EDX]);
for (i = 0; i < MAX_INTELFN12H_LEVEL; i++)
fprintf(f, "intel_fn12h[%d]=%08x %08x %08x %08x\n", i,
data->intel_fn12h[i][EAX], data->intel_fn12h[i][EBX],
data->intel_fn12h[i][ECX], data->intel_fn12h[i][EDX]);
for (i = 0; i < MAX_INTELFN14H_LEVEL; i++)
fprintf(f, "intel_fn14h[%d]=%08x %08x %08x %08x\n", i,
data->intel_fn14h[i][EAX], data->intel_fn14h[i][EBX],
data->intel_fn14h[i][ECX], data->intel_fn14h[i][EDX]);
for (i = 0; i < MAX_AMDFN8000001DH_LEVEL; i++)
fprintf(f, "amd_fn8000001dh[%d]=%08x %08x %08x %08x\n", i,
data->amd_fn8000001dh[i][EAX], data->amd_fn8000001dh[i][EBX],
data->amd_fn8000001dh[i][ECX], data->amd_fn8000001dh[i][EDX]);
return 0;
}
int main(int argc, char *argv[])
{
int assigned, subleaf;
uint32_t addr, prev_addr, eax, ebx, ecx, edx;
char line[LINE_LEN], raw_filename[FILENAME_LEN], report_filename[FILENAME_LEN];
char libcpuid_directory[LIB_DIR_LEN], cpuid_tool[TOOL_LEN], cmd[CMD_LEN];
FILE *fin = NULL, *fout = NULL, *ftmp = NULL;
struct cpu_raw_data_t *raw = &(struct cpu_raw_data_t) {};
if(argc < 3)
{
fprintf(stderr, "Usage: %s <input file (from instlatx64)> <output file (without extension)> [--create]\n", argv[0]);
return 1;
}
const char *input_filename = argv[1];
const char *output_filename = argv[2];
snprintf(raw_filename, FILENAME_LEN, "%s.raw", output_filename);
snprintf(report_filename, FILENAME_LEN, "%s_report.txt", output_filename);
memset(raw, 0xff, sizeof(struct cpu_raw_data_t)); // ffffffff ffffffff ffffffff ffffffff means data is missing in output test file
/* Find libcpuid root directory */
if((ftmp = popen("git rev-parse --show-toplevel", "r")) == NULL)
{
perror("Failed to run 'git' command");
return 1;
}
if(fgets(libcpuid_directory, LIB_DIR_LEN, ftmp) == NULL)
{
perror("Failed to get source directory");
return 1;
}
pclose(ftmp);
libcpuid_directory[strlen(libcpuid_directory) - 1] = '\0';
/* Open files */
if((fin = fopen(input_filename, "r")) == NULL)
{
perror("Failed to open input file");
return 1;
}
if((fout = fopen(raw_filename, "w")) == NULL)
{
perror("Failed to open output file");
return 1;
}
/* Parse file and store data in cpu_raw_data_t */
prev_addr = -1;
while(fgets(line, LINE_LEN, fin) != NULL)
{
int assigned = sscanf(line, "CPUID %x: %x-%x-%x-%x [SL %02i]", &addr, &eax, &ebx, &ecx, &edx, &subleaf);
printf("[%i] %s", assigned, line);
if(assigned >= 5)
{
if(addr < MAX_CPUID_LEVEL)
{
if(NOT_AFFECTED(raw->basic_cpuid[addr]))
{
AFFECT_DATA_LINE(raw->basic_cpuid[addr]);
}
}
else if((addr >= EXT_CPUID) && ((addr - EXT_CPUID) < MAX_EXT_CPUID_LEVEL))
{
if(NOT_AFFECTED(raw->ext_cpuid[addr - EXT_CPUID]))
{
AFFECT_DATA_LINE(raw->ext_cpuid[addr - EXT_CPUID]);
}
}
}
if(assigned == 6)
{
switch (addr)
{
case 4: AFFECT_DATA_SUBLEAF(raw->intel_fn4); break;
case 11: AFFECT_DATA_SUBLEAF(raw->intel_fn11); break;
case 0x12: AFFECT_DATA_SUBLEAF(raw->intel_fn12h); break;
case 0x14: AFFECT_DATA_SUBLEAF(raw->intel_fn14h); break;
case 0x8000001D: AFFECT_DATA_SUBLEAF(raw->amd_fn8000001dh); break;
default: break;
}
}
}
/* Write stored data in output file */
serialize_raw_data(raw, fout);
fclose(fout);
/* Invoke cpuid_tool */
snprintf(cpuid_tool, TOOL_LEN, "%s/build/cpuid_tool/cpuid_tool", libcpuid_directory);
if(access(cpuid_tool, F_OK) == 0)
snprintf(cmd, CMD_LEN, "%s --load=%s --report --outfile=%s", cpuid_tool, raw_filename, report_filename);
else
snprintf(cmd, CMD_LEN, "%s/cpuid_tool/cpuid_tool --load=%s --report --outfile=%s", libcpuid_directory, raw_filename, report_filename);
if(system(cmd))
{
perror("Failed to load raw file in cpuid_tool");
return 1;
}
/* Invoke create_test */
snprintf(cmd, CMD_LEN, "%s/tests/create_test.py %s %s > %s.test", libcpuid_directory, raw_filename, report_filename, output_filename);
if((argc > 3) && !strcmp(argv[3], "--create"))
{
if(system(cmd))
{
perror("Failed to create test");
return 1;
}
remove(raw_filename);
remove(report_filename);
}
else
{
printf("Done. Use the following command to create the test file:\n");
printf("%s\n", cmd);
}
return 0;
}

View File

@ -12,12 +12,17 @@ if len(args) != 3:
def readRawFile():
rawdata = []
for line in open(args[1], "rt").readlines():
lookfor = ["basic_cpuid", "ext_cpuid", "intel_fn4", "intel_fn11", "amd_fn8000001dh"]
lookfor = ["basic_cpuid", "ext_cpuid", "intel_fn4", "intel_fn11", "amd_fn8000001dh", "Logical CPU", "CPUID"]
ignore = ["MSR Register"]
good = False
for match in lookfor:
if line.find(match) != -1:
good = True
break
for match in ignore:
if line.find(match) != -1:
good = False
break
if good:
rawdata.append(line.strip())
return rawdata
@ -40,6 +45,14 @@ def readResultFile():
if not rexp.match(value):
raise "Bad format of value: [%s]" % s
repdata.append(rexp.findall(value)[0])
if "CPU Info for type" in field:
repdata.append(delimiter)
if field == "arch":
value = s[s.find(":") + 2:]
repdata.append(value)
if field == "purpose":
value = s[s.find(":") + 2:]
repdata.append(value)
if field == "code name":
value = s[s.find("`") + 1: s.find("'")]
repdata.append(value)
@ -56,5 +69,5 @@ def readResultFile():
return repdata
delimiter = "-" * 80
lines = readRawFile() + [delimiter] + readResultFile()
lines = readRawFile() + readResultFile()
sys.stdout.writelines([s + "\n" for s in lines])

View File

@ -75,6 +75,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
15
0
1

View File

@ -71,6 +71,8 @@ intel_fn11[1]=07280203 00000000 00000000 00000503
intel_fn11[2]=07280203 00000000 00000000 00000503
intel_fn11[3]=07280203 00000000 00000000 00000503
--------------------------------------------------------------------------------
x86
general
6
6
1

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04004122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 01c0003f 000003ff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
12
2

View File

@ -67,6 +67,8 @@ intel_fn4[1]=00004122 01c0003f 0000003f 00000001
intel_fn4[2]=00004143 01c0003f 000003ff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
12
2

View File

@ -71,6 +71,8 @@ intel_fn11[1]=07280203 00000000 00000000 00000503
intel_fn11[2]=07280203 00000000 00000000 00000503
intel_fn11[3]=07280203 00000000 00000000 00000503
--------------------------------------------------------------------------------
x86
general
6
12
10

View File

@ -75,6 +75,8 @@ intel_fn11[1]=07280203 00000000 00000000 00000503
intel_fn11[2]=07280203 00000000 00000000 00000503
intel_fn11[3]=07280203 00000000 00000000 00000503
--------------------------------------------------------------------------------
x86
general
6
12
10

View File

@ -71,6 +71,8 @@ intel_fn11[1]=07280203 00000000 00000000 00000503
intel_fn11[2]=07280203 00000000 00000000 00000503
intel_fn11[3]=07280203 00000000 00000000 00000503
--------------------------------------------------------------------------------
x86
general
6
12
10

View File

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00000000 00200001 00000001 00000121
amd_fn8000001dh[2]=00000000 00040001 00000080 00000043
amd_fn8000001dh[3]=00000000 00040006 00000008 00000043
--------------------------------------------------------------------------------
x86
general
6
10
1

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 01c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
15
13

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
7
10

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 00c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
15
13

View File

@ -71,6 +71,8 @@ intel_fn11[1]=07280202 00000000 00000000 00000000
intel_fn11[2]=07280202 00000000 00000000 00000000
intel_fn11[3]=07280202 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
6
1

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 0040003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
15
13

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 03c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
15
6

View File

@ -71,6 +71,8 @@ intel_fn11[1]=07280202 00000000 00000000 00000503
intel_fn11[2]=07280202 00000000 00000000 00000503
intel_fn11[3]=07280202 00000000 00000000 00000503
--------------------------------------------------------------------------------
x86
general
6
15
11

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 01c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
15
6

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 03c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
15
10

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 02c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
7
6

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
7
10

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 01c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
7
6

View File

@ -67,6 +67,8 @@ intel_fn4[1]=0c000122 01c0003f 0000003f 00000001
intel_fn4[2]=0c004143 03c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
15
7

View File

@ -67,6 +67,8 @@ intel_fn4[1]=0c000122 01c0003f 0000003f 00000001
intel_fn4[2]=0c004143 05c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
7
6

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 05c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
7
6

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 01c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
14
8

View File

@ -71,6 +71,8 @@ intel_fn11[1]=07280201 00000000 00000000 00000000
intel_fn11[2]=07280201 00000000 00000000 00000000
intel_fn11[3]=07280201 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
14
12

View File

@ -67,6 +67,8 @@ intel_fn4[1]=04000122 01c0003f 0000003f 00000001
intel_fn4[2]=04004143 01c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
14
8

View File

@ -71,6 +71,8 @@ intel_fn11[1]=00000000 00000000 00000000 00000000
intel_fn11[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
7
10

View File

@ -67,6 +67,8 @@ intel_fn4[1]=0c000122 01c0003f 0000003f 00000001
intel_fn4[2]=0c004143 05c0003f 00000fff 00000001
intel_fn4[3]=00000000 00000000 00000000 00000000
--------------------------------------------------------------------------------
x86
general
6
7
7

Some files were not shown because too many files have changed in this diff Show More