+! Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved.
+!
+! Licensed under the OpenSSL license (the "License"). You may not use
+! this file except in compliance with the License. You can obtain a copy
+! in the file LICENSE in the source distribution or at
+! https://www.openssl.org/source/license.html
+
+#ifdef OPENSSL_FIPSCANISTER
+#include <openssl/fipssyms.h>
+#endif
+
#if defined(__SUNPRO_C) && defined(__sparcv9)
# define ABI64 /* They've said -xarch=v9 at command line */
#elif defined(__GNUC__) && defined(__arch64__)
fmovs %f1,%f3
fmovs %f0,%f2
- add %fp,BIAS,%i0 ! return pointer to caller´s top of stack
+ add %fp,BIAS,%i0 ! return pointer to caller´s top of stack
ret
restore
ba .enter
nop
#ifdef __sun
-! Note that you don't have to link with libthread to call thr_yield,
+! Note that you do not have to link with libthread to call thr_yield,
! as libc provides a stub, which is overloaded the moment you link
! with *either* libpthread or libthread...
#define YIELD_CPU thr_yield
xor %o0,%o0,%o0
.word 0x91410000 !rd %tick,%o0
retl
- .word 0x93323020 !srlx %o2,32,%o1
+ .word 0x93323020 !srlx %o0,32,%o1
.notick:
retl
xor %o1,%o1,%o1
.type _sparcv9_rdtick,#function
.size _sparcv9_rdtick,.-_sparcv9_rdtick
+.global _sparcv9_vis1_probe
+.align 8
+_sparcv9_vis1_probe:
+ add %sp,BIAS+2,%o1
+ .word 0xc19a5a40 !ldda [%o1]ASI_FP16_P,%f0
+ retl
+ .word 0x81b00d80 !fxor %f0,%f0,%f0
+.type _sparcv9_vis1_probe,#function
+.size _sparcv9_vis1_probe,.-_sparcv9_vis1_probe
+
+! Probe and instrument VIS1 instruction. Output is number of cycles it
+! takes to execute rdtick and pair of VIS1 instructions. US-Tx VIS unit
+! is slow (documented to be 6 cycles on T2) and the core is in-order
+! single-issue, it should be possible to distinguish Tx reliably...
+! Observed return values are:
+!
+! UltraSPARC IIe 7
+! UltraSPARC III 7
+! UltraSPARC T1 24
+! SPARC T4 65(*)
+!
+! (*) result has lesser to do with VIS instruction latencies, rdtick
+! appears that slow, but it does the trick in sense that FP and
+! VIS code paths are still slower than integer-only ones.
+!
+! Numbers for T2 and SPARC64 V-VII are more than welcomed.
+!
+! It would be possible to detect specifically US-T1 by instrumenting
+! fmul8ulx16, which is emulated on T1 and as such accounts for quite
+! a lot of %tick-s, couple of thousand on Linux...
+.global _sparcv9_vis1_instrument
+.align 8
+_sparcv9_vis1_instrument:
+ .word 0x81b00d80 !fxor %f0,%f0,%f0
+ .word 0x85b08d82 !fxor %f2,%f2,%f2
+ .word 0x91410000 !rd %tick,%o0
+ .word 0x81b00d80 !fxor %f0,%f0,%f0
+ .word 0x85b08d82 !fxor %f2,%f2,%f2
+ .word 0x93410000 !rd %tick,%o1
+ .word 0x81b00d80 !fxor %f0,%f0,%f0
+ .word 0x85b08d82 !fxor %f2,%f2,%f2
+ .word 0x95410000 !rd %tick,%o2
+ .word 0x81b00d80 !fxor %f0,%f0,%f0
+ .word 0x85b08d82 !fxor %f2,%f2,%f2
+ .word 0x97410000 !rd %tick,%o3
+ .word 0x81b00d80 !fxor %f0,%f0,%f0
+ .word 0x85b08d82 !fxor %f2,%f2,%f2
+ .word 0x99410000 !rd %tick,%o4
+
+ ! calculate intervals
+ sub %o1,%o0,%o0
+ sub %o2,%o1,%o1
+ sub %o3,%o2,%o2
+ sub %o4,%o3,%o3
+
+ ! find minimum value
+ cmp %o0,%o1
+ .word 0x38680002 !bgu,a %xcc,.+8
+ mov %o1,%o0
+ cmp %o0,%o2
+ .word 0x38680002 !bgu,a %xcc,.+8
+ mov %o2,%o0
+ cmp %o0,%o3
+ .word 0x38680002 !bgu,a %xcc,.+8
+ mov %o3,%o0
+
+ retl
+ nop
+.type _sparcv9_vis1_instrument,#function
+.size _sparcv9_vis1_instrument,.-_sparcv9_vis1_instrument
+
+.global _sparcv9_vis2_probe
+.align 8
+_sparcv9_vis2_probe:
+ retl
+ .word 0x81b00980 !bshuffle %f0,%f0,%f0
+.type _sparcv9_vis2_probe,#function
+.size _sparcv9_vis2_probe,.-_sparcv9_vis2_probe
+
+.global _sparcv9_fmadd_probe
+.align 8
+_sparcv9_fmadd_probe:
+ .word 0x81b00d80 !fxor %f0,%f0,%f0
+ .word 0x85b08d82 !fxor %f2,%f2,%f2
+ retl
+ .word 0x81b80440 !fmaddd %f0,%f0,%f2,%f0
+.type _sparcv9_fmadd_probe,#function
+.size _sparcv9_fmadd_probe,.-_sparcv9_fmadd_probe
+
+.global _sparcv9_rdcfr
+.align 8
+_sparcv9_rdcfr:
+ retl
+ .word 0x91468000 !rd %asr26,%o0
+.type _sparcv9_rdcfr,#function
+.size _sparcv9_rdcfr,.-_sparcv9_rdcfr
+
+.global _sparcv9_vis3_probe
+.align 8
+_sparcv9_vis3_probe:
+ retl
+ .word 0x81b022a0 !xmulx %g0,%g0,%g0
+.type _sparcv9_vis3_probe,#function
+.size _sparcv9_vis3_probe,.-_sparcv9_vis3_probe
+
+.global _sparcv9_random
+.align 8
+_sparcv9_random:
+ retl
+ .word 0x91b002a0 !random %o0
+.type _sparcv9_random,#function
+.size _sparcv9_random,.-_sparcv9_vis3_probe
+
+.global _sparcv9_fjaesx_probe
+.align 8
+_sparcv9_fjaesx_probe:
+ .word 0x81b09206 !faesencx %f2,%f6,%f0
+ retl
+ nop
+.size _sparcv9_fjaesx_probe,.-_sparcv9_fjaesx_probe
+
.global OPENSSL_cleanse
.align 32
OPENSSL_cleanse:
#else
bgu .Lot
#endif
+ cmp %o1,0
+ bne .Little
+ nop
+ retl
nop
.Little:
.type OPENSSL_cleanse,#function
.size OPENSSL_cleanse,.-OPENSSL_cleanse
+.global CRYPTO_memcmp
+.align 16
+CRYPTO_memcmp:
+ cmp %o2,0
+#ifdef ABI64
+ beq,pn %xcc,.Lno_data
+#else
+ beq .Lno_data
+#endif
+ xor %g1,%g1,%g1
+ nop
+
+.Loop_cmp:
+ ldub [%o0],%o3
+ add %o0,1,%o0
+ ldub [%o1],%o4
+ add %o1,1,%o1
+ subcc %o2,1,%o2
+ xor %o3,%o4,%o4
+#ifdef ABI64
+ bnz %xcc,.Loop_cmp
+#else
+ bnz .Loop_cmp
+#endif
+ or %o4,%g1,%g1
+
+ sub %g0,%g1,%g1
+ srl %g1,31,%g1
+.Lno_data:
+ retl
+ mov %g1,%o0
+.type CRYPTO_memcmp,#function
+.size CRYPTO_memcmp,.-CRYPTO_memcmp
+
+.global _sparcv9_vis1_instrument_bus
+.align 8
+_sparcv9_vis1_instrument_bus:
+ mov %o1,%o3 ! save cnt
+ .word 0x99410000 !rd %tick,%o4 ! tick
+ mov %o4,%o5 ! lasttick = tick
+ set 0,%g4 ! diff
+
+ andn %o0,63,%g1
+ .word 0xc1985e00 !ldda [%g1]0xf0,%f0 ! block load
+ .word 0x8143e040 !membar #Sync
+ .word 0xc1b85c00 !stda %f0,[%g1]0xe0 ! block store and commit
+ .word 0x8143e040 !membar #Sync
+ ld [%o0],%o4
+ add %o4,%g4,%g4
+ .word 0xc9e2100c !cas [%o0],%o4,%g4
+
+.Loop: .word 0x99410000 !rd %tick,%o4
+ sub %o4,%o5,%g4 ! diff=tick-lasttick
+ mov %o4,%o5 ! lasttick=tick
+
+ andn %o0,63,%g1
+ .word 0xc1985e00 !ldda [%g1]0xf0,%f0 ! block load
+ .word 0x8143e040 !membar #Sync
+ .word 0xc1b85c00 !stda %f0,[%g1]0xe0 ! block store and commit
+ .word 0x8143e040 !membar #Sync
+ ld [%o0],%o4
+ add %o4,%g4,%g4
+ .word 0xc9e2100c !cas [%o0],%o4,%g4
+ subcc %o1,1,%o1 ! --$cnt
+ bnz .Loop
+ add %o0,4,%o0 ! ++$out
+
+ retl
+ mov %o3,%o0
+.type _sparcv9_vis1_instrument_bus,#function
+.size _sparcv9_vis1_instrument_bus,.-_sparcv9_vis1_instrument_bus
+
+.global _sparcv9_vis1_instrument_bus2
+.align 8
+_sparcv9_vis1_instrument_bus2:
+ mov %o1,%o3 ! save cnt
+ sll %o1,2,%o1 ! cnt*=4
+
+ .word 0x99410000 !rd %tick,%o4 ! tick
+ mov %o4,%o5 ! lasttick = tick
+ set 0,%g4 ! diff
+
+ andn %o0,63,%g1
+ .word 0xc1985e00 !ldda [%g1]0xf0,%f0 ! block load
+ .word 0x8143e040 !membar #Sync
+ .word 0xc1b85c00 !stda %f0,[%g1]0xe0 ! block store and commit
+ .word 0x8143e040 !membar #Sync
+ ld [%o0],%o4
+ add %o4,%g4,%g4
+ .word 0xc9e2100c !cas [%o0],%o4,%g4
+
+ .word 0x99410000 !rd %tick,%o4 ! tick
+ sub %o4,%o5,%g4 ! diff=tick-lasttick
+ mov %o4,%o5 ! lasttick=tick
+ mov %g4,%g5 ! lastdiff=diff
+.Loop2:
+ andn %o0,63,%g1
+ .word 0xc1985e00 !ldda [%g1]0xf0,%f0 ! block load
+ .word 0x8143e040 !membar #Sync
+ .word 0xc1b85c00 !stda %f0,[%g1]0xe0 ! block store and commit
+ .word 0x8143e040 !membar #Sync
+ ld [%o0],%o4
+ add %o4,%g4,%g4
+ .word 0xc9e2100c !cas [%o0],%o4,%g4
+
+ subcc %o2,1,%o2 ! --max
+ bz .Ldone2
+ nop
+
+ .word 0x99410000 !rd %tick,%o4 ! tick
+ sub %o4,%o5,%g4 ! diff=tick-lasttick
+ mov %o4,%o5 ! lasttick=tick
+ cmp %g4,%g5
+ mov %g4,%g5 ! lastdiff=diff
+
+ .word 0x83408000 !rd %ccr,%g1
+ and %g1,4,%g1 ! isolate zero flag
+ xor %g1,4,%g1 ! flip zero flag
+
+ subcc %o1,%g1,%o1 ! conditional --$cnt
+ bnz .Loop2
+ add %o0,%g1,%o0 ! conditional ++$out
+
+.Ldone2:
+ srl %o1,2,%o1
+ retl
+ sub %o3,%o1,%o0
+.type _sparcv9_vis1_instrument_bus2,#function
+.size _sparcv9_vis1_instrument_bus2,.-_sparcv9_vis1_instrument_bus2
+
.section ".init",#alloc,#execinstr
call OPENSSL_cpuid_setup
nop