]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - secure/lib/libcrypto/amd64/x86_64cpuid.S
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / secure / lib / libcrypto / amd64 / x86_64cpuid.S
1         # $FreeBSD$
2
3 .hidden OPENSSL_cpuid_setup
4 .section        .init
5         call    OPENSSL_cpuid_setup
6
7 .hidden OPENSSL_ia32cap_P
8 .comm   OPENSSL_ia32cap_P,8,4
9
10 .text   
11
12 .globl  OPENSSL_atomic_add
13 .type   OPENSSL_atomic_add,@function
14 .align  16
15 OPENSSL_atomic_add:
16         movl    (%rdi),%eax
17 .Lspin: leaq    (%rsi,%rax,1),%r8
18 .byte   0xf0            
19         cmpxchgl        %r8d,(%rdi)
20         jne     .Lspin
21         movl    %r8d,%eax
22 .byte   0x48,0x98       
23         .byte   0xf3,0xc3
24 .size   OPENSSL_atomic_add,.-OPENSSL_atomic_add
25
26 .globl  OPENSSL_rdtsc
27 .type   OPENSSL_rdtsc,@function
28 .align  16
29 OPENSSL_rdtsc:
30         rdtsc
31         shlq    $32,%rdx
32         orq     %rdx,%rax
33         .byte   0xf3,0xc3
34 .size   OPENSSL_rdtsc,.-OPENSSL_rdtsc
35
36 .globl  OPENSSL_ia32_cpuid
37 .type   OPENSSL_ia32_cpuid,@function
38 .align  16
39 OPENSSL_ia32_cpuid:
40         movq    %rbx,%r8
41
42         xorl    %eax,%eax
43         cpuid
44         movl    %eax,%r11d
45
46         xorl    %eax,%eax
47         cmpl    $1970169159,%ebx
48         setne   %al
49         movl    %eax,%r9d
50         cmpl    $1231384169,%edx
51         setne   %al
52         orl     %eax,%r9d
53         cmpl    $1818588270,%ecx
54         setne   %al
55         orl     %eax,%r9d
56         jz      .Lintel
57
58         cmpl    $1752462657,%ebx
59         setne   %al
60         movl    %eax,%r10d
61         cmpl    $1769238117,%edx
62         setne   %al
63         orl     %eax,%r10d
64         cmpl    $1145913699,%ecx
65         setne   %al
66         orl     %eax,%r10d
67         jnz     .Lintel
68
69
70         movl    $2147483648,%eax
71         cpuid
72         cmpl    $2147483649,%eax
73         jb      .Lintel
74         movl    %eax,%r10d
75         movl    $2147483649,%eax
76         cpuid
77         orl     %ecx,%r9d
78         andl    $2049,%r9d
79
80         cmpl    $2147483656,%r10d
81         jb      .Lintel
82
83         movl    $2147483656,%eax
84         cpuid
85         movzbq  %cl,%r10
86         incq    %r10
87
88         movl    $1,%eax
89         cpuid
90         btl     $28,%edx
91         jnc     .Lgeneric
92         shrl    $16,%ebx
93         cmpb    %r10b,%bl
94         ja      .Lgeneric
95         andl    $4026531839,%edx
96         jmp     .Lgeneric
97
98 .Lintel:
99         cmpl    $4,%r11d
100         movl    $-1,%r10d
101         jb      .Lnocacheinfo
102
103         movl    $4,%eax
104         movl    $0,%ecx
105         cpuid
106         movl    %eax,%r10d
107         shrl    $14,%r10d
108         andl    $4095,%r10d
109
110 .Lnocacheinfo:
111         movl    $1,%eax
112         cpuid
113         andl    $3220176895,%edx
114         cmpl    $0,%r9d
115         jne     .Lnotintel
116         orl     $1073741824,%edx
117         andb    $15,%ah
118         cmpb    $15,%ah
119         jne     .Lnotintel
120         orl     $1048576,%edx
121 .Lnotintel:
122         btl     $28,%edx
123         jnc     .Lgeneric
124         andl    $4026531839,%edx
125         cmpl    $0,%r10d
126         je      .Lgeneric
127
128         orl     $268435456,%edx
129         shrl    $16,%ebx
130         cmpb    $1,%bl
131         ja      .Lgeneric
132         andl    $4026531839,%edx
133 .Lgeneric:
134         andl    $2048,%r9d
135         andl    $4294965247,%ecx
136         orl     %ecx,%r9d
137
138         movl    %edx,%r10d
139         btl     $27,%r9d
140         jnc     .Lclear_avx
141         xorl    %ecx,%ecx
142 .byte   0x0f,0x01,0xd0          
143         andl    $6,%eax
144         cmpl    $6,%eax
145         je      .Ldone
146 .Lclear_avx:
147         movl    $4026525695,%eax
148         andl    %eax,%r9d
149 .Ldone:
150         shlq    $32,%r9
151         movl    %r10d,%eax
152         movq    %r8,%rbx
153         orq     %r9,%rax
154         .byte   0xf3,0xc3
155 .size   OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
156
157 .globl  OPENSSL_cleanse
158 .type   OPENSSL_cleanse,@function
159 .align  16
160 OPENSSL_cleanse:
161         xorq    %rax,%rax
162         cmpq    $15,%rsi
163         jae     .Lot
164         cmpq    $0,%rsi
165         je      .Lret
166 .Little:
167         movb    %al,(%rdi)
168         subq    $1,%rsi
169         leaq    1(%rdi),%rdi
170         jnz     .Little
171 .Lret:
172         .byte   0xf3,0xc3
173 .align  16
174 .Lot:
175         testq   $7,%rdi
176         jz      .Laligned
177         movb    %al,(%rdi)
178         leaq    -1(%rsi),%rsi
179         leaq    1(%rdi),%rdi
180         jmp     .Lot
181 .Laligned:
182         movq    %rax,(%rdi)
183         leaq    -8(%rsi),%rsi
184         testq   $-8,%rsi
185         leaq    8(%rdi),%rdi
186         jnz     .Laligned
187         cmpq    $0,%rsi
188         jne     .Little
189         .byte   0xf3,0xc3
190 .size   OPENSSL_cleanse,.-OPENSSL_cleanse
191 .globl  OPENSSL_wipe_cpu
192 .type   OPENSSL_wipe_cpu,@function
193 .align  16
194 OPENSSL_wipe_cpu:
195         pxor    %xmm0,%xmm0
196         pxor    %xmm1,%xmm1
197         pxor    %xmm2,%xmm2
198         pxor    %xmm3,%xmm3
199         pxor    %xmm4,%xmm4
200         pxor    %xmm5,%xmm5
201         pxor    %xmm6,%xmm6
202         pxor    %xmm7,%xmm7
203         pxor    %xmm8,%xmm8
204         pxor    %xmm9,%xmm9
205         pxor    %xmm10,%xmm10
206         pxor    %xmm11,%xmm11
207         pxor    %xmm12,%xmm12
208         pxor    %xmm13,%xmm13
209         pxor    %xmm14,%xmm14
210         pxor    %xmm15,%xmm15
211         xorq    %rcx,%rcx
212         xorq    %rdx,%rdx
213         xorq    %rsi,%rsi
214         xorq    %rdi,%rdi
215         xorq    %r8,%r8
216         xorq    %r9,%r9
217         xorq    %r10,%r10
218         xorq    %r11,%r11
219         leaq    8(%rsp),%rax
220         .byte   0xf3,0xc3
221 .size   OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
222 .globl  OPENSSL_ia32_rdrand
223 .type   OPENSSL_ia32_rdrand,@function
224 .align  16
225 OPENSSL_ia32_rdrand:
226         movl    $8,%ecx
227 .Loop_rdrand:
228 .byte   72,15,199,240
229         jc      .Lbreak_rdrand
230         loop    .Loop_rdrand
231 .Lbreak_rdrand:
232         cmpq    $0,%rax
233         cmoveq  %rcx,%rax
234         .byte   0xf3,0xc3
235 .size   OPENSSL_ia32_rdrand,.-OPENSSL_ia32_rdrand