Merge branch 'vendor/OPENSSL'
[dragonfly.git] / secure / lib / libcrypto / asm / x86_64cpuid.s
1
2 .section        .init
3         call    OPENSSL_cpuid_setup
4
5 .text   
6
7 .globl  OPENSSL_atomic_add
8 .type   OPENSSL_atomic_add,@function
9 .align  16
10 OPENSSL_atomic_add:
11         movl    (%rdi),%eax
12 .Lspin: leaq    (%rsi,%rax,1),%r8
13 .byte   0xf0            
14         cmpxchgl        %r8d,(%rdi)
15         jne     .Lspin
16         movl    %r8d,%eax
17 .byte   0x48,0x98       
18         .byte   0xf3,0xc3
19 .size   OPENSSL_atomic_add,.-OPENSSL_atomic_add
20
21 .globl  OPENSSL_rdtsc
22 .type   OPENSSL_rdtsc,@function
23 .align  16
24 OPENSSL_rdtsc:
25         rdtsc
26         shlq    $32,%rdx
27         orq     %rdx,%rax
28         .byte   0xf3,0xc3
29 .size   OPENSSL_rdtsc,.-OPENSSL_rdtsc
30
31 .globl  OPENSSL_ia32_cpuid
32 .type   OPENSSL_ia32_cpuid,@function
33 .align  16
34 OPENSSL_ia32_cpuid:
35         movq    %rbx,%r8
36
37         xorl    %eax,%eax
38         cpuid
39         movl    %eax,%r11d
40
41         xorl    %eax,%eax
42         cmpl    $1970169159,%ebx
43         setne   %al
44         movl    %eax,%r9d
45         cmpl    $1231384169,%edx
46         setne   %al
47         orl     %eax,%r9d
48         cmpl    $1818588270,%ecx
49         setne   %al
50         orl     %eax,%r9d
51         jz      .Lintel
52
53         cmpl    $1752462657,%ebx
54         setne   %al
55         movl    %eax,%r10d
56         cmpl    $1769238117,%edx
57         setne   %al
58         orl     %eax,%r10d
59         cmpl    $1145913699,%ecx
60         setne   %al
61         orl     %eax,%r10d
62         jnz     .Lintel
63
64
65         movl    $2147483648,%eax
66         cpuid
67         cmpl    $2147483656,%eax
68         jb      .Lintel
69
70         movl    $2147483656,%eax
71         cpuid
72         movzbq  %cl,%r10
73         incq    %r10
74
75         movl    $1,%eax
76         cpuid
77         btl     $28,%edx
78         jnc     .Ldone
79         shrl    $16,%ebx
80         cmpb    %r10b,%bl
81         ja      .Ldone
82         andl    $4026531839,%edx
83         jmp     .Ldone
84
85 .Lintel:
86         cmpl    $4,%r11d
87         movl    $-1,%r10d
88         jb      .Lnocacheinfo
89
90         movl    $4,%eax
91         movl    $0,%ecx
92         cpuid
93         movl    %eax,%r10d
94         shrl    $14,%r10d
95         andl    $4095,%r10d
96
97 .Lnocacheinfo:
98         movl    $1,%eax
99         cpuid
100         cmpl    $0,%r9d
101         jne     .Lnotintel
102         orl     $1048576,%edx
103         andb    $15,%ah
104         cmpb    $15,%ah
105         je      .Lnotintel
106         orl     $1073741824,%edx
107 .Lnotintel:
108         btl     $28,%edx
109         jnc     .Ldone
110         andl    $4026531839,%edx
111         cmpl    $0,%r10d
112         je      .Ldone
113
114         orl     $268435456,%edx
115         shrl    $16,%ebx
116         cmpb    $1,%bl
117         ja      .Ldone
118         andl    $4026531839,%edx
119 .Ldone:
120         shlq    $32,%rcx
121         movl    %edx,%eax
122         movq    %r8,%rbx
123         orq     %rcx,%rax
124         .byte   0xf3,0xc3
125 .size   OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
126
127 .globl  OPENSSL_cleanse
128 .type   OPENSSL_cleanse,@function
129 .align  16
130 OPENSSL_cleanse:
131         xorq    %rax,%rax
132         cmpq    $15,%rsi
133         jae     .Lot
134         cmpq    $0,%rsi
135         je      .Lret
136 .Little:
137         movb    %al,(%rdi)
138         subq    $1,%rsi
139         leaq    1(%rdi),%rdi
140         jnz     .Little
141 .Lret:
142         .byte   0xf3,0xc3
143 .align  16
144 .Lot:
145         testq   $7,%rdi
146         jz      .Laligned
147         movb    %al,(%rdi)
148         leaq    -1(%rsi),%rsi
149         leaq    1(%rdi),%rdi
150         jmp     .Lot
151 .Laligned:
152         movq    %rax,(%rdi)
153         leaq    -8(%rsi),%rsi
154         testq   $-8,%rsi
155         leaq    8(%rdi),%rdi
156         jnz     .Laligned
157         cmpq    $0,%rsi
158         jne     .Little
159         .byte   0xf3,0xc3
160 .size   OPENSSL_cleanse,.-OPENSSL_cleanse
161 .globl  OPENSSL_wipe_cpu
162 .type   OPENSSL_wipe_cpu,@function
163 .align  16
164 OPENSSL_wipe_cpu:
165         pxor    %xmm0,%xmm0
166         pxor    %xmm1,%xmm1
167         pxor    %xmm2,%xmm2
168         pxor    %xmm3,%xmm3
169         pxor    %xmm4,%xmm4
170         pxor    %xmm5,%xmm5
171         pxor    %xmm6,%xmm6
172         pxor    %xmm7,%xmm7
173         pxor    %xmm8,%xmm8
174         pxor    %xmm9,%xmm9
175         pxor    %xmm10,%xmm10
176         pxor    %xmm11,%xmm11
177         pxor    %xmm12,%xmm12
178         pxor    %xmm13,%xmm13
179         pxor    %xmm14,%xmm14
180         pxor    %xmm15,%xmm15
181         xorq    %rcx,%rcx
182         xorq    %rdx,%rdx
183         xorq    %rsi,%rsi
184         xorq    %rdi,%rdi
185         xorq    %r8,%r8
186         xorq    %r9,%r9
187         xorq    %r10,%r10
188         xorq    %r11,%r11
189         leaq    8(%rsp),%rax
190         .byte   0xf3,0xc3
191 .size   OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu