1*2139Sjp161948#!/usr/bin/env perl 2*2139Sjp161948 3*2139Sjp161948$output=shift; 4*2139Sjp161948$win64a=1 if ($output =~ /win64a\.[s|asm]/); 5*2139Sjp161948open STDOUT,">$output" || die "can't open $output: $!"; 6*2139Sjp161948 7*2139Sjp161948print<<___ if(defined($win64a)); 8*2139Sjp161948_TEXT SEGMENT 9*2139Sjp161948PUBLIC OPENSSL_rdtsc 10*2139Sjp161948ALIGN 16 11*2139Sjp161948OPENSSL_rdtsc PROC 12*2139Sjp161948 rdtsc 13*2139Sjp161948 shl rdx,32 14*2139Sjp161948 or rax,rdx 15*2139Sjp161948 ret 16*2139Sjp161948OPENSSL_rdtsc ENDP 17*2139Sjp161948 18*2139Sjp161948PUBLIC OPENSSL_atomic_add 19*2139Sjp161948ALIGN 16 20*2139Sjp161948OPENSSL_atomic_add PROC 21*2139Sjp161948 mov eax,DWORD PTR[rcx] 22*2139Sjp161948\$Lspin: lea r8,DWORD PTR[rdx+rax] 23*2139Sjp161948lock cmpxchg DWORD PTR[rcx],r8d 24*2139Sjp161948 jne \$Lspin 25*2139Sjp161948 mov eax,r8d 26*2139Sjp161948 cdqe 27*2139Sjp161948 ret 28*2139Sjp161948OPENSSL_atomic_add ENDP 29*2139Sjp161948 30*2139Sjp161948PUBLIC OPENSSL_wipe_cpu 31*2139Sjp161948ALIGN 16 32*2139Sjp161948OPENSSL_wipe_cpu PROC 33*2139Sjp161948 pxor xmm0,xmm0 34*2139Sjp161948 pxor xmm1,xmm1 35*2139Sjp161948 pxor xmm2,xmm2 36*2139Sjp161948 pxor xmm3,xmm3 37*2139Sjp161948 pxor xmm4,xmm4 38*2139Sjp161948 pxor xmm5,xmm5 39*2139Sjp161948 xor rcx,rcx 40*2139Sjp161948 xor rdx,rdx 41*2139Sjp161948 xor r8,r8 42*2139Sjp161948 xor r9,r9 43*2139Sjp161948 xor r10,r10 44*2139Sjp161948 xor r11,r11 45*2139Sjp161948 lea rax,QWORD PTR[rsp+8] 46*2139Sjp161948 ret 47*2139Sjp161948OPENSSL_wipe_cpu ENDP 48*2139Sjp161948 49*2139Sjp161948OPENSSL_ia32_cpuid PROC 50*2139Sjp161948 mov r8,rbx 51*2139Sjp161948 mov eax,1 52*2139Sjp161948 cpuid 53*2139Sjp161948 shl rcx,32 54*2139Sjp161948 mov eax,edx 55*2139Sjp161948 mov rbx,r8 56*2139Sjp161948 or rax,rcx 57*2139Sjp161948 ret 58*2139Sjp161948OPENSSL_ia32_cpuid ENDP 59*2139Sjp161948_TEXT ENDS 60*2139Sjp161948 61*2139Sjp161948CRT\$XIU SEGMENT 62*2139Sjp161948EXTRN OPENSSL_cpuid_setup:PROC 63*2139Sjp161948DQ OPENSSL_cpuid_setup 64*2139Sjp161948CRT\$XIU ENDS 65*2139Sjp161948END 66*2139Sjp161948___ 67*2139Sjp161948print<<___ if(!defined($win64a)); 68*2139Sjp161948.text 69*2139Sjp161948.globl OPENSSL_rdtsc 70*2139Sjp161948.align 16 71*2139Sjp161948OPENSSL_rdtsc: 72*2139Sjp161948 rdtsc 73*2139Sjp161948 shlq \$32,%rdx 74*2139Sjp161948 orq %rdx,%rax 75*2139Sjp161948 ret 76*2139Sjp161948.size OPENSSL_rdtsc,.-OPENSSL_rdtsc 77*2139Sjp161948 78*2139Sjp161948.globl OPENSSL_atomic_add 79*2139Sjp161948.type OPENSSL_atomic_add,\@function 80*2139Sjp161948.align 16 81*2139Sjp161948OPENSSL_atomic_add: 82*2139Sjp161948 movl (%rdi),%eax 83*2139Sjp161948.Lspin: leaq (%rsi,%rax),%r8 84*2139Sjp161948lock; cmpxchgl %r8d,(%rdi) 85*2139Sjp161948 jne .Lspin 86*2139Sjp161948 movl %r8d,%eax 87*2139Sjp161948 .byte 0x48,0x98 88*2139Sjp161948 ret 89*2139Sjp161948.size OPENSSL_atomic_add,.-OPENSSL_atomic_add 90*2139Sjp161948 91*2139Sjp161948.globl OPENSSL_wipe_cpu 92*2139Sjp161948.type OPENSSL_wipe_cpu,\@function 93*2139Sjp161948.align 16 94*2139Sjp161948OPENSSL_wipe_cpu: 95*2139Sjp161948 pxor %xmm0,%xmm0 96*2139Sjp161948 pxor %xmm1,%xmm1 97*2139Sjp161948 pxor %xmm2,%xmm2 98*2139Sjp161948 pxor %xmm3,%xmm3 99*2139Sjp161948 pxor %xmm4,%xmm4 100*2139Sjp161948 pxor %xmm5,%xmm5 101*2139Sjp161948 pxor %xmm6,%xmm6 102*2139Sjp161948 pxor %xmm7,%xmm7 103*2139Sjp161948 pxor %xmm8,%xmm8 104*2139Sjp161948 pxor %xmm9,%xmm9 105*2139Sjp161948 pxor %xmm10,%xmm10 106*2139Sjp161948 pxor %xmm11,%xmm11 107*2139Sjp161948 pxor %xmm12,%xmm12 108*2139Sjp161948 pxor %xmm13,%xmm13 109*2139Sjp161948 pxor %xmm14,%xmm14 110*2139Sjp161948 pxor %xmm15,%xmm15 111*2139Sjp161948 xorq %rcx,%rcx 112*2139Sjp161948 xorq %rdx,%rdx 113*2139Sjp161948 xorq %rsi,%rsi 114*2139Sjp161948 xorq %rdi,%rdi 115*2139Sjp161948 xorq %r8,%r8 116*2139Sjp161948 xorq %r9,%r9 117*2139Sjp161948 xorq %r10,%r10 118*2139Sjp161948 xorq %r11,%r11 119*2139Sjp161948 leaq 8(%rsp),%rax 120*2139Sjp161948 ret 121*2139Sjp161948.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu 122*2139Sjp161948 123*2139Sjp161948.globl OPENSSL_ia32_cpuid 124*2139Sjp161948.align 16 125*2139Sjp161948OPENSSL_ia32_cpuid: 126*2139Sjp161948 movq %rbx,%r8 127*2139Sjp161948 movl \$1,%eax 128*2139Sjp161948 cpuid 129*2139Sjp161948 shlq \$32,%rcx 130*2139Sjp161948 movl %edx,%eax 131*2139Sjp161948 movq %r8,%rbx 132*2139Sjp161948 orq %rcx,%rax 133*2139Sjp161948 ret 134*2139Sjp161948.size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid 135*2139Sjp161948 136*2139Sjp161948.section .init 137*2139Sjp161948 call OPENSSL_cpuid_setup 138*2139Sjp161948___ 139