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_indirect_call 274.type OPENSSL_indirect_call,@function 275.align 16 276OPENSSL_indirect_call: 277.L_OPENSSL_indirect_call_begin: 278 pushl %ebp 279 movl %esp,%ebp 280 subl $28,%esp 281 movl 12(%ebp),%ecx 282 movl %ecx,(%esp) 283 movl 16(%ebp),%edx 284 movl %edx,4(%esp) 285 movl 20(%ebp),%eax 286 movl %eax,8(%esp) 287 movl 24(%ebp),%eax 288 movl %eax,12(%esp) 289 movl 28(%ebp),%eax 290 movl %eax,16(%esp) 291 movl 32(%ebp),%eax 292 movl %eax,20(%esp) 293 movl 36(%ebp),%eax 294 movl %eax,24(%esp) 295 call *8(%ebp) 296 movl %ebp,%esp 297 popl %ebp 298 ret 299.size OPENSSL_indirect_call,.-.L_OPENSSL_indirect_call_begin 300.globl OPENSSL_cleanse 301.type OPENSSL_cleanse,@function 302.align 16 303OPENSSL_cleanse: 304.L_OPENSSL_cleanse_begin: 305 movl 4(%esp),%edx 306 movl 8(%esp),%ecx 307 xorl %eax,%eax 308 cmpl $7,%ecx 309 jae .L019lot 310 cmpl $0,%ecx 311 je .L020ret 312.L021little: 313 movb %al,(%edx) 314 subl $1,%ecx 315 leal 1(%edx),%edx 316 jnz .L021little 317.L020ret: 318 ret 319.align 16 320.L019lot: 321 testl $3,%edx 322 jz .L022aligned 323 movb %al,(%edx) 324 leal -1(%ecx),%ecx 325 leal 1(%edx),%edx 326 jmp .L019lot 327.L022aligned: 328 movl %eax,(%edx) 329 leal -4(%ecx),%ecx 330 testl $-4,%ecx 331 leal 4(%edx),%edx 332 jnz .L022aligned 333 cmpl $0,%ecx 334 jne .L021little 335 ret 336.size OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin 337.globl CRYPTO_memcmp 338.type CRYPTO_memcmp,@function 339.align 16 340CRYPTO_memcmp: 341.L_CRYPTO_memcmp_begin: 342 pushl %esi 343 pushl %edi 344 movl 12(%esp),%esi 345 movl 16(%esp),%edi 346 movl 20(%esp),%ecx 347 xorl %eax,%eax 348 xorl %edx,%edx 349 cmpl $0,%ecx 350 je .L023no_data 351.L024loop: 352 movb (%esi),%dl 353 leal 1(%esi),%esi 354 xorb (%edi),%dl 355 leal 1(%edi),%edi 356 orb %dl,%al 357 decl %ecx 358 jnz .L024loop 359 negl %eax 360 shrl $31,%eax 361.L023no_data: 362 popl %edi 363 popl %esi 364 ret 365.size CRYPTO_memcmp,.-.L_CRYPTO_memcmp_begin 366.globl OPENSSL_instrument_bus 367.type OPENSSL_instrument_bus,@function 368.align 16 369OPENSSL_instrument_bus: 370.L_OPENSSL_instrument_bus_begin: 371 pushl %ebp 372 pushl %ebx 373 pushl %esi 374 pushl %edi 375 movl $0,%eax 376 call .L025PIC_me_up 377.L025PIC_me_up: 378 popl %edx 379 leal OPENSSL_ia32cap_P-.L025PIC_me_up(%edx),%edx 380 btl $4,(%edx) 381 jnc .L026nogo 382 btl $19,(%edx) 383 jnc .L026nogo 384 movl 20(%esp),%edi 385 movl 24(%esp),%ecx 386 .byte 0x0f,0x31 387 movl %eax,%esi 388 movl $0,%ebx 389 clflush (%edi) 390.byte 240 391 addl %ebx,(%edi) 392 jmp .L027loop 393.align 16 394.L027loop: 395 .byte 0x0f,0x31 396 movl %eax,%edx 397 subl %esi,%eax 398 movl %edx,%esi 399 movl %eax,%ebx 400 clflush (%edi) 401.byte 240 402 addl %eax,(%edi) 403 leal 4(%edi),%edi 404 subl $1,%ecx 405 jnz .L027loop 406 movl 24(%esp),%eax 407.L026nogo: 408 popl %edi 409 popl %esi 410 popl %ebx 411 popl %ebp 412 ret 413.size OPENSSL_instrument_bus,.-.L_OPENSSL_instrument_bus_begin 414.globl OPENSSL_instrument_bus2 415.type OPENSSL_instrument_bus2,@function 416.align 16 417OPENSSL_instrument_bus2: 418.L_OPENSSL_instrument_bus2_begin: 419 pushl %ebp 420 pushl %ebx 421 pushl %esi 422 pushl %edi 423 movl $0,%eax 424 call .L028PIC_me_up 425.L028PIC_me_up: 426 popl %edx 427 leal OPENSSL_ia32cap_P-.L028PIC_me_up(%edx),%edx 428 btl $4,(%edx) 429 jnc .L029nogo 430 btl $19,(%edx) 431 jnc .L029nogo 432 movl 20(%esp),%edi 433 movl 24(%esp),%ecx 434 movl 28(%esp),%ebp 435 .byte 0x0f,0x31 436 movl %eax,%esi 437 movl $0,%ebx 438 clflush (%edi) 439.byte 240 440 addl %ebx,(%edi) 441 .byte 0x0f,0x31 442 movl %eax,%edx 443 subl %esi,%eax 444 movl %edx,%esi 445 movl %eax,%ebx 446 jmp .L030loop2 447.align 16 448.L030loop2: 449 clflush (%edi) 450.byte 240 451 addl %eax,(%edi) 452 subl $1,%ebp 453 jz .L031done2 454 .byte 0x0f,0x31 455 movl %eax,%edx 456 subl %esi,%eax 457 movl %edx,%esi 458 cmpl %ebx,%eax 459 movl %eax,%ebx 460 movl $0,%edx 461 setne %dl 462 subl %edx,%ecx 463 leal (%edi,%edx,4),%edi 464 jnz .L030loop2 465.L031done2: 466 movl 24(%esp),%eax 467 subl %ecx,%eax 468.L029nogo: 469 popl %edi 470 popl %esi 471 popl %ebx 472 popl %ebp 473 ret 474.size OPENSSL_instrument_bus2,.-.L_OPENSSL_instrument_bus2_begin 475.globl OPENSSL_ia32_rdrand 476.type OPENSSL_ia32_rdrand,@function 477.align 16 478OPENSSL_ia32_rdrand: 479.L_OPENSSL_ia32_rdrand_begin: 480 movl $8,%ecx 481.L032loop: 482.byte 15,199,240 483 jc .L033break 484 loop .L032loop 485.L033break: 486 cmpl $0,%eax 487 cmovel %ecx,%eax 488 ret 489.size OPENSSL_ia32_rdrand,.-.L_OPENSSL_ia32_rdrand_begin 490.globl OPENSSL_ia32_rdrand_bytes 491.type OPENSSL_ia32_rdrand_bytes,@function 492.align 16 493OPENSSL_ia32_rdrand_bytes: 494.L_OPENSSL_ia32_rdrand_bytes_begin: 495 pushl %edi 496 pushl %ebx 497 xorl %eax,%eax 498 movl 12(%esp),%edi 499 movl 16(%esp),%ebx 500 cmpl $0,%ebx 501 je .L034done 502 movl $8,%ecx 503.L035loop: 504.byte 15,199,242 505 jc .L036break 506 loop .L035loop 507 jmp .L034done 508.align 16 509.L036break: 510 cmpl $4,%ebx 511 jb .L037tail 512 movl %edx,(%edi) 513 leal 4(%edi),%edi 514 addl $4,%eax 515 subl $4,%ebx 516 jz .L034done 517 movl $8,%ecx 518 jmp .L035loop 519.align 16 520.L037tail: 521 movb %dl,(%edi) 522 leal 1(%edi),%edi 523 incl %eax 524 shrl $8,%edx 525 decl %ebx 526 jnz .L037tail 527.L034done: 528 popl %ebx 529 popl %edi 530 ret 531.size OPENSSL_ia32_rdrand_bytes,.-.L_OPENSSL_ia32_rdrand_bytes_begin 532.globl OPENSSL_ia32_rdseed 533.type OPENSSL_ia32_rdseed,@function 534.align 16 535OPENSSL_ia32_rdseed: 536.L_OPENSSL_ia32_rdseed_begin: 537 movl $8,%ecx 538.L038loop: 539.byte 15,199,248 540 jc .L039break 541 loop .L038loop 542.L039break: 543 cmpl $0,%eax 544 cmovel %ecx,%eax 545 ret 546.size OPENSSL_ia32_rdseed,.-.L_OPENSSL_ia32_rdseed_begin 547.globl OPENSSL_ia32_rdseed_bytes 548.type OPENSSL_ia32_rdseed_bytes,@function 549.align 16 550OPENSSL_ia32_rdseed_bytes: 551.L_OPENSSL_ia32_rdseed_bytes_begin: 552 pushl %edi 553 pushl %ebx 554 xorl %eax,%eax 555 movl 12(%esp),%edi 556 movl 16(%esp),%ebx 557 cmpl $0,%ebx 558 je .L040done 559 movl $8,%ecx 560.L041loop: 561.byte 15,199,250 562 jc .L042break 563 loop .L041loop 564 jmp .L040done 565.align 16 566.L042break: 567 cmpl $4,%ebx 568 jb .L043tail 569 movl %edx,(%edi) 570 leal 4(%edi),%edi 571 addl $4,%eax 572 subl $4,%ebx 573 jz .L040done 574 movl $8,%ecx 575 jmp .L041loop 576.align 16 577.L043tail: 578 movb %dl,(%edi) 579 leal 1(%edi),%edi 580 incl %eax 581 shrl $8,%edx 582 decl %ebx 583 jnz .L043tail 584.L040done: 585 popl %ebx 586 popl %edi 587 ret 588.size OPENSSL_ia32_rdseed_bytes,.-.L_OPENSSL_ia32_rdseed_bytes_begin 589.hidden OPENSSL_cpuid_setup 590.hidden OPENSSL_ia32cap_P 591.comm OPENSSL_ia32cap_P,16,4 592.section .init 593 PIC_PROLOGUE 594 call PIC_PLT(OPENSSL_cpuid_setup) 595 PIC_EPILOGUE 596