-
Notifications
You must be signed in to change notification settings - Fork 1
/
micro_cpuid.s
185 lines (165 loc) · 2.87 KB
/
micro_cpuid.s
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
.section .data
vendor_id:
.asciz "vendor_id : %s\n"
cpu_family:
.asciz "cpu family : %u\n"
model:
.asciz "model : %u\n"
stepping:
.asciz "stepping : %u\n"
core_number:
.asciz "cores : %u\n"
apicid:
.asciz "apid id : %u\n"
brand:
.asciz "model name : %s\n"
.section .bss
.lcomm buffer, 12
.lcomm brand_str, 48
.section .text
.globl _start
_start:
call call_with_zero
call call_with_one
call call_with_four
call call_with_band_string
# exit
pushl $0
call exit
call_with_zero:
movl $0, %eax
cpuid
movl $buffer, %edi
movl %ebx, (%edi)
movl %edx, 4(%edi)
movl %ecx, 8(%edi)
pushl $buffer
pushl $vendor_id
call printf
addl $8, %esp
ret
call_with_one:
movl $1, %eax
cpuid
call print_family
call print_model
call print_stepping
#call print_apic
ret
print_family:
# cpu family
movl %eax, %edi
shl $20, %edi
shr $28, %edi
pushl %eax
pushl %edi
pushl $cpu_family
call printf
addl $8, %esp
popl %eax
ret
print_model:
# cpu model
movl %eax, %edi
shl $20, %edi
shr $28, %edi
cmp $0x6, %edi
je expand
cmp $0xF, %edi
je expand
call low_model
jmp output
expand:
call low_model
call high_model
jmp output
low_model:
movl %eax, %edi
shl $24, %edi
shr $28, %edi
ret
high_model:
movl %eax, %esi
shl $12, %esi
shr $28, %esi
shl $4, %esi
orl %esi, %edi
ret
output:
pushl %eax
pushl %edi
pushl $model
call printf
addl $8, %esp
popl %eax
ret
print_stepping:
# cpu stepping
movl %eax, %edi
shl $28, %edi
shr $28, %edi
pushl %eax
pushl %edi
pushl $stepping
call printf
addl $8, %esp
popl %eax
ret
call_with_four:
movl $0x4, %eax
cpuid
#call print_cores
ret
# not finished
#print_cores:
# # cpu cores number
# movl %eax, %edi
# shr $26, %edi
# pushl %eax
# pushl %edi
# pushl $core_number
# call printf
# addl $8, %esp
# popl %eax
# ret
# not finished
#print_apic:
# # cpu apic id
# movl %ebx, %edi
# shr $24, %edi
# pushl %eax
# pushl %edi
# pushl $apicid
# call printf
# addl $8, %esp
# popl %eax
# ret
call_with_band_string:
movl $0x80000002, %eax
cpuid
movl $brand_str, %edi
movl %eax, (%edi)
movl %ebx, 4(%edi)
movl %ecx, 8(%edi)
movl %edx, 12(%edi)
movl $0x80000003, %eax
cpuid
movl $brand_str, %edi
movl %eax, 16(%edi)
movl %ebx, 20(%edi)
movl %ecx, 24(%edi)
movl %edx, 28(%edi)
movl $0x80000004, %eax
cpuid
movl $brand_str, %edi
movl %eax, 32(%edi)
movl %ebx, 36(%edi)
movl %ecx, 40(%edi)
movl %edx, 44(%edi)
pushl %eax
pushl %edi
pushl $brand
call printf
addl $8, %esp
popl %eax
ret