11 #include "lib/string.h"
12 #include "portability.h"
14 #include <sys/cpuinfo.h>
19 #define tty_printf(M, ...)
21 #define INTEL_MAGIC 0x756e6547
22 #define AMD_MAGIC 0x68747541
23 #define VMWARE_HYPERVISOR_MAGIC 0x564D5868
24 #define VMWARE_HYPERVISOR_PORT 0x5658
25 #define VMWARE_PORT_CMD_GETVERSION 10
28 #define VMWARE_PORT(cmd, eax, ebx, ecx, edx) \
29 __asm__("inl (%%dx)" : \
30 "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : \
31 "0"(VMWARE_HYPERVISOR_MAGIC), \
32 "1"(VMWARE_PORT_CMD_##cmd), \
33 "2"(VMWARE_HYPERVISOR_PORT), "3"(UINT_MAX) : \
48 cpuid(0, unused, ebx, unused, unused);
85 "Brand ID Not Supported.",
86 "Intel(R) Celeron(R) processor",
87 "Intel(R) Pentium(R) III processor",
88 "Intel(R) Pentium(R) III Xeon(R) processor",
89 "Intel(R) Pentium(R) III processor",
91 "Mobile Intel(R) Pentium(R) III processor-M",
92 "Mobile Intel(R) Celeron(R) processor",
93 "Intel(R) Pentium(R) 4 processor",
94 "Intel(R) Pentium(R) 4 processor",
95 "Intel(R) Celeron(R) processor",
96 "Intel(R) Xeon(R) Processor",
97 "Intel(R) Xeon(R) processor MP",
99 "Mobile Intel(R) Pentium(R) 4 processor-M",
100 "Mobile Intel(R) Pentium(R) Celeron(R) processor",
102 "Mobile Genuine Intel(R) processor",
103 "Intel(R) Celeron(R) M processor",
104 "Mobile Intel(R) Celeron(R) processor",
105 "Intel(R) Celeron(R) processor",
106 "Mobile Geniune Intel(R) processor",
107 "Intel(R) Pentium(R) M processor",
108 "Mobile Intel(R) Celeron(R) processor"
120 "Intel(R) Celeron(R) processor",
128 "Intel(R) Xeon(R) processor MP",
131 "Intel(R) Xeon(R) processor",
153 if (silent ==
false){
154 qemu_log(
"Detected Intel CPU.\nIntel-specific features:\n");
158 uint32_t eax, ebx, max_eax, signature, unused;
159 uint32_t model, family, type, brand;
161 cpuid(1, eax, ebx, unused, unused);
162 model = (eax >> 4) & 0xf;
163 family = (eax >> 8) & 0xf;
164 type = (eax >> 12) & 0x3;
170 qemu_log(
"Type %d - ", type);
173 qemu_log(
"Original OEM");
176 qemu_log(
"Overdrive");
179 qemu_log(
"Dual-capable");
182 qemu_log(
"Reserved");
187 qemu_log(
"Family %d - ", family);
199 qemu_log(
"Pentium Pro");
202 qemu_log(
"Pentium 4");
208 qemu_log(
"Extended family %d\n", (eax >> 20) & 0xff);
210 qemu_log(
"Model %d - ", model);
234 qemu_log(
"Write-back enhanced DX2");
252 qemu_log(
"for 486 system");
264 qemu_log(
"Pentium Pro");
267 qemu_log(
"Pentium II Model 3");
270 qemu_log(
"Pentium II Model 5/Xeon/Celeron");
276 qemu_log(
"Pentium III/Pentium III Xeon - external L2 cache");
279 qemu_log(
"Pentium III/Pentium III Xeon - internal L2 cache");
289 cpuid(0x80000000, max_eax, unused, unused, unused);
297 if (max_eax >= 0x80000004) {
298 unsigned int a, b, c, d;
301 for (
int i = 0x80000002; i <= 0x80000004; ++i) {
302 cpuid(i, a, b, c, d);
304 for (aa = 0; aa < 4; aa++){
305 char* delta = (
char*)&a;
309 for (aa = 0; aa < 4; aa++){
310 char* delta = (
char*)&b;
314 for (aa = 0; aa < 4; aa++){
315 char* delta = (
char*)&c;
319 for (aa = 0; aa < 4; aa++){
320 char* delta = (
char*)&d;
328 }
else if (brand > 0 && silent == 0) {
329 qemu_log(
"Brand %d - ", brand);
331 if (signature == 0x000006B1 || signature == 0x00000F13) {
334 qemu_log(
"%s\n",
Intel[brand]);
337 qemu_log(
"Reserved\n");
340 qemu_log(
"Other INTEL CPU\n");
359 qemu_log(
"Detected AMD CPU. \nAMD-specific features:\n");
362 uint32_t extended, eax, ebx, ecx, edx, unused;
363 uint32_t family, model;
364 cpuid(1, eax, unused, unused, unused);
366 model = (eax >> 4) & 0xf;
367 family = (eax >> 8) & 0xf;
371 qemu_log(
"Family: %d Model: %d [", family, model);
374 qemu_log(
"486 Model %d", model);
384 qemu_log(
"K6 Model %d", model);
387 qemu_log(
"K6-2 Model 8");
390 qemu_log(
"K6-III Model 9");
393 qemu_log(
"K5/K6 Model %d", model);
402 qemu_log(
"Athlon Model %d", model);
405 qemu_log(
"Duron Model 3");
408 qemu_log(
"Athlon MP/Mobile Athlon Model 6");
411 qemu_log(
"Mobile Duron Model 7");
414 qemu_log(
"Duron/Athlon Model %d", model);
426 cpuid(0x80000000, extended, unused, unused, unused);
430 if (extended >= 0x80000002) {
433 qemu_log(
"Detected Processor Name: ");
435 for (j = 0x80000002; j <= 0x80000004; j++) {
436 cpuid(j, eax, ebx, ecx, edx);
447 if (extended >= 0x80000007) {
448 cpuid(0x80000007, unused, unused, unused, edx);
449 if ((edx & 1) && silent == 0) {
450 qemu_log(
"Temperature Sensing Diode Detected!\n");
459 size_t get_max_cpuid_count() {
460 uint32_t info[4] = {0};
Основные определения ядра
char * getNameBrand()
Получение имени процессора
#define AMD_MAGIC
Ключ процессора AMD.
char * Intel_Other[]
Дополнительная таблица спецификаций Intel
#define INTEL_MAGIC
Ключ процессора Intel.
char * Intel[]
Лист-спецификаций Intel.
int do_intel(bool silent)
Получение информации о процессоре Intel.
#define VMWARE_HYPERVISOR_MAGIC
Ключ гипервизора VMWare.
char brandAllName[128]
Название процессора
int detect_cpu(bool silent)
Получение имени процессора (Инициализация)
int do_amd(bool silent)
Получение информации о процессоре AMD.
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
char * strcat(char *destination, const char *source)
Объединение строк