1#include <machine/asm.h> 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 movl 20(%esp),%esi 24 movl %eax,8(%esi) 25 btl $21,%ecx 26 jnc .L000nocpuid 27 .byte 0x0f,0xa2 28 movl %eax,%edi 29 xorl %eax,%eax 30 cmpl $1970169159,%ebx 31 setne %al 32 movl %eax,%ebp 33 cmpl $1231384169,%edx 34 setne %al 35 orl %eax,%ebp 36 cmpl $1818588270,%ecx 37 setne %al 38 orl %eax,%ebp 39 jz .L001intel 40 cmpl $1752462657,%ebx 41 setne %al 42 movl %eax,%esi 43 cmpl $1769238117,%edx 44 setne %al 45 orl %eax,%esi 46 cmpl $1145913699,%ecx 47 setne %al 48 orl %eax,%esi 49 jnz .L001intel 50 movl $2147483648,%eax 51 .byte 0x0f,0xa2 52 cmpl $2147483649,%eax 53 jb .L001intel 54 movl %eax,%esi 55 movl $2147483649,%eax 56 .byte 0x0f,0xa2 57 orl %ecx,%ebp 58 andl $2049,%ebp 59 cmpl $2147483656,%esi 60 jb .L001intel 61 movl $2147483656,%eax 62 .byte 0x0f,0xa2 63 movzbl %cl,%esi 64 incl %esi 65 movl $1,%eax 66 xorl %ecx,%ecx 67 .byte 0x0f,0xa2 68 btl $28,%edx 69 jnc .L002generic 70 shrl $16,%ebx 71 andl $255,%ebx 72 cmpl %esi,%ebx 73 ja .L002generic 74 andl $4026531839,%edx 75 jmp .L002generic 76.L001intel: 77 cmpl $4,%edi 78 movl $-1,%esi 79 jb .L003nocacheinfo 80 movl $4,%eax 81 movl $0,%ecx 82 .byte 0x0f,0xa2 83 movl %eax,%esi 84 shrl $14,%esi 85 andl $4095,%esi 86.L003nocacheinfo: 87 movl $1,%eax 88 xorl %ecx,%ecx 89 .byte 0x0f,0xa2 90 andl $3220176895,%edx 91 cmpl $0,%ebp 92 jne .L004notintel 93 orl $1073741824,%edx 94 andb $15,%ah 95 cmpb $15,%ah 96 jne .L004notintel 97 orl $1048576,%edx 98.L004notintel: 99 btl $28,%edx 100 jnc .L002generic 101 andl $4026531839,%edx 102 cmpl $0,%esi 103 je .L002generic 104 orl $268435456,%edx 105 shrl $16,%ebx 106 cmpb $1,%bl 107 ja .L002generic 108 andl $4026531839,%edx 109.L002generic: 110 andl $2048,%ebp 111 andl $4294965247,%ecx 112 movl %edx,%esi 113 orl %ecx,%ebp 114 cmpl $7,%edi 115 movl 20(%esp),%edi 116 jb .L005no_extended_info 117 movl $7,%eax 118 xorl %ecx,%ecx 119 .byte 0x0f,0xa2 120 movl %ebx,8(%edi) 121.L005no_extended_info: 122 btl $27,%ebp 123 jnc .L006clear_avx 124 xorl %ecx,%ecx 125.byte 15,1,208 126 andl $6,%eax 127 cmpl $6,%eax 128 je .L007done 129 cmpl $2,%eax 130 je .L006clear_avx 131.L008clear_xmm: 132 andl $4261412861,%ebp 133 andl $4278190079,%esi 134.L006clear_avx: 135 andl $4026525695,%ebp 136 andl $4294967263,8(%edi) 137.L007done: 138 movl %esi,%eax 139 movl %ebp,%edx 140.L000nocpuid: 141 popl %edi 142 popl %esi 143 popl %ebx 144 popl %ebp 145 ret 146.size OPENSSL_ia32_cpuid,.-.L_OPENSSL_ia32_cpuid_begin 147.globl OPENSSL_rdtsc 148.type OPENSSL_rdtsc,@function 149.align 16 150OPENSSL_rdtsc: 151.L_OPENSSL_rdtsc_begin: 152 xorl %eax,%eax 153 xorl %edx,%edx 154 call .L009PIC_me_up 155.L009PIC_me_up: 156 popl %ecx 157 leal OPENSSL_ia32cap_P-.L009PIC_me_up(%ecx),%ecx 158 btl $4,(%ecx) 159 jnc .L010notsc 160 .byte 0x0f,0x31 161.L010notsc: 162 ret 163.size OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin 164.globl OPENSSL_instrument_halt 165.type OPENSSL_instrument_halt,@function 166.align 16 167OPENSSL_instrument_halt: 168.L_OPENSSL_instrument_halt_begin: 169 call .L011PIC_me_up 170.L011PIC_me_up: 171 popl %ecx 172 leal OPENSSL_ia32cap_P-.L011PIC_me_up(%ecx),%ecx 173 btl $4,(%ecx) 174 jnc .L012nohalt 175.long 2421723150 176 andl $3,%eax 177 jnz .L012nohalt 178 pushfl 179 popl %eax 180 btl $9,%eax 181 jnc .L012nohalt 182 .byte 0x0f,0x31 183 pushl %edx 184 pushl %eax 185 hlt 186 .byte 0x0f,0x31 187 subl (%esp),%eax 188 sbbl 4(%esp),%edx 189 addl $8,%esp 190 ret 191.L012nohalt: 192 xorl %eax,%eax 193 xorl %edx,%edx 194 ret 195.size OPENSSL_instrument_halt,.-.L_OPENSSL_instrument_halt_begin 196.globl OPENSSL_far_spin 197.type OPENSSL_far_spin,@function 198.align 16 199OPENSSL_far_spin: 200.L_OPENSSL_far_spin_begin: 201 pushfl 202 popl %eax 203 btl $9,%eax 204 jnc .L013nospin 205 movl 4(%esp),%eax 206 movl 8(%esp),%ecx 207.long 2430111262 208 xorl %eax,%eax 209 movl (%ecx),%edx 210 jmp .L014spin 211.align 16 212.L014spin: 213 incl %eax 214 cmpl (%ecx),%edx 215 je .L014spin 216.long 529567888 217 ret 218.L013nospin: 219 xorl %eax,%eax 220 xorl %edx,%edx 221 ret 222.size OPENSSL_far_spin,.-.L_OPENSSL_far_spin_begin 223.globl OPENSSL_wipe_cpu 224.type OPENSSL_wipe_cpu,@function 225.align 16 226OPENSSL_wipe_cpu: 227.L_OPENSSL_wipe_cpu_begin: 228 xorl %eax,%eax 229 xorl %edx,%edx 230 call .L015PIC_me_up 231.L015PIC_me_up: 232 popl %ecx 233 leal OPENSSL_ia32cap_P-.L015PIC_me_up(%ecx),%ecx 234 movl (%ecx),%ecx 235 btl $1,(%ecx) 236 jnc .L016no_x87 237 andl $83886080,%ecx 238 cmpl $83886080,%ecx 239 jne .L017no_sse2 240 pxor %xmm0,%xmm0 241 pxor %xmm1,%xmm1 242 pxor %xmm2,%xmm2 243 pxor %xmm3,%xmm3 244 pxor %xmm4,%xmm4 245 pxor %xmm5,%xmm5 246 pxor %xmm6,%xmm6 247 pxor %xmm7,%xmm7 248.L017no_sse2: 249.long 4007259865,4007259865,4007259865,4007259865,2430851995 250.L016no_x87: 251 leal 4(%esp),%eax 252 ret 253.size OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin 254.globl OPENSSL_atomic_add 255.type OPENSSL_atomic_add,@function 256.align 16 257OPENSSL_atomic_add: 258.L_OPENSSL_atomic_add_begin: 259 movl 4(%esp),%edx 260 movl 8(%esp),%ecx 261 pushl %ebx 262 nop 263 movl (%edx),%eax 264.L018spin: 265 leal (%eax,%ecx,1),%ebx 266 nop 267.long 447811568 268 jne .L018spin 269 movl %ebx,%eax 270 popl %ebx 271 ret 272.size OPENSSL_atomic_add,.-.L_OPENSSL_atomic_add_begin 273.globl OPENSSL_cleanse 274.type OPENSSL_cleanse,@function 275.align 16 276OPENSSL_cleanse: 277.L_OPENSSL_cleanse_begin: 278 movl 4(%esp),%edx 279 movl 8(%esp),%ecx 280 xorl %eax,%eax 281 cmpl $7,%ecx 282 jae .L019lot 283 cmpl $0,%ecx 284 je .L020ret 285.L021little: 286 movb %al,(%edx) 287 subl $1,%ecx 288 leal 1(%edx),%edx 289 jnz .L021little 290.L020ret: 291 ret 292.align 16 293.L019lot: 294 testl $3,%edx 295 jz .L022aligned 296 movb %al,(%edx) 297 leal -1(%ecx),%ecx 298 leal 1(%edx),%edx 299 jmp .L019lot 300.L022aligned: 301 movl %eax,(%edx) 302 leal -4(%ecx),%ecx 303 testl $-4,%ecx 304 leal 4(%edx),%edx 305 jnz .L022aligned 306 cmpl $0,%ecx 307 jne .L021little 308 ret 309.size OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin 310.globl CRYPTO_memcmp 311.type CRYPTO_memcmp,@function 312.align 16 313CRYPTO_memcmp: 314.L_CRYPTO_memcmp_begin: 315 pushl %esi 316 pushl %edi 317 movl 12(%esp),%esi 318 movl 16(%esp),%edi 319 movl 20(%esp),%ecx 320 xorl %eax,%eax 321 xorl %edx,%edx 322 cmpl $0,%ecx 323 je .L023no_data 324.L024loop: 325 movb (%esi),%dl 326 leal 1(%esi),%esi 327 xorb (%edi),%dl 328 leal 1(%edi),%edi 329 orb %dl,%al 330 decl %ecx 331 jnz .L024loop 332 negl %eax 333 shrl $31,%eax 334.L023no_data: 335 popl %edi 336 popl %esi 337 ret 338.size CRYPTO_memcmp,.-.L_CRYPTO_memcmp_begin 339.globl OPENSSL_instrument_bus 340.type OPENSSL_instrument_bus,@function 341.align 16 342OPENSSL_instrument_bus: 343.L_OPENSSL_instrument_bus_begin: 344 pushl %ebp 345 pushl %ebx 346 pushl %esi 347 pushl %edi 348 movl $0,%eax 349 call .L025PIC_me_up 350.L025PIC_me_up: 351 popl %edx 352 leal OPENSSL_ia32cap_P-.L025PIC_me_up(%edx),%edx 353 btl $4,(%edx) 354 jnc .L026nogo 355 btl $19,(%edx) 356 jnc .L026nogo 357 movl 20(%esp),%edi 358 movl 24(%esp),%ecx 359 .byte 0x0f,0x31 360 movl %eax,%esi 361 movl $0,%ebx 362 clflush (%edi) 363.byte 240 364 addl %ebx,(%edi) 365 jmp .L027loop 366.align 16 367.L027loop: 368 .byte 0x0f,0x31 369 movl %eax,%edx 370 subl %esi,%eax 371 movl %edx,%esi 372 movl %eax,%ebx 373 clflush (%edi) 374.byte 240 375 addl %eax,(%edi) 376 leal 4(%edi),%edi 377 subl $1,%ecx 378 jnz .L027loop 379 movl 24(%esp),%eax 380.L026nogo: 381 popl %edi 382 popl %esi 383 popl %ebx 384 popl %ebp 385 ret 386.size OPENSSL_instrument_bus,.-.L_OPENSSL_instrument_bus_begin 387.globl OPENSSL_instrument_bus2 388.type OPENSSL_instrument_bus2,@function 389.align 16 390OPENSSL_instrument_bus2: 391.L_OPENSSL_instrument_bus2_begin: 392 pushl %ebp 393 pushl %ebx 394 pushl %esi 395 pushl %edi 396 movl $0,%eax 397 call .L028PIC_me_up 398.L028PIC_me_up: 399 popl %edx 400 leal OPENSSL_ia32cap_P-.L028PIC_me_up(%edx),%edx 401 btl $4,(%edx) 402 jnc .L029nogo 403 btl $19,(%edx) 404 jnc .L029nogo 405 movl 20(%esp),%edi 406 movl 24(%esp),%ecx 407 movl 28(%esp),%ebp 408 .byte 0x0f,0x31 409 movl %eax,%esi 410 movl $0,%ebx 411 clflush (%edi) 412.byte 240 413 addl %ebx,(%edi) 414 .byte 0x0f,0x31 415 movl %eax,%edx 416 subl %esi,%eax 417 movl %edx,%esi 418 movl %eax,%ebx 419 jmp .L030loop2 420.align 16 421.L030loop2: 422 clflush (%edi) 423.byte 240 424 addl %eax,(%edi) 425 subl $1,%ebp 426 jz .L031done2 427 .byte 0x0f,0x31 428 movl %eax,%edx 429 subl %esi,%eax 430 movl %edx,%esi 431 cmpl %ebx,%eax 432 movl %eax,%ebx 433 movl $0,%edx 434 setne %dl 435 subl %edx,%ecx 436 leal (%edi,%edx,4),%edi 437 jnz .L030loop2 438.L031done2: 439 movl 24(%esp),%eax 440 subl %ecx,%eax 441.L029nogo: 442 popl %edi 443 popl %esi 444 popl %ebx 445 popl %ebp 446 ret 447.size OPENSSL_instrument_bus2,.-.L_OPENSSL_instrument_bus2_begin 448.globl OPENSSL_ia32_rdrand_bytes 449.type OPENSSL_ia32_rdrand_bytes,@function 450.align 16 451OPENSSL_ia32_rdrand_bytes: 452.L_OPENSSL_ia32_rdrand_bytes_begin: 453 pushl %edi 454 pushl %ebx 455 xorl %eax,%eax 456 movl 12(%esp),%edi 457 movl 16(%esp),%ebx 458 cmpl $0,%ebx 459 je .L032done 460 movl $8,%ecx 461.L033loop: 462.byte 15,199,242 463 jc .L034break 464 loop .L033loop 465 jmp .L032done 466.align 16 467.L034break: 468 cmpl $4,%ebx 469 jb .L035tail 470 movl %edx,(%edi) 471 leal 4(%edi),%edi 472 addl $4,%eax 473 subl $4,%ebx 474 jz .L032done 475 movl $8,%ecx 476 jmp .L033loop 477.align 16 478.L035tail: 479 movb %dl,(%edi) 480 leal 1(%edi),%edi 481 incl %eax 482 shrl $8,%edx 483 decl %ebx 484 jnz .L035tail 485.L032done: 486 xorl %edx,%edx 487 popl %ebx 488 popl %edi 489 ret 490.size OPENSSL_ia32_rdrand_bytes,.-.L_OPENSSL_ia32_rdrand_bytes_begin 491.globl OPENSSL_ia32_rdseed_bytes 492.type OPENSSL_ia32_rdseed_bytes,@function 493.align 16 494OPENSSL_ia32_rdseed_bytes: 495.L_OPENSSL_ia32_rdseed_bytes_begin: 496 pushl %edi 497 pushl %ebx 498 xorl %eax,%eax 499 movl 12(%esp),%edi 500 movl 16(%esp),%ebx 501 cmpl $0,%ebx 502 je .L036done 503 movl $8,%ecx 504.L037loop: 505.byte 15,199,250 506 jc .L038break 507 loop .L037loop 508 jmp .L036done 509.align 16 510.L038break: 511 cmpl $4,%ebx 512 jb .L039tail 513 movl %edx,(%edi) 514 leal 4(%edi),%edi 515 addl $4,%eax 516 subl $4,%ebx 517 jz .L036done 518 movl $8,%ecx 519 jmp .L037loop 520.align 16 521.L039tail: 522 movb %dl,(%edi) 523 leal 1(%edi),%edi 524 incl %eax 525 shrl $8,%edx 526 decl %ebx 527 jnz .L039tail 528.L036done: 529 xorl %edx,%edx 530 popl %ebx 531 popl %edi 532 ret 533.size OPENSSL_ia32_rdseed_bytes,.-.L_OPENSSL_ia32_rdseed_bytes_begin 534.hidden OPENSSL_cpuid_setup 535.hidden OPENSSL_ia32cap_P 536.comm OPENSSL_ia32cap_P,16,4 537.section .init 538 PIC_PROLOGUE 539 call PIC_PLT(OPENSSL_cpuid_setup) 540 PIC_EPILOGUE 541