summaryrefslogtreecommitdiffstats
path: root/secure/lib/libcrypto/i386/x86cpuid.s
diff options
context:
space:
mode:
Diffstat (limited to 'secure/lib/libcrypto/i386/x86cpuid.s')
-rw-r--r--secure/lib/libcrypto/i386/x86cpuid.s117
1 files changed, 73 insertions, 44 deletions
diff --git a/secure/lib/libcrypto/i386/x86cpuid.s b/secure/lib/libcrypto/i386/x86cpuid.s
index 815ff69..69622ec 100644
--- a/secure/lib/libcrypto/i386/x86cpuid.s
+++ b/secure/lib/libcrypto/i386/x86cpuid.s
@@ -23,6 +23,8 @@ OPENSSL_ia32_cpuid:
xorl %eax,%eax
btl $21,%ecx
jnc .L000nocpuid
+ movl 20(%esp),%esi
+ movl %eax,8(%esi)
.byte 0x0f,0xa2
movl %eax,%edi
xorl %eax,%eax
@@ -73,28 +75,36 @@ OPENSSL_ia32_cpuid:
andl $4026531839,%edx
jmp .L002generic
.L001intel:
+ cmpl $7,%edi
+ jb .L003cacheinfo
+ movl 20(%esp),%esi
+ movl $7,%eax
+ xorl %ecx,%ecx
+ .byte 0x0f,0xa2
+ movl %ebx,8(%esi)
+.L003cacheinfo:
cmpl $4,%edi
movl $-1,%edi
- jb .L003nocacheinfo
+ jb .L004nocacheinfo
movl $4,%eax
movl $0,%ecx
.byte 0x0f,0xa2
movl %eax,%edi
shrl $14,%edi
andl $4095,%edi
-.L003nocacheinfo:
+.L004nocacheinfo:
movl $1,%eax
xorl %ecx,%ecx
.byte 0x0f,0xa2
andl $3220176895,%edx
cmpl $0,%ebp
- jne .L004notintel
+ jne .L005notintel
orl $1073741824,%edx
andb $15,%ah
cmpb $15,%ah
- jne .L004notintel
+ jne .L005notintel
orl $1048576,%edx
-.L004notintel:
+.L005notintel:
btl $28,%edx
jnc .L002generic
andl $4026531839,%edx
@@ -111,20 +121,22 @@ OPENSSL_ia32_cpuid:
movl %edx,%esi
orl %ecx,%ebp
btl $27,%ecx
- jnc .L005clear_avx
+ jnc .L006clear_avx
xorl %ecx,%ecx
.byte 15,1,208
andl $6,%eax
cmpl $6,%eax
- je .L006done
+ je .L007done
cmpl $2,%eax
- je .L005clear_avx
-.L007clear_xmm:
+ je .L006clear_avx
+.L008clear_xmm:
andl $4261412861,%ebp
andl $4278190079,%esi
-.L005clear_avx:
+.L006clear_avx:
andl $4026525695,%ebp
-.L006done:
+ movl 20(%esp),%edi
+ andl $4294967263,8(%edi)
+.L007done:
movl %esi,%eax
movl %ebp,%edx
.L000nocpuid:
@@ -143,9 +155,9 @@ OPENSSL_rdtsc:
xorl %edx,%edx
leal OPENSSL_ia32cap_P,%ecx
btl $4,(%ecx)
- jnc .L008notsc
+ jnc .L009notsc
.byte 0x0f,0x31
-.L008notsc:
+.L009notsc:
ret
.size OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin
.globl OPENSSL_instrument_halt
@@ -155,14 +167,14 @@ OPENSSL_instrument_halt:
.L_OPENSSL_instrument_halt_begin:
leal OPENSSL_ia32cap_P,%ecx
btl $4,(%ecx)
- jnc .L009nohalt
+ jnc .L010nohalt
.long 2421723150
andl $3,%eax
- jnz .L009nohalt
+ jnz .L010nohalt
pushfl
popl %eax
btl $9,%eax
- jnc .L009nohalt
+ jnc .L010nohalt
.byte 0x0f,0x31
pushl %edx
pushl %eax
@@ -172,7 +184,7 @@ OPENSSL_instrument_halt:
sbbl 4(%esp),%edx
addl $8,%esp
ret
-.L009nohalt:
+.L010nohalt:
xorl %eax,%eax
xorl %edx,%edx
ret
@@ -185,21 +197,21 @@ OPENSSL_far_spin:
pushfl
popl %eax
btl $9,%eax
- jnc .L010nospin
+ jnc .L011nospin
movl 4(%esp),%eax
movl 8(%esp),%ecx
.long 2430111262
xorl %eax,%eax
movl (%ecx),%edx
- jmp .L011spin
+ jmp .L012spin
.align 16
-.L011spin:
+.L012spin:
incl %eax
cmpl (%ecx),%edx
- je .L011spin
+ je .L012spin
.long 529567888
ret
-.L010nospin:
+.L011nospin:
xorl %eax,%eax
xorl %edx,%edx
ret
@@ -214,10 +226,10 @@ OPENSSL_wipe_cpu:
leal OPENSSL_ia32cap_P,%ecx
movl (%ecx),%ecx
btl $1,(%ecx)
- jnc .L012no_x87
+ jnc .L013no_x87
andl $83886080,%ecx
cmpl $83886080,%ecx
- jne .L013no_sse2
+ jne .L014no_sse2
pxor %xmm0,%xmm0
pxor %xmm1,%xmm1
pxor %xmm2,%xmm2
@@ -226,9 +238,9 @@ OPENSSL_wipe_cpu:
pxor %xmm5,%xmm5
pxor %xmm6,%xmm6
pxor %xmm7,%xmm7
-.L013no_sse2:
+.L014no_sse2:
.long 4007259865,4007259865,4007259865,4007259865,2430851995
-.L012no_x87:
+.L013no_x87:
leal 4(%esp),%eax
ret
.size OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin
@@ -242,11 +254,11 @@ OPENSSL_atomic_add:
pushl %ebx
nop
movl (%edx),%eax
-.L014spin:
+.L015spin:
leal (%eax,%ecx,1),%ebx
nop
.long 447811568
- jne .L014spin
+ jne .L015spin
movl %ebx,%eax
popl %ebx
ret
@@ -287,32 +299,32 @@ OPENSSL_cleanse:
movl 8(%esp),%ecx
xorl %eax,%eax
cmpl $7,%ecx
- jae .L015lot
+ jae .L016lot
cmpl $0,%ecx
- je .L016ret
-.L017little:
+ je .L017ret
+.L018little:
movb %al,(%edx)
subl $1,%ecx
leal 1(%edx),%edx
- jnz .L017little
-.L016ret:
+ jnz .L018little
+.L017ret:
ret
.align 16
-.L015lot:
+.L016lot:
testl $3,%edx
- jz .L018aligned
+ jz .L019aligned
movb %al,(%edx)
leal -1(%ecx),%ecx
leal 1(%edx),%edx
- jmp .L015lot
-.L018aligned:
+ jmp .L016lot
+.L019aligned:
movl %eax,(%edx)
leal -4(%ecx),%ecx
testl $-4,%ecx
leal 4(%edx),%edx
- jnz .L018aligned
+ jnz .L019aligned
cmpl $0,%ecx
- jne .L017little
+ jne .L018little
ret
.size OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin
.globl OPENSSL_ia32_rdrand
@@ -321,15 +333,32 @@ OPENSSL_cleanse:
OPENSSL_ia32_rdrand:
.L_OPENSSL_ia32_rdrand_begin:
movl $8,%ecx
-.L019loop:
+.L020loop:
.byte 15,199,240
- jc .L020break
- loop .L019loop
-.L020break:
+ jc .L021break
+ loop .L020loop
+.L021break:
cmpl $0,%eax
cmovel %ecx,%eax
ret
.size OPENSSL_ia32_rdrand,.-.L_OPENSSL_ia32_rdrand_begin
-.comm OPENSSL_ia32cap_P,8,4
+.globl OPENSSL_ia32_rdseed
+.type OPENSSL_ia32_rdseed,@function
+.align 16
+OPENSSL_ia32_rdseed:
+.L_OPENSSL_ia32_rdseed_begin:
+ movl $8,%ecx
+.L022loop:
+.byte 15,199,248
+ jc .L023break
+ loop .L022loop
+.L023break:
+ cmpl $0,%eax
+ cmovel %ecx,%eax
+ ret
+.size OPENSSL_ia32_rdseed,.-.L_OPENSSL_ia32_rdseed_begin
+.hidden OPENSSL_cpuid_setup
+.hidden OPENSSL_ia32cap_P
+.comm OPENSSL_ia32cap_P,16,4
.section .init
call OPENSSL_cpuid_setup
OpenPOWER on IntegriCloud