forked from dankamongmen/x86info
-
Notifications
You must be signed in to change notification settings - Fork 0
/
identify.c
137 lines (121 loc) · 2.75 KB
/
identify.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
* Licensed under the terms of the GNU GPL License version 2.
*/
#include <stdio.h>
#include <x86info.h>
#include <amd.h>
#include <intel.h>
#include <centaur.h>
#include <cyrix.h>
void get_cpu_info_basics(struct cpudata *cpu)
{
unsigned int maxi, maxei, vendor, address_bits;
unsigned int eax;
cpuid(cpu->number, 0, &maxi, &vendor, NULL, NULL);
maxi &= 0xffff; /* The high-order word is non-zero on some Cyrix CPUs */
cpu->cpuid_level = maxi;
if (maxi < 1)
return;
/* Everything that supports cpuid supports these. */
cpuid(cpu->number, 1, &eax, NULL, NULL, NULL);
cpu->stepping = eax & 0xf;
cpu->model = (eax >> 4) & 0xf;
cpu->family = (eax >> 8) & 0xf;
cpuid(cpu->number, 0x80000000, &maxei, NULL, NULL, NULL);
cpu->maxei = maxei;
cpuid(cpu->number, 0xC0000000, &maxei, NULL, NULL, NULL);
cpu->maxei2 = maxei;
cpuid(cpu->number, 0x80000008,&address_bits, NULL, NULL, NULL);
cpu->phyaddr_bits = address_bits & 0xFF;
cpu->viraddr_bits = (address_bits >> 8) & 0xFF;
switch (vendor) {
case 0x756e6547:
cpu->vendor = VENDOR_INTEL;
break;
case 0x68747541:
cpu->vendor = VENDOR_AMD;
break;
case 0x69727943:
cpu->vendor = VENDOR_CYRIX;
break;
case 0x746e6543:
cpu->vendor = VENDOR_CENTAUR;
break;
case 0x646f6547:
cpu->vendor = VENDOR_NATSEMI;
break;
case 0x52697365:
case 0x65736952:
cpu->vendor = VENDOR_RISE;
break;
case 0x20536953:
cpu->vendor = VENDOR_SIS;
break;
default:
printf("Unknown vendor (%x)\n", vendor);
return;
}
}
void identify(struct cpudata *cpu)
{
switch (cpu->vendor) {
case VENDOR_INTEL:
identify_intel(cpu);
break;
case VENDOR_AMD:
identify_amd(cpu);
break;
case VENDOR_CYRIX:
identify_cyrix(cpu);
break;
case VENDOR_CENTAUR:
identify_centaur(cpu);
break;
case VENDOR_NATSEMI:
identify_natsemi(cpu);
break;
case VENDOR_RISE:
identify_rise(cpu);
break;
case VENDOR_SIS:
identify_sis(cpu);
break;
case VENDOR_TRANSMETA:
case VENDOR_UNKNOWN:
break;
}
}
void show_info(struct cpudata *cpu)
{
if ((cpu->efamily != 0) || (cpu->emodel != 0))
printf("Extended Family: %u Extended Model: %u ",
cpu->efamily, cpu->emodel);
printf("Family: %u Model: %u Stepping: %u\n",
cpu->family, model(cpu), cpu->stepping);
if (cpu->vendor == VENDOR_INTEL)
display_basic_intel_info(cpu);
printf("CPU Model (x86info's best guess): %s\n", cpu->name);
get_model_name(cpu);
printf("\n");
switch (cpu->vendor) {
case VENDOR_AMD:
display_amd_info(cpu);
break;
case VENDOR_CYRIX:
display_cyrix_info(cpu);
break;
case VENDOR_CENTAUR:
display_centaur_info(cpu);
break;
case VENDOR_INTEL:
display_extended_intel_info(cpu);
break;
case VENDOR_NATSEMI:
case VENDOR_RISE:
case VENDOR_SIS:
case VENDOR_TRANSMETA:
case VENDOR_UNKNOWN:
default:
break;
}
}