1
0
Fork 0
mirror of https://github.com/anrieff/libcpuid synced 2024-11-20 23:01:51 +00:00

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/x32
cpuid_tool/x64 cpuid_tool/x64
*.vcxproj.user *.vcxproj.user
tests/convert_instlatx64
build build
docs docs
.vscode .vscode

View file

@ -28,6 +28,7 @@ if(UNIX)
set(exec_prefix "\${prefix}") set(exec_prefix "\${prefix}")
set(libdir "\${exec_prefix}/lib") set(libdir "\${exec_prefix}/lib")
set(includedir "\${prefix}/include") 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 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/libcpuid.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libcpuid.pc" ESCAPE_QUOTES
@ONLY) @ONLY)
install(FILES "${PROJECT_BINARY_DIR}/libcpuid.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 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 EXTRA_DIST = libcpuid.pc.in libcpuid_vc71.sln libcpuid_vc10.sln Readme.md
# CMake support: # CMake support:
EXTRA_DIST += CMakeLists.txt libcpuid/CMakeLists.txt tests/CMakeLists.txt cpuid_tool/CMakeLists.txt \ 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: consistency:
$(top_srcdir)/libcpuid/check-consistency.py $(top_srcdir)/libcpuid $(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 and tests/intel to get an idea) and copy your test file to an
appropriate place within the tests directory hierarchy. 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, For non-developers, who still want to contribute tests for the project,
use [this page](http://libcpuid.sourceforge.net/bugreport.php) to report use [this page](http://libcpuid.sourceforge.net/bugreport.php) to report
misdetections or new CPUs that libcpuid doesn't handle well yet. misdetections or new CPUs that libcpuid doesn't handle well yet.

View file

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

View file

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

View file

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

View file

@ -35,6 +35,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h>
/* Implementation: */ /* 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_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->l1_cacheline = id->l1_data_cacheline = id->l1_instruction_cacheline = id->l2_cacheline = id->l3_cacheline = id->l4_cacheline = -1;
id->sse_size = -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, static void cpu_raw_data_array_t_constructor(struct cpu_raw_data_array_t* raw_array, bool with_affinity)
const char *value, uint32_t array[][4], int limit, int *recognized)
{ {
char format[32]; raw_array->with_affinity = with_affinity;
int veax, vebx, vecx, vedx; raw_array->num_raw = 0;
int index; raw_array->raw = NULL;
}
if (*recognized) return 1; /* already recognized */ static void system_id_t_constructor(struct system_id_t* system)
if (strncmp(token, expected_token, strlen(expected_token))) return 1; /* not what we search for */ {
sprintf(format, "%s[%%d]", expected_token); system->num_cpu_types = 0;
*recognized = 1; system->cpu_types = NULL;
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; static void cpuid_grow_raw_data_array(struct cpu_raw_data_array_t* raw_array, logical_cpu_t n)
array[index][1] = vebx; {
array[index][2] = vecx; logical_cpu_t i;
array[index][3] = vedx; struct cpu_raw_data_t *tmp = NULL;
return 1;
} 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 */ /* 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_types.h>
#include <mach/clock.h> #include <mach/clock.h>
#include <mach/mach.h> #include <mach/mach.h>
#include <mach/thread_policy.h>
static int get_total_cpus(void) static int get_total_cpus(void)
{ {
kern_return_t kr; kern_return_t kr;
@ -107,7 +139,15 @@ static int get_total_cpus(void)
return basic_info.avail_cpus; return basic_info.avail_cpus;
} }
#define GET_TOTAL_CPUS_DEFINED #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 #ifdef _WIN32
#include <windows.h> #include <windows.h>
@ -118,7 +158,44 @@ static int get_total_cpus(void)
return system_info.dwNumberOfProcessors; return system_info.dwNumberOfProcessors;
} }
#define GET_TOTAL_CPUS_DEFINED #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__ #ifdef __HAIKU__
#include <OS.h> #include <OS.h>
@ -129,7 +206,7 @@ static int get_total_cpus(void)
return info.cpu_count; return info.cpu_count;
} }
#define GET_TOTAL_CPUS_DEFINED #define GET_TOTAL_CPUS_DEFINED
#endif #endif /* __HAIKU__ */
#if defined linux || defined __linux__ || defined __sun #if defined linux || defined __linux__ || defined __sun
#include <sys/sysinfo.h> #include <sys/sysinfo.h>
@ -140,7 +217,36 @@ static int get_total_cpus(void)
return sysconf(_SC_NPROCESSORS_ONLN); return sysconf(_SC_NPROCESSORS_ONLN);
} }
#define GET_TOTAL_CPUS_DEFINED #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__ #if defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __bsdi__ || defined __QNX__
#include <sys/types.h> #include <sys/types.h>
@ -155,7 +261,51 @@ static int get_total_cpus(void)
return ncpus; return ncpus;
} }
#define GET_TOTAL_CPUS_DEFINED #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 #ifndef GET_TOTAL_CPUS_DEFINED
static int get_total_cpus(void) static int get_total_cpus(void)
@ -171,6 +321,208 @@ static int get_total_cpus(void)
} }
#endif /* GET_TOTAL_CPUS_DEFINED */ #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) 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) if (data->vendor == VENDOR_UNKNOWN)
return set_error(ERR_CPU_UNKN); return set_error(ERR_CPU_UNKN);
data->architecture = ARCHITECTURE_X86;
basic = raw->basic_cpuid[0][EAX]; basic = raw->basic_cpuid[0][EAX];
if (basic >= 1) { if (basic >= 1) {
data->family = (raw->basic_cpuid[1][EAX] >> 8) & 0xf; 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); 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 cpuid_serialize_raw_data(struct cpu_raw_data_t* data, const char* filename)
{ {
int i; return cpuid_serialize_raw_data_internal(data, NULL, filename);
FILE *f; }
if (!strcmp(filename, "")) int cpuid_serialize_all_raw_data(struct cpu_raw_data_array_t* data, const char* filename)
f = stdout; {
else return cpuid_serialize_raw_data_internal(NULL, data, filename);
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_deserialize_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)
{ {
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); raw_data_t_constructor(data);
return cpuid_deserialize_raw_data_internal(data, NULL, filename);
}
if (!strcmp(filename, "")) int cpuid_deserialize_all_raw_data(struct cpu_raw_data_array_t* data, const char* filename)
f = stdin; {
else return cpuid_deserialize_raw_data_internal(NULL, data, filename);
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 cpu_ident_internal(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal) 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; raw = &myraw;
} }
cpu_id_t_constructor(data); cpu_id_t_constructor(data);
internal->smt_id = -1;
internal->core_id = -1;
if ((r = cpuid_basic_identify(raw, data)) < 0) if ((r = cpuid_basic_identify(raw, data)) < 0)
return set_error(r); return set_error(r);
switch (data->vendor) { 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); 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 cpu_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
{ {
int r;
struct internal_id_info_t throwaway; 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) const char* cpu_feature_str(cpu_feature_t feature)
@ -733,6 +1212,7 @@ const char* cpuid_error(void)
{ ERR_INVCNB , "Invalid core number"}, { ERR_INVCNB , "Invalid core number"},
{ ERR_HANDLE_R , "Error on handle read"}, { ERR_HANDLE_R , "Error on handle read"},
{ ERR_INVRANGE , "Invalid given range"}, { ERR_INVRANGE , "Invalid given range"},
{ ERR_NOT_FOUND, "Requested type not found"},
}; };
unsigned i; unsigned i;
for (i = 0; i < COUNT_OF(matchtable); 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[i]);
free(list->names); 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 cpu_rdmsr_range @30
cpuid_get_epc @31 cpuid_get_epc @31
msr_serialize_raw_data @32 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 * @brief LibCPUID provides CPU identification
@{ */ @{ */
/* Include C99 booleans: */
#include <stdbool.h>
/* Include some integer type specifications: */ /* Include some integer type specifications: */
#include "libcpuid_types.h" #include "libcpuid_types.h"
@ -121,6 +124,30 @@ typedef enum {
} cpu_vendor_t; } cpu_vendor_t;
#define NUM_CPU_VENDORS NUM_CPU_VENDORS #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. * @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]; 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 * @brief This contains information about SGX features of the processor
* Example usage: * Example usage:
@ -231,6 +281,9 @@ struct cpu_sgx_t {
* @brief This contains the recognized CPU features/info * @brief This contains the recognized CPU features/info
*/ */
struct cpu_id_t { 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" */ /** contains the CPU vendor string, e.g. "GenuineIntel" */
char vendor_str[VENDOR_STR_MAX]; char vendor_str[VENDOR_STR_MAX];
@ -385,6 +438,23 @@ struct cpu_id_t {
/** contains information about SGX features if the processor, if present */ /** contains information about SGX features if the processor, if present */
struct cpu_sgx_t sgx; 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_INVCNB = -14, /*!< Invalid core number */
ERR_HANDLE_R = -15, /*!< Error on handle read */ ERR_HANDLE_R = -15, /*!< Error on handle read */
ERR_INVRANGE = -16, /*!< Invalid given range */ ERR_INVRANGE = -16, /*!< Invalid given range */
ERR_NOT_FOUND= -17, /*!< Requested type not found */
} cpu_error_t; } 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); 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 * @brief Writes the raw CPUID data to a text file
* @param data - a pointer to cpu_raw_data_t structure * @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); 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 * @brief Reads raw CPUID data from file
* @param data - a pointer to cpu_raw_data_t structure. The deserialized data will * @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); 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 * @brief Identifies the CPU
* @param raw - Input - a pointer to the raw CPUID data, which is obtained * @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); 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 * @brief Returns the short textual representation of a CPU flag
* @param feature - the feature, whose textual representation is wanted. * @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); 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; struct msr_driver_t;
/** /**
* @brief Starts/opens a driver, needed to read MSRs (Model Specific Registers) * @brief Starts/opens a driver, needed to read MSRs (Model Specific Registers)

View file

@ -30,3 +30,14 @@ cpuid_get_vendor
cpu_rdmsr_range cpu_rdmsr_range
cpuid_get_epc cpuid_get_epc
msr_serialize_raw_data 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 MAX_AMDFN8000001DH_LEVEL 4
#define CPU_HINTS_MAX 16 #define CPU_HINTS_MAX 16
#define SGX_FLAGS_MAX 14 #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 { typedef enum {
EAX, EAX,

View file

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

View file

@ -60,4 +60,12 @@ typedef unsigned short uint16_t;
#endif #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__ */ #endif /* __LIBCPUID_TYPES_H__ */

View file

@ -237,3 +237,31 @@ void debug_print_lbits(int debuglevel, uint64_t mask)
} }
debugf(2, "\n"); 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 libcpuid_warn_fn_t _warn_fun;
extern int _current_verboselevel; 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__ */ #endif /* __LIBCPUID_UTIL_H__ */

View file

@ -64,6 +64,7 @@ enum _intel_model_t {
_9xxx, /* Core i[3579] 9xxx */ _9xxx, /* Core i[3579] 9xxx */
_10xxx, /* Core i[3579] 10xxx */ _10xxx, /* Core i[3579] 10xxx */
_11xxx, /* Core i[3579] 11xxx */ _11xxx, /* Core i[3579] 11xxx */
_12xxx, /* Core i[3579] 11xxx */
}; };
typedef enum _intel_model_t intel_model_t; 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, -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, PENTIUM_ , 0, "Tiger Lake (Pentium)" },
{ 6, 12, -1, -1, 140, 2, -1, -1, NC, CELERON_ , 0, "Tiger Lake (Celeron)" }, { 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 */ /* 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, 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; int i, level_type, num_smt = -1, num_core = -1;
for (i = 0; i < MAX_INTELFN11_LEVEL; i++) { uint8_t apic_package_shift = 0, apic_shift = 0, apic_next_shift;
level_type = (raw->intel_fn11[i][ECX] & 0xff00) >> 8; 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) { switch (level_type) {
case 0x01: 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; break;
case 0x02: 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; break;
default: default:
break; break;
} }
apic_shift = apic_next_shift;
} }
if (num_smt == -1 || num_core == -1) return 0; if (num_smt == -1 || num_core == -1) return 0;
data->num_logical_cpus = num_core; 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, 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; int logical_cpus = -1, num_cores = -1;
if (raw->basic_cpuid[0][EAX] >= 11) { 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) { 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) { } else if (raw->basic_cpuid[0][EAX] >= 2) {
decode_intel_oldstyle_cache_info(raw, data); 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); brand = get_brand_code_and_bits(data);
model_code = get_model_code(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); 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); int cpuid_identify_intel(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal);
void cpuid_get_list_intel(struct cpu_list_t* list); void cpuid_get_list_intel(struct cpu_list_t* list);
cpu_purpose_t cpuid_identify_purpose_intel(struct cpu_raw_data_t* raw);
#endif /*__RECOG_INTEL_H__*/ #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(test DEPENDS test-fast)
add_custom_target( 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[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000 intel_fn11[3]=00000000 00000000 00000000 00000000
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
x86
general
15 15
1 1
0 0

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,5 +1,654 @@
_________________ Logical CPU #0 _________________
basic_cpuid[0]=00000010 68747541 444d4163 69746e65 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[2]=00000000 00000000 00000000 00000000
basic_cpuid[3]=00000000 00000000 00000000 00000000 basic_cpuid[3]=00000000 00000000 00000000 00000000
basic_cpuid[4]=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[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002 amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=00014163 03c0003f 00003fff 00000001 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 15
1 1
0 0

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -79,6 +79,8 @@ amd_fn8000001dh[1]=00004122 01c0003f 0000003f 00000000
amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002 amd_fn8000001dh[2]=00004143 01c0003f 000003ff 00000002
amd_fn8000001dh[3]=0003c163 03c0003f 00007fff 00000001 amd_fn8000001dh[3]=0003c163 03c0003f 00007fff 00000001
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
x86
general
15 15
1 1
0 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(): def readRawFile():
rawdata = [] rawdata = []
for line in open(args[1], "rt").readlines(): 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 good = False
for match in lookfor: for match in lookfor:
if line.find(match) != -1: if line.find(match) != -1:
good = True good = True
break break
for match in ignore:
if line.find(match) != -1:
good = False
break
if good: if good:
rawdata.append(line.strip()) rawdata.append(line.strip())
return rawdata return rawdata
@ -40,6 +45,14 @@ def readResultFile():
if not rexp.match(value): if not rexp.match(value):
raise "Bad format of value: [%s]" % s raise "Bad format of value: [%s]" % s
repdata.append(rexp.findall(value)[0]) 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": if field == "code name":
value = s[s.find("`") + 1: s.find("'")] value = s[s.find("`") + 1: s.find("'")]
repdata.append(value) repdata.append(value)
@ -56,5 +69,5 @@ def readResultFile():
return repdata return repdata
delimiter = "-" * 80 delimiter = "-" * 80
lines = readRawFile() + [delimiter] + readResultFile() lines = readRawFile() + readResultFile()
sys.stdout.writelines([s + "\n" for s in lines]) 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[2]=00000000 00000000 00000000 00000000
intel_fn11[3]=00000000 00000000 00000000 00000000 intel_fn11[3]=00000000 00000000 00000000 00000000
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
x86
general
15 15
0 0
1 1

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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