123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- #!/usr/bin/env perl
- $output=shift;
- $masm=1 if ($output =~ /\.asm/);
- open STDOUT,">$output" || die "can't open $output: $!";
- print<<___ if(defined($masm));
- _TEXT SEGMENT
- PUBLIC OPENSSL_rdtsc
- PUBLIC OPENSSL_atomic_add
- ALIGN 16
- OPENSSL_atomic_add PROC
- mov eax,DWORD PTR[rcx]
- \$Lspin: lea r8,DWORD PTR[rdx+rax]
- lock cmpxchg DWORD PTR[rcx],r8d
- jne \$Lspin
- mov eax,r8d
- cdqe
- ret
- OPENSSL_atomic_add ENDP
- PUBLIC OPENSSL_wipe_cpu
- ALIGN 16
- OPENSSL_wipe_cpu PROC
- pxor xmm0,xmm0
- pxor xmm1,xmm1
- pxor xmm2,xmm2
- pxor xmm3,xmm3
- pxor xmm4,xmm4
- pxor xmm5,xmm5
- xor rcx,rcx
- xor rdx,rdx
- xor r8,r8
- xor r9,r9
- xor r10,r10
- xor r11,r11
- lea rax,QWORD PTR[rsp+8]
- ret
- OPENSSL_wipe_cpu ENDP
- _TEXT ENDS
- CRT\$XIU SEGMENT
- EXTRN OPENSSL_cpuid_setup:PROC
- DQ OPENSSL_cpuid_setup
- CRT\$XIU ENDS
- ___
- print<<___ if(!defined($masm));
- .text
- .globl OPENSSL_atomic_add
- .type OPENSSL_atomic_add,\@function
- .align 16
- OPENSSL_atomic_add:
- movl (%rdi),%eax
- .Lspin: leaq (%rsi,%rax),%r8
- lock; cmpxchgl %r8d,(%rdi)
- jne .Lspin
- movl %r8d,%eax
- .byte 0x48,0x98
- ret
- .size OPENSSL_atomic_add,.-OPENSSL_atomic_add
- .globl OPENSSL_wipe_cpu
- .type OPENSSL_wipe_cpu,\@function
- .align 16
- OPENSSL_wipe_cpu:
- pxor %xmm0,%xmm0
- pxor %xmm1,%xmm1
- pxor %xmm2,%xmm2
- pxor %xmm3,%xmm3
- pxor %xmm4,%xmm4
- pxor %xmm5,%xmm5
- pxor %xmm6,%xmm6
- pxor %xmm7,%xmm7
- pxor %xmm8,%xmm8
- pxor %xmm9,%xmm9
- pxor %xmm10,%xmm10
- pxor %xmm11,%xmm11
- pxor %xmm12,%xmm12
- pxor %xmm13,%xmm13
- pxor %xmm14,%xmm14
- pxor %xmm15,%xmm15
- xorq %rcx,%rcx
- xorq %rdx,%rdx
- xorq %rsi,%rsi
- xorq %rdi,%rdi
- xorq %r8,%r8
- xorq %r9,%r9
- xorq %r10,%r10
- xorq %r11,%r11
- leaq 8(%rsp),%rax
- ret
- .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
- .section .init
- call OPENSSL_cpuid_setup
- ___
- open STDOUT,"| $^X perlasm/x86_64-xlate.pl $output";
- print<<___;
- .text
- .globl OPENSSL_rdtsc
- .type OPENSSL_rdtsc,\@abi-omnipotent
- .align 16
- OPENSSL_rdtsc:
- rdtsc
- shl \$32,%rdx
- or %rdx,%rax
- ret
- .size OPENSSL_rdtsc,.-OPENSSL_rdtsc
- .globl OPENSSL_ia32_cpuid
- .type OPENSSL_ia32_cpuid,\@abi-omnipotent
- .align 16
- OPENSSL_ia32_cpuid:
- mov %rbx,%r8
- xor %eax,%eax
- cpuid
- xor %eax,%eax
- cmp \$0x756e6547,%ebx # "Genu"
- setne %al
- mov %eax,%r9d
- cmp \$0x49656e69,%edx # "ineI"
- setne %al
- or %eax,%r9d
- cmp \$0x6c65746e,%ecx # "ntel"
- setne %al
- or %eax,%r9d
- mov \$1,%eax
- cpuid
- cmp \$0,%r9d
- jne .Lnotintel
- or \$0x00100000,%edx # use reserved 20th bit to engage RC4_CHAR
- and \$15,%ah
- cmp \$15,%ah # examine Family ID
- je .Lnotintel
- or \$0x40000000,%edx # use reserved bit to skip unrolled loop
- .Lnotintel:
- bt \$28,%edx # test hyper-threading bit
- jnc .Ldone
- shr \$16,%ebx
- cmp \$1,%bl # see if cache is shared
- ja .Ldone
- and \$0xefffffff,%edx # ~(1<<28)
- .Ldone:
- shl \$32,%rcx
- mov %edx,%eax
- mov %r8,%rbx
- or %rcx,%rax
- ret
- .size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
- ___
- close STDOUT; # flush
|