x86_64cpuid.S revision 1.9
1#include <machine/asm.h> 2 3.globl OPENSSL_cpuid_setup 4.section .init 5 call PIC_PLT(OPENSSL_cpuid_setup) 6 7.hidden OPENSSL_ia32cap_P 8.comm OPENSSL_ia32cap_P,16,4 9 10.text 11 12.globl OPENSSL_atomic_add 13.type OPENSSL_atomic_add,@function 14.align 16 15OPENSSL_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 29OPENSSL_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 39OPENSSL_ia32_cpuid: 40 movq %rbx,%r8 41 42 xorl %eax,%eax 43 movl %eax,8(%rdi) 44 cpuid 45 movl %eax,%r11d 46 47 xorl %eax,%eax 48 cmpl $0x756e6547,%ebx 49 setne %al 50 movl %eax,%r9d 51 cmpl $0x49656e69,%edx 52 setne %al 53 orl %eax,%r9d 54 cmpl $0x6c65746e,%ecx 55 setne %al 56 orl %eax,%r9d 57 jz .Lintel 58 59 cmpl $0x68747541,%ebx 60 setne %al 61 movl %eax,%r10d 62 cmpl $0x69746E65,%edx 63 setne %al 64 orl %eax,%r10d 65 cmpl $0x444D4163,%ecx 66 setne %al 67 orl %eax,%r10d 68 jnz .Lintel 69 70 71 movl $0x80000000,%eax 72 cpuid 73 cmpl $0x80000001,%eax 74 jb .Lintel 75 movl %eax,%r10d 76 movl $0x80000001,%eax 77 cpuid 78 orl %ecx,%r9d 79 andl $0x00000801,%r9d 80 81 cmpl $0x80000008,%r10d 82 jb .Lintel 83 84 movl $0x80000008,%eax 85 cpuid 86 movzbq %cl,%r10 87 incq %r10 88 89 movl $1,%eax 90 cpuid 91 btl $28,%edx 92 jnc .Lgeneric 93 shrl $16,%ebx 94 cmpb %r10b,%bl 95 ja .Lgeneric 96 andl $0xefffffff,%edx 97 jmp .Lgeneric 98 99.Lintel: 100 cmpl $4,%r11d 101 movl $-1,%r10d 102 jb .Lnocacheinfo 103 104 movl $4,%eax 105 movl $0,%ecx 106 cpuid 107 movl %eax,%r10d 108 shrl $14,%r10d 109 andl $0xfff,%r10d 110 111 cmpl $7,%r11d 112 jb .Lnocacheinfo 113 114 movl $7,%eax 115 xorl %ecx,%ecx 116 cpuid 117 movl %ebx,8(%rdi) 118 119.Lnocacheinfo: 120 movl $1,%eax 121 cpuid 122 andl $0xbfefffff,%edx 123 cmpl $0,%r9d 124 jne .Lnotintel 125 orl $0x40000000,%edx 126 andb $15,%ah 127 cmpb $15,%ah 128 jne .Lnotintel 129 orl $0x00100000,%edx 130.Lnotintel: 131 btl $28,%edx 132 jnc .Lgeneric 133 andl $0xefffffff,%edx 134 cmpl $0,%r10d 135 je .Lgeneric 136 137 orl $0x10000000,%edx 138 shrl $16,%ebx 139 cmpb $1,%bl 140 ja .Lgeneric 141 andl $0xefffffff,%edx 142.Lgeneric: 143 andl $0x00000800,%r9d 144 andl $0xfffff7ff,%ecx 145 orl %ecx,%r9d 146 147 movl %edx,%r10d 148 btl $27,%r9d 149 jnc .Lclear_avx 150 xorl %ecx,%ecx 151.byte 0x0f,0x01,0xd0 152 andl $6,%eax 153 cmpl $6,%eax 154 je .Ldone 155.Lclear_avx: 156 movl $0xefffe7ff,%eax 157 andl %eax,%r9d 158 andl $0xffffffdf,8(%rdi) 159.Ldone: 160 shlq $32,%r9 161 movl %r10d,%eax 162 movq %r8,%rbx 163 orq %r9,%rax 164 .byte 0xf3,0xc3 165.size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid 166 167.globl OPENSSL_cleanse 168.type OPENSSL_cleanse,@function 169.align 16 170OPENSSL_cleanse: 171 xorq %rax,%rax 172 cmpq $15,%rsi 173 jae .Lot 174 cmpq $0,%rsi 175 je .Lret 176.Little: 177 movb %al,(%rdi) 178 subq $1,%rsi 179 leaq 1(%rdi),%rdi 180 jnz .Little 181.Lret: 182 .byte 0xf3,0xc3 183.align 16 184.Lot: 185 testq $7,%rdi 186 jz .Laligned 187 movb %al,(%rdi) 188 leaq -1(%rsi),%rsi 189 leaq 1(%rdi),%rdi 190 jmp .Lot 191.Laligned: 192 movq %rax,(%rdi) 193 leaq -8(%rsi),%rsi 194 testq $-8,%rsi 195 leaq 8(%rdi),%rdi 196 jnz .Laligned 197 cmpq $0,%rsi 198 jne .Little 199 .byte 0xf3,0xc3 200.size OPENSSL_cleanse,.-OPENSSL_cleanse 201.globl OPENSSL_wipe_cpu 202.type OPENSSL_wipe_cpu,@function 203.align 16 204OPENSSL_wipe_cpu: 205 pxor %xmm0,%xmm0 206 pxor %xmm1,%xmm1 207 pxor %xmm2,%xmm2 208 pxor %xmm3,%xmm3 209 pxor %xmm4,%xmm4 210 pxor %xmm5,%xmm5 211 pxor %xmm6,%xmm6 212 pxor %xmm7,%xmm7 213 pxor %xmm8,%xmm8 214 pxor %xmm9,%xmm9 215 pxor %xmm10,%xmm10 216 pxor %xmm11,%xmm11 217 pxor %xmm12,%xmm12 218 pxor %xmm13,%xmm13 219 pxor %xmm14,%xmm14 220 pxor %xmm15,%xmm15 221 xorq %rcx,%rcx 222 xorq %rdx,%rdx 223 xorq %rsi,%rsi 224 xorq %rdi,%rdi 225 xorq %r8,%r8 226 xorq %r9,%r9 227 xorq %r10,%r10 228 xorq %r11,%r11 229 leaq 8(%rsp),%rax 230 .byte 0xf3,0xc3 231.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu 232.globl OPENSSL_ia32_rdrand 233.type OPENSSL_ia32_rdrand,@function 234.align 16 235OPENSSL_ia32_rdrand: 236 movl $8,%ecx 237.Loop_rdrand: 238.byte 72,15,199,240 239 jc .Lbreak_rdrand 240 loop .Loop_rdrand 241.Lbreak_rdrand: 242 cmpq $0,%rax 243 cmoveq %rcx,%rax 244 .byte 0xf3,0xc3 245.size OPENSSL_ia32_rdrand,.-OPENSSL_ia32_rdrand 246 247.globl OPENSSL_ia32_rdseed 248.type OPENSSL_ia32_rdseed,@function 249.align 16 250OPENSSL_ia32_rdseed: 251 movl $8,%ecx 252.Loop_rdseed: 253.byte 72,15,199,248 254 jc .Lbreak_rdseed 255 loop .Loop_rdseed 256.Lbreak_rdseed: 257 cmpq $0,%rax 258 cmoveq %rcx,%rax 259 .byte 0xf3,0xc3 260.size OPENSSL_ia32_rdseed,.-OPENSSL_ia32_rdseed 261