1.file "x86cpuid.s" 2.text 3.globl OPENSSL_ia32_cpuid 4.type OPENSSL_ia32_cpuid,@function 5.align 16 6OPENSSL_ia32_cpuid: 7.L_OPENSSL_ia32_cpuid_begin: 8 pushl %ebp 9 pushl %ebx 10 pushl %esi 11 pushl %edi 12 xorl %edx,%edx 13 pushfl 14 popl %eax 15 movl %eax,%ecx 16 xorl $2097152,%eax 17 pushl %eax 18 popfl 19 pushfl 20 popl %eax 21 xorl %eax,%ecx 22 xorl %eax,%eax 23 btl $21,%ecx 24 jnc .L000nocpuid 25 .byte 0x0f,0xa2 26 movl %eax,%edi 27 xorl %eax,%eax 28 cmpl $1970169159,%ebx 29 setne %al 30 movl %eax,%ebp 31 cmpl $1231384169,%edx 32 setne %al 33 orl %eax,%ebp 34 cmpl $1818588270,%ecx 35 setne %al 36 orl %eax,%ebp 37 jz .L001intel 38 cmpl $1752462657,%ebx 39 setne %al 40 movl %eax,%esi 41 cmpl $1769238117,%edx 42 setne %al 43 orl %eax,%esi 44 cmpl $1145913699,%ecx 45 setne %al 46 orl %eax,%esi 47 jnz .L001intel 48 movl $2147483648,%eax 49 .byte 0x0f,0xa2 50 cmpl $2147483649,%eax 51 jb .L001intel 52 movl %eax,%esi 53 movl $2147483649,%eax 54 .byte 0x0f,0xa2 55 orl %ecx,%ebp 56 andl $2049,%ebp 57 cmpl $2147483656,%esi 58 jb .L001intel 59 movl $2147483656,%eax 60 .byte 0x0f,0xa2 61 movzbl %cl,%esi 62 incl %esi 63 movl $1,%eax 64 xorl %ecx,%ecx 65 .byte 0x0f,0xa2 66 btl $28,%edx 67 jnc .L002generic 68 shrl $16,%ebx 69 andl $255,%ebx 70 cmpl %esi,%ebx 71 ja .L002generic 72 andl $4026531839,%edx 73 jmp .L002generic 74.L001intel: 75 cmpl $4,%edi 76 movl $-1,%edi 77 jb .L003nocacheinfo 78 movl $4,%eax 79 movl $0,%ecx 80 .byte 0x0f,0xa2 81 movl %eax,%edi 82 shrl $14,%edi 83 andl $4095,%edi 84.L003nocacheinfo: 85 movl $1,%eax 86 xorl %ecx,%ecx 87 .byte 0x0f,0xa2 88 andl $3220176895,%edx 89 cmpl $0,%ebp 90 jne .L004notintel 91 orl $1073741824,%edx 92 andb $15,%ah 93 cmpb $15,%ah 94 jne .L004notintel 95 orl $1048576,%edx 96.L004notintel: 97 btl $28,%edx 98 jnc .L002generic 99 andl $4026531839,%edx 100 cmpl $0,%edi 101 je .L002generic 102 orl $268435456,%edx 103 shrl $16,%ebx 104 cmpb $1,%bl 105 ja .L002generic 106 andl $4026531839,%edx 107.L002generic: 108 andl $2048,%ebp 109 andl $4294965247,%ecx 110 movl %edx,%esi 111 orl %ecx,%ebp 112 btl $27,%ecx 113 jnc .L005clear_avx 114 xorl %ecx,%ecx 115.byte 15,1,208 116 andl $6,%eax 117 cmpl $6,%eax 118 je .L006done 119 cmpl $2,%eax 120 je .L005clear_avx 121.L007clear_xmm: 122 andl $4261412861,%ebp 123 andl $4278190079,%esi 124.L005clear_avx: 125 andl $4026525695,%ebp 126.L006done: 127 movl %esi,%eax 128 movl %ebp,%edx 129.L000nocpuid: 130 popl %edi 131 popl %esi 132 popl %ebx 133 popl %ebp 134 ret 135.size OPENSSL_ia32_cpuid,.-.L_OPENSSL_ia32_cpuid_begin 136.globl OPENSSL_rdtsc 137.type OPENSSL_rdtsc,@function 138.align 16 139OPENSSL_rdtsc: 140.L_OPENSSL_rdtsc_begin: 141 xorl %eax,%eax 142 xorl %edx,%edx 143 call .L008PIC_me_up 144.L008PIC_me_up: 145 popl %ecx 146 leal _GLOBAL_OFFSET_TABLE_+[.-.L008PIC_me_up](%ecx),%ecx 147 movl OPENSSL_ia32cap_P@GOT(%ecx),%ecx 148 btl $4,(%ecx) 149 jnc .L009notsc 150 .byte 0x0f,0x31 151.L009notsc: 152 ret 153.size OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin 154.globl OPENSSL_instrument_halt 155.type OPENSSL_instrument_halt,@function 156.align 16 157OPENSSL_instrument_halt: 158.L_OPENSSL_instrument_halt_begin: 159 call .L010PIC_me_up 160.L010PIC_me_up: 161 popl %ecx 162 leal _GLOBAL_OFFSET_TABLE_+[.-.L010PIC_me_up](%ecx),%ecx 163 movl OPENSSL_ia32cap_P@GOT(%ecx),%ecx 164 btl $4,(%ecx) 165 jnc .L011nohalt 166.long 2421723150 167 andl $3,%eax 168 jnz .L011nohalt 169 pushfl 170 popl %eax 171 btl $9,%eax 172 jnc .L011nohalt 173 .byte 0x0f,0x31 174 pushl %edx 175 pushl %eax 176 hlt 177 .byte 0x0f,0x31 178 subl (%esp),%eax 179 sbbl 4(%esp),%edx 180 addl $8,%esp 181 ret 182.L011nohalt: 183 xorl %eax,%eax 184 xorl %edx,%edx 185 ret 186.size OPENSSL_instrument_halt,.-.L_OPENSSL_instrument_halt_begin 187.globl OPENSSL_far_spin 188.type OPENSSL_far_spin,@function 189.align 16 190OPENSSL_far_spin: 191.L_OPENSSL_far_spin_begin: 192 pushfl 193 popl %eax 194 btl $9,%eax 195 jnc .L012nospin 196 movl 4(%esp),%eax 197 movl 8(%esp),%ecx 198.long 2430111262 199 xorl %eax,%eax 200 movl (%ecx),%edx 201 jmp .L013spin 202.align 16 203.L013spin: 204 incl %eax 205 cmpl (%ecx),%edx 206 je .L013spin 207.long 529567888 208 ret 209.L012nospin: 210 xorl %eax,%eax 211 xorl %edx,%edx 212 ret 213.size OPENSSL_far_spin,.-.L_OPENSSL_far_spin_begin 214.globl OPENSSL_wipe_cpu 215.type OPENSSL_wipe_cpu,@function 216.align 16 217OPENSSL_wipe_cpu: 218.L_OPENSSL_wipe_cpu_begin: 219 xorl %eax,%eax 220 xorl %edx,%edx 221 call .L014PIC_me_up 222.L014PIC_me_up: 223 popl %ecx 224 leal _GLOBAL_OFFSET_TABLE_+[.-.L014PIC_me_up](%ecx),%ecx 225 movl OPENSSL_ia32cap_P@GOT(%ecx),%ecx 226 movl (%ecx),%ecx 227 btl $1,(%ecx) 228 jnc .L015no_x87 229 andl $83886080,%ecx 230 cmpl $83886080,%ecx 231 jne .L016no_sse2 232 pxor %xmm0,%xmm0 233 pxor %xmm1,%xmm1 234 pxor %xmm2,%xmm2 235 pxor %xmm3,%xmm3 236 pxor %xmm4,%xmm4 237 pxor %xmm5,%xmm5 238 pxor %xmm6,%xmm6 239 pxor %xmm7,%xmm7 240.L016no_sse2: 241.long 4007259865,4007259865,4007259865,4007259865,2430851995 242.L015no_x87: 243 leal 4(%esp),%eax 244 ret 245.size OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin 246.globl OPENSSL_atomic_add 247.type OPENSSL_atomic_add,@function 248.align 16 249OPENSSL_atomic_add: 250.L_OPENSSL_atomic_add_begin: 251 movl 4(%esp),%edx 252 movl 8(%esp),%ecx 253 pushl %ebx 254 nop 255 movl (%edx),%eax 256.L017spin: 257 leal (%eax,%ecx,1),%ebx 258 nop 259.long 447811568 260 jne .L017spin 261 movl %ebx,%eax 262 popl %ebx 263 ret 264.size OPENSSL_atomic_add,.-.L_OPENSSL_atomic_add_begin 265.globl OPENSSL_indirect_call 266.type OPENSSL_indirect_call,@function 267.align 16 268OPENSSL_indirect_call: 269.L_OPENSSL_indirect_call_begin: 270 pushl %ebp 271 movl %esp,%ebp 272 subl $28,%esp 273 movl 12(%ebp),%ecx 274 movl %ecx,(%esp) 275 movl 16(%ebp),%edx 276 movl %edx,4(%esp) 277 movl 20(%ebp),%eax 278 movl %eax,8(%esp) 279 movl 24(%ebp),%eax 280 movl %eax,12(%esp) 281 movl 28(%ebp),%eax 282 movl %eax,16(%esp) 283 movl 32(%ebp),%eax 284 movl %eax,20(%esp) 285 movl 36(%ebp),%eax 286 movl %eax,24(%esp) 287 call *8(%ebp) 288 movl %ebp,%esp 289 popl %ebp 290 ret 291.size OPENSSL_indirect_call,.-.L_OPENSSL_indirect_call_begin 292.globl OPENSSL_cleanse 293.type OPENSSL_cleanse,@function 294.align 16 295OPENSSL_cleanse: 296.L_OPENSSL_cleanse_begin: 297 movl 4(%esp),%edx 298 movl 8(%esp),%ecx 299 xorl %eax,%eax 300 cmpl $7,%ecx 301 jae .L018lot 302 cmpl $0,%ecx 303 je .L019ret 304.L020little: 305 movb %al,(%edx) 306 subl $1,%ecx 307 leal 1(%edx),%edx 308 jnz .L020little 309.L019ret: 310 ret 311.align 16 312.L018lot: 313 testl $3,%edx 314 jz .L021aligned 315 movb %al,(%edx) 316 leal -1(%ecx),%ecx 317 leal 1(%edx),%edx 318 jmp .L018lot 319.L021aligned: 320 movl %eax,(%edx) 321 leal -4(%ecx),%ecx 322 testl $-4,%ecx 323 leal 4(%edx),%edx 324 jnz .L021aligned 325 cmpl $0,%ecx 326 jne .L020little 327 ret 328.size OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin 329.globl OPENSSL_ia32_rdrand 330.type OPENSSL_ia32_rdrand,@function 331.align 16 332OPENSSL_ia32_rdrand: 333.L_OPENSSL_ia32_rdrand_begin: 334 movl $8,%ecx 335.L022loop: 336.byte 15,199,240 337 jc .L023break 338 loop .L022loop 339.L023break: 340 cmpl $0,%eax 341 cmovel %ecx,%eax 342 ret 343.size OPENSSL_ia32_rdrand,.-.L_OPENSSL_ia32_rdrand_begin 344.hidden OPENSSL_cpuid_setup 345.hidden OPENSSL_ia32cap_P 346.comm OPENSSL_ia32cap_P,8,4 347.section .init 348 call OPENSSL_cpuid_setup 349