X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fx86_64cpuid.pl;h=331529ae592ea3a41a0053aaf3027f2c2a65aebf;hb=781f0a9bb5a32e2f86233d956e036d2b6a973886;hp=777d557783d8b6a85862fdb030a329d95feb104a;hpb=5f1841cdcae459924c3d1d92fcaf3110068c7cda;p=oweals%2Fopenssl.git diff --git a/crypto/x86_64cpuid.pl b/crypto/x86_64cpuid.pl index 777d557783..331529ae59 100644 --- a/crypto/x86_64cpuid.pl +++ b/crypto/x86_64cpuid.pl @@ -1,19 +1,12 @@ #!/usr/bin/env perl $output=shift; -$win64a=1 if ($output =~ /win64a\.[s|asm]/); +$masm=1 if ($output =~ /\.asm/); open STDOUT,">$output" || die "can't open $output: $!"; -print<<___ if(defined($win64a)); +print<<___ if(defined($masm)); _TEXT SEGMENT PUBLIC OPENSSL_rdtsc -ALIGN 16 -OPENSSL_rdtsc PROC - rdtsc - shl rdx,32 - or rax,rdx - ret -OPENSSL_rdtsc ENDP PUBLIC OPENSSL_atomic_add ALIGN 16 @@ -45,46 +38,27 @@ OPENSSL_wipe_cpu PROC lea rax,QWORD PTR[rsp+8] ret OPENSSL_wipe_cpu ENDP - -OPENSSL_ia32_cpuid PROC - mov r8,rbx - mov eax,1 - cpuid - shl rcx,32 - mov eax,edx - mov rbx,r8 - or rax,rcx - ret -OPENSSL_ia32_cpuid ENDP _TEXT ENDS CRT\$XIU SEGMENT EXTRN OPENSSL_cpuid_setup:PROC DQ OPENSSL_cpuid_setup CRT\$XIU ENDS -END + ___ -print<<___ if(!defined($win64a)); +print<<___ if(!defined($masm)); .text -.globl OPENSSL_rdtsc -.align 16 -OPENSSL_rdtsc: - rdtsc - shl \$32,%rdx - or %rdx,%rax - ret -.size OPENSSL_rdtsc,.-OPENSSL_rdtsc .globl OPENSSL_atomic_add .type OPENSSL_atomic_add,\@function .align 16 OPENSSL_atomic_add: movl (%rdi),%eax -.Lspin: lea (%rsi,%rax),%r8 -lock; cmpxchg %r8d,(%rdi) +.Lspin: leaq (%rsi,%rax),%r8 +lock; cmpxchgl %r8d,(%rdi) jne .Lspin - mov %r8d,%eax - cdqe + movl %r8d,%eax + .byte 0x48,0x98 ret .size OPENSSL_atomic_add,.-OPENSSL_atomic_add @@ -108,24 +82,76 @@ OPENSSL_wipe_cpu: pxor %xmm13,%xmm13 pxor %xmm14,%xmm14 pxor %xmm15,%xmm15 - xor %rcx,%rcx - xor %rdx,%rdx - xor %rsi,%rsi - xor %rdi,%rdi - xor %r8,%r8 - xor %r9,%r9 - xor %r10,%r10 - xor %r11,%r11 - lea 8(%rsp),%rax + 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 + +___ + +$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; +$dir = "." if $dir eq ""; +open STDOUT,"| $^X $dir/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 @@ -133,6 +159,36 @@ OPENSSL_ia32_cpuid: ret .size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid -.section .init - call OPENSSL_cpuid_setup +.globl OPENSSL_cleanse +.type OPENSSL_cleanse,\@function,2 +.align 16 +OPENSSL_cleanse: + xor %rax,%rax + cmp \$15,%rsi + jae .Lot +.Little: + mov %al,(%rdi) + sub \$1,%rsi + lea 1(%rdi),%rdi + jnz .Little + ret +.align 16 +.Lot: + test \$7,%rdi + jz .Laligned + mov %al,(%rdi) + lea -1(%rsi),%rsi + lea 1(%rdi),%rdi + jmp .Lot +.Laligned: + mov %rax,(%rdi) + lea -8(%rsi),%rsi + test \$-8,%rsi + lea 8(%rdi),%rdi + jnz .Laligned + cmp \$0,%rsi + jne .Little + ret +.size OPENSSL_cleanse,.-OPENSSL_cleanse ___ +close STDOUT; # flush