1e1051a39Sopenharmony_ci! Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. 2e1051a39Sopenharmony_ci! 3e1051a39Sopenharmony_ci! Licensed under the Apache License 2.0 (the "License"). You may not use 4e1051a39Sopenharmony_ci! this file except in compliance with the License. You can obtain a copy 5e1051a39Sopenharmony_ci! in the file LICENSE in the source distribution or at 6e1051a39Sopenharmony_ci! https://www.openssl.org/source/license.html 7e1051a39Sopenharmony_ci 8e1051a39Sopenharmony_ci#if defined(__SUNPRO_C) && defined(__sparcv9) 9e1051a39Sopenharmony_ci# define ABI64 /* They've said -xarch=v9 at command line */ 10e1051a39Sopenharmony_ci#elif defined(__GNUC__) && defined(__arch64__) 11e1051a39Sopenharmony_ci# define ABI64 /* They've said -m64 at command line */ 12e1051a39Sopenharmony_ci#endif 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_ci#ifdef ABI64 15e1051a39Sopenharmony_ci .register %g2,#scratch 16e1051a39Sopenharmony_ci .register %g3,#scratch 17e1051a39Sopenharmony_ci# define FRAME -192 18e1051a39Sopenharmony_ci# define BIAS 2047 19e1051a39Sopenharmony_ci#else 20e1051a39Sopenharmony_ci# define FRAME -96 21e1051a39Sopenharmony_ci# define BIAS 0 22e1051a39Sopenharmony_ci#endif 23e1051a39Sopenharmony_ci 24e1051a39Sopenharmony_ci.text 25e1051a39Sopenharmony_ci.align 32 26e1051a39Sopenharmony_ci.global OPENSSL_wipe_cpu 27e1051a39Sopenharmony_ci.type OPENSSL_wipe_cpu,#function 28e1051a39Sopenharmony_ci! Keep in mind that this does not excuse us from wiping the stack! 29e1051a39Sopenharmony_ci! This routine wipes registers, but not the backing store [which 30e1051a39Sopenharmony_ci! resides on the stack, toward lower addresses]. To facilitate for 31e1051a39Sopenharmony_ci! stack wiping I return pointer to the top of stack of the *caller*. 32e1051a39Sopenharmony_ciOPENSSL_wipe_cpu: 33e1051a39Sopenharmony_ci save %sp,FRAME,%sp 34e1051a39Sopenharmony_ci nop 35e1051a39Sopenharmony_ci#ifdef __sun 36e1051a39Sopenharmony_ci#include <sys/trap.h> 37e1051a39Sopenharmony_ci ta ST_CLEAN_WINDOWS 38e1051a39Sopenharmony_ci#else 39e1051a39Sopenharmony_ci call .walk.reg.wins 40e1051a39Sopenharmony_ci#endif 41e1051a39Sopenharmony_ci nop 42e1051a39Sopenharmony_ci call .PIC.zero.up 43e1051a39Sopenharmony_ci mov .zero-(.-4),%o0 44e1051a39Sopenharmony_ci ld [%o0],%f0 45e1051a39Sopenharmony_ci ld [%o0],%f1 46e1051a39Sopenharmony_ci 47e1051a39Sopenharmony_ci subcc %g0,1,%o0 48e1051a39Sopenharmony_ci ! Following is V9 "rd %ccr,%o0" instruction. However! V8 49e1051a39Sopenharmony_ci ! specification says that it ("rd %asr2,%o0" in V8 terms) does 50e1051a39Sopenharmony_ci ! not cause illegal_instruction trap. It therefore can be used 51e1051a39Sopenharmony_ci ! to determine if the CPU the code is executing on is V8- or 52e1051a39Sopenharmony_ci ! V9-compliant, as V9 returns a distinct value of 0x99, 53e1051a39Sopenharmony_ci ! "negative" and "borrow" bits set in both %icc and %xcc. 54e1051a39Sopenharmony_ci .word 0x91408000 !rd %ccr,%o0 55e1051a39Sopenharmony_ci cmp %o0,0x99 56e1051a39Sopenharmony_ci bne .v8 57e1051a39Sopenharmony_ci nop 58e1051a39Sopenharmony_ci ! Even though we do not use %fp register bank, 59e1051a39Sopenharmony_ci ! we wipe it as memcpy might have used it... 60e1051a39Sopenharmony_ci .word 0xbfa00040 !fmovd %f0,%f62 61e1051a39Sopenharmony_ci .word 0xbba00040 !... 62e1051a39Sopenharmony_ci .word 0xb7a00040 63e1051a39Sopenharmony_ci .word 0xb3a00040 64e1051a39Sopenharmony_ci .word 0xafa00040 65e1051a39Sopenharmony_ci .word 0xaba00040 66e1051a39Sopenharmony_ci .word 0xa7a00040 67e1051a39Sopenharmony_ci .word 0xa3a00040 68e1051a39Sopenharmony_ci .word 0x9fa00040 69e1051a39Sopenharmony_ci .word 0x9ba00040 70e1051a39Sopenharmony_ci .word 0x97a00040 71e1051a39Sopenharmony_ci .word 0x93a00040 72e1051a39Sopenharmony_ci .word 0x8fa00040 73e1051a39Sopenharmony_ci .word 0x8ba00040 74e1051a39Sopenharmony_ci .word 0x87a00040 75e1051a39Sopenharmony_ci .word 0x83a00040 !fmovd %f0,%f32 76e1051a39Sopenharmony_ci.v8: fmovs %f1,%f31 77e1051a39Sopenharmony_ci clr %o0 78e1051a39Sopenharmony_ci fmovs %f0,%f30 79e1051a39Sopenharmony_ci clr %o1 80e1051a39Sopenharmony_ci fmovs %f1,%f29 81e1051a39Sopenharmony_ci clr %o2 82e1051a39Sopenharmony_ci fmovs %f0,%f28 83e1051a39Sopenharmony_ci clr %o3 84e1051a39Sopenharmony_ci fmovs %f1,%f27 85e1051a39Sopenharmony_ci clr %o4 86e1051a39Sopenharmony_ci fmovs %f0,%f26 87e1051a39Sopenharmony_ci clr %o5 88e1051a39Sopenharmony_ci fmovs %f1,%f25 89e1051a39Sopenharmony_ci clr %o7 90e1051a39Sopenharmony_ci fmovs %f0,%f24 91e1051a39Sopenharmony_ci clr %l0 92e1051a39Sopenharmony_ci fmovs %f1,%f23 93e1051a39Sopenharmony_ci clr %l1 94e1051a39Sopenharmony_ci fmovs %f0,%f22 95e1051a39Sopenharmony_ci clr %l2 96e1051a39Sopenharmony_ci fmovs %f1,%f21 97e1051a39Sopenharmony_ci clr %l3 98e1051a39Sopenharmony_ci fmovs %f0,%f20 99e1051a39Sopenharmony_ci clr %l4 100e1051a39Sopenharmony_ci fmovs %f1,%f19 101e1051a39Sopenharmony_ci clr %l5 102e1051a39Sopenharmony_ci fmovs %f0,%f18 103e1051a39Sopenharmony_ci clr %l6 104e1051a39Sopenharmony_ci fmovs %f1,%f17 105e1051a39Sopenharmony_ci clr %l7 106e1051a39Sopenharmony_ci fmovs %f0,%f16 107e1051a39Sopenharmony_ci clr %i0 108e1051a39Sopenharmony_ci fmovs %f1,%f15 109e1051a39Sopenharmony_ci clr %i1 110e1051a39Sopenharmony_ci fmovs %f0,%f14 111e1051a39Sopenharmony_ci clr %i2 112e1051a39Sopenharmony_ci fmovs %f1,%f13 113e1051a39Sopenharmony_ci clr %i3 114e1051a39Sopenharmony_ci fmovs %f0,%f12 115e1051a39Sopenharmony_ci clr %i4 116e1051a39Sopenharmony_ci fmovs %f1,%f11 117e1051a39Sopenharmony_ci clr %i5 118e1051a39Sopenharmony_ci fmovs %f0,%f10 119e1051a39Sopenharmony_ci clr %g1 120e1051a39Sopenharmony_ci fmovs %f1,%f9 121e1051a39Sopenharmony_ci clr %g2 122e1051a39Sopenharmony_ci fmovs %f0,%f8 123e1051a39Sopenharmony_ci clr %g3 124e1051a39Sopenharmony_ci fmovs %f1,%f7 125e1051a39Sopenharmony_ci clr %g4 126e1051a39Sopenharmony_ci fmovs %f0,%f6 127e1051a39Sopenharmony_ci clr %g5 128e1051a39Sopenharmony_ci fmovs %f1,%f5 129e1051a39Sopenharmony_ci fmovs %f0,%f4 130e1051a39Sopenharmony_ci fmovs %f1,%f3 131e1051a39Sopenharmony_ci fmovs %f0,%f2 132e1051a39Sopenharmony_ci 133e1051a39Sopenharmony_ci add %fp,BIAS,%i0 ! return pointer to caller´s top of stack 134e1051a39Sopenharmony_ci 135e1051a39Sopenharmony_ci ret 136e1051a39Sopenharmony_ci restore 137e1051a39Sopenharmony_ci 138e1051a39Sopenharmony_ci.zero: .long 0x0,0x0 139e1051a39Sopenharmony_ci.PIC.zero.up: 140e1051a39Sopenharmony_ci retl 141e1051a39Sopenharmony_ci add %o0,%o7,%o0 142e1051a39Sopenharmony_ci#ifdef DEBUG 143e1051a39Sopenharmony_ci.global walk_reg_wins 144e1051a39Sopenharmony_ci.type walk_reg_wins,#function 145e1051a39Sopenharmony_ciwalk_reg_wins: 146e1051a39Sopenharmony_ci#endif 147e1051a39Sopenharmony_ci.walk.reg.wins: 148e1051a39Sopenharmony_ci save %sp,FRAME,%sp 149e1051a39Sopenharmony_ci cmp %i7,%o7 150e1051a39Sopenharmony_ci be 2f 151e1051a39Sopenharmony_ci clr %o0 152e1051a39Sopenharmony_ci cmp %o7,0 ! compiler never cleans %o7... 153e1051a39Sopenharmony_ci be 1f ! could have been a leaf function... 154e1051a39Sopenharmony_ci clr %o1 155e1051a39Sopenharmony_ci call .walk.reg.wins 156e1051a39Sopenharmony_ci nop 157e1051a39Sopenharmony_ci1: clr %o2 158e1051a39Sopenharmony_ci clr %o3 159e1051a39Sopenharmony_ci clr %o4 160e1051a39Sopenharmony_ci clr %o5 161e1051a39Sopenharmony_ci clr %o7 162e1051a39Sopenharmony_ci clr %l0 163e1051a39Sopenharmony_ci clr %l1 164e1051a39Sopenharmony_ci clr %l2 165e1051a39Sopenharmony_ci clr %l3 166e1051a39Sopenharmony_ci clr %l4 167e1051a39Sopenharmony_ci clr %l5 168e1051a39Sopenharmony_ci clr %l6 169e1051a39Sopenharmony_ci clr %l7 170e1051a39Sopenharmony_ci add %o0,1,%i0 ! used for debugging 171e1051a39Sopenharmony_ci2: ret 172e1051a39Sopenharmony_ci restore 173e1051a39Sopenharmony_ci.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu 174e1051a39Sopenharmony_ci 175e1051a39Sopenharmony_ci.global OPENSSL_atomic_add 176e1051a39Sopenharmony_ci.type OPENSSL_atomic_add,#function 177e1051a39Sopenharmony_ci.align 32 178e1051a39Sopenharmony_ciOPENSSL_atomic_add: 179e1051a39Sopenharmony_ci#ifndef ABI64 180e1051a39Sopenharmony_ci subcc %g0,1,%o2 181e1051a39Sopenharmony_ci .word 0x95408000 !rd %ccr,%o2, see comment above 182e1051a39Sopenharmony_ci cmp %o2,0x99 183e1051a39Sopenharmony_ci be .v9 184e1051a39Sopenharmony_ci nop 185e1051a39Sopenharmony_ci save %sp,FRAME,%sp 186e1051a39Sopenharmony_ci ba .enter 187e1051a39Sopenharmony_ci nop 188e1051a39Sopenharmony_ci#ifdef __sun 189e1051a39Sopenharmony_ci! Note that you do not have to link with libthread to call thr_yield, 190e1051a39Sopenharmony_ci! as libc provides a stub, which is overloaded the moment you link 191e1051a39Sopenharmony_ci! with *either* libpthread or libthread... 192e1051a39Sopenharmony_ci#define YIELD_CPU thr_yield 193e1051a39Sopenharmony_ci#else 194e1051a39Sopenharmony_ci! applies at least to Linux and FreeBSD... Feedback expected... 195e1051a39Sopenharmony_ci#define YIELD_CPU sched_yield 196e1051a39Sopenharmony_ci#endif 197e1051a39Sopenharmony_ci.spin: call YIELD_CPU 198e1051a39Sopenharmony_ci nop 199e1051a39Sopenharmony_ci.enter: ld [%i0],%i2 200e1051a39Sopenharmony_ci cmp %i2,-4096 201e1051a39Sopenharmony_ci be .spin 202e1051a39Sopenharmony_ci mov -1,%i2 203e1051a39Sopenharmony_ci swap [%i0],%i2 204e1051a39Sopenharmony_ci cmp %i2,-1 205e1051a39Sopenharmony_ci be .spin 206e1051a39Sopenharmony_ci add %i2,%i1,%i2 207e1051a39Sopenharmony_ci stbar 208e1051a39Sopenharmony_ci st %i2,[%i0] 209e1051a39Sopenharmony_ci sra %i2,%g0,%i0 210e1051a39Sopenharmony_ci ret 211e1051a39Sopenharmony_ci restore 212e1051a39Sopenharmony_ci.v9: 213e1051a39Sopenharmony_ci#endif 214e1051a39Sopenharmony_ci ld [%o0],%o2 215e1051a39Sopenharmony_ci1: add %o1,%o2,%o3 216e1051a39Sopenharmony_ci .word 0xd7e2100a !cas [%o0],%o2,%o3, compare [%o0] with %o2 and swap %o3 217e1051a39Sopenharmony_ci cmp %o2,%o3 218e1051a39Sopenharmony_ci bne 1b 219e1051a39Sopenharmony_ci mov %o3,%o2 ! cas is always fetching to dest. register 220e1051a39Sopenharmony_ci add %o1,%o2,%o0 ! OpenSSL expects the new value 221e1051a39Sopenharmony_ci retl 222e1051a39Sopenharmony_ci sra %o0,%g0,%o0 ! we return signed int, remember? 223e1051a39Sopenharmony_ci.size OPENSSL_atomic_add,.-OPENSSL_atomic_add 224e1051a39Sopenharmony_ci 225e1051a39Sopenharmony_ci.global _sparcv9_rdtick 226e1051a39Sopenharmony_ci.align 32 227e1051a39Sopenharmony_ci_sparcv9_rdtick: 228e1051a39Sopenharmony_ci subcc %g0,1,%o0 229e1051a39Sopenharmony_ci .word 0x91408000 !rd %ccr,%o0 230e1051a39Sopenharmony_ci cmp %o0,0x99 231e1051a39Sopenharmony_ci bne .notick 232e1051a39Sopenharmony_ci xor %o0,%o0,%o0 233e1051a39Sopenharmony_ci .word 0x91410000 !rd %tick,%o0 234e1051a39Sopenharmony_ci retl 235e1051a39Sopenharmony_ci .word 0x93323020 !srlx %o0,32,%o1 236e1051a39Sopenharmony_ci.notick: 237e1051a39Sopenharmony_ci retl 238e1051a39Sopenharmony_ci xor %o1,%o1,%o1 239e1051a39Sopenharmony_ci.type _sparcv9_rdtick,#function 240e1051a39Sopenharmony_ci.size _sparcv9_rdtick,.-_sparcv9_rdtick 241e1051a39Sopenharmony_ci 242e1051a39Sopenharmony_ci.global _sparcv9_vis1_probe 243e1051a39Sopenharmony_ci.align 8 244e1051a39Sopenharmony_ci_sparcv9_vis1_probe: 245e1051a39Sopenharmony_ci add %sp,BIAS+2,%o1 246e1051a39Sopenharmony_ci .word 0xc19a5a40 !ldda [%o1]ASI_FP16_P,%f0 247e1051a39Sopenharmony_ci retl 248e1051a39Sopenharmony_ci .word 0x81b00d80 !fxor %f0,%f0,%f0 249e1051a39Sopenharmony_ci.type _sparcv9_vis1_probe,#function 250e1051a39Sopenharmony_ci.size _sparcv9_vis1_probe,.-_sparcv9_vis1_probe 251e1051a39Sopenharmony_ci 252e1051a39Sopenharmony_ci! Probe and instrument VIS1 instruction. Output is number of cycles it 253e1051a39Sopenharmony_ci! takes to execute rdtick and pair of VIS1 instructions. US-Tx VIS unit 254e1051a39Sopenharmony_ci! is slow (documented to be 6 cycles on T2) and the core is in-order 255e1051a39Sopenharmony_ci! single-issue, it should be possible to distinguish Tx reliably... 256e1051a39Sopenharmony_ci! Observed return values are: 257e1051a39Sopenharmony_ci! 258e1051a39Sopenharmony_ci! UltraSPARC IIe 7 259e1051a39Sopenharmony_ci! UltraSPARC III 7 260e1051a39Sopenharmony_ci! UltraSPARC T1 24 261e1051a39Sopenharmony_ci! SPARC T4 65(*) 262e1051a39Sopenharmony_ci! 263e1051a39Sopenharmony_ci! (*) result has lesser to do with VIS instruction latencies, rdtick 264e1051a39Sopenharmony_ci! appears that slow, but it does the trick in sense that FP and 265e1051a39Sopenharmony_ci! VIS code paths are still slower than integer-only ones. 266e1051a39Sopenharmony_ci! 267e1051a39Sopenharmony_ci! Numbers for T2 and SPARC64 V-VII are more than welcomed. 268e1051a39Sopenharmony_ci! 269e1051a39Sopenharmony_ci! It would be possible to detect specifically US-T1 by instrumenting 270e1051a39Sopenharmony_ci! fmul8ulx16, which is emulated on T1 and as such accounts for quite 271e1051a39Sopenharmony_ci! a lot of %tick-s, couple of thousand on Linux... 272e1051a39Sopenharmony_ci.global _sparcv9_vis1_instrument 273e1051a39Sopenharmony_ci.align 8 274e1051a39Sopenharmony_ci_sparcv9_vis1_instrument: 275e1051a39Sopenharmony_ci .word 0x81b00d80 !fxor %f0,%f0,%f0 276e1051a39Sopenharmony_ci .word 0x85b08d82 !fxor %f2,%f2,%f2 277e1051a39Sopenharmony_ci .word 0x91410000 !rd %tick,%o0 278e1051a39Sopenharmony_ci .word 0x81b00d80 !fxor %f0,%f0,%f0 279e1051a39Sopenharmony_ci .word 0x85b08d82 !fxor %f2,%f2,%f2 280e1051a39Sopenharmony_ci .word 0x93410000 !rd %tick,%o1 281e1051a39Sopenharmony_ci .word 0x81b00d80 !fxor %f0,%f0,%f0 282e1051a39Sopenharmony_ci .word 0x85b08d82 !fxor %f2,%f2,%f2 283e1051a39Sopenharmony_ci .word 0x95410000 !rd %tick,%o2 284e1051a39Sopenharmony_ci .word 0x81b00d80 !fxor %f0,%f0,%f0 285e1051a39Sopenharmony_ci .word 0x85b08d82 !fxor %f2,%f2,%f2 286e1051a39Sopenharmony_ci .word 0x97410000 !rd %tick,%o3 287e1051a39Sopenharmony_ci .word 0x81b00d80 !fxor %f0,%f0,%f0 288e1051a39Sopenharmony_ci .word 0x85b08d82 !fxor %f2,%f2,%f2 289e1051a39Sopenharmony_ci .word 0x99410000 !rd %tick,%o4 290e1051a39Sopenharmony_ci 291e1051a39Sopenharmony_ci ! calculate intervals 292e1051a39Sopenharmony_ci sub %o1,%o0,%o0 293e1051a39Sopenharmony_ci sub %o2,%o1,%o1 294e1051a39Sopenharmony_ci sub %o3,%o2,%o2 295e1051a39Sopenharmony_ci sub %o4,%o3,%o3 296e1051a39Sopenharmony_ci 297e1051a39Sopenharmony_ci ! find minimum value 298e1051a39Sopenharmony_ci cmp %o0,%o1 299e1051a39Sopenharmony_ci .word 0x38680002 !bgu,a %xcc,.+8 300e1051a39Sopenharmony_ci mov %o1,%o0 301e1051a39Sopenharmony_ci cmp %o0,%o2 302e1051a39Sopenharmony_ci .word 0x38680002 !bgu,a %xcc,.+8 303e1051a39Sopenharmony_ci mov %o2,%o0 304e1051a39Sopenharmony_ci cmp %o0,%o3 305e1051a39Sopenharmony_ci .word 0x38680002 !bgu,a %xcc,.+8 306e1051a39Sopenharmony_ci mov %o3,%o0 307e1051a39Sopenharmony_ci 308e1051a39Sopenharmony_ci retl 309e1051a39Sopenharmony_ci nop 310e1051a39Sopenharmony_ci.type _sparcv9_vis1_instrument,#function 311e1051a39Sopenharmony_ci.size _sparcv9_vis1_instrument,.-_sparcv9_vis1_instrument 312e1051a39Sopenharmony_ci 313e1051a39Sopenharmony_ci.global _sparcv9_vis2_probe 314e1051a39Sopenharmony_ci.align 8 315e1051a39Sopenharmony_ci_sparcv9_vis2_probe: 316e1051a39Sopenharmony_ci retl 317e1051a39Sopenharmony_ci .word 0x81b00980 !bshuffle %f0,%f0,%f0 318e1051a39Sopenharmony_ci.type _sparcv9_vis2_probe,#function 319e1051a39Sopenharmony_ci.size _sparcv9_vis2_probe,.-_sparcv9_vis2_probe 320e1051a39Sopenharmony_ci 321e1051a39Sopenharmony_ci.global _sparcv9_fmadd_probe 322e1051a39Sopenharmony_ci.align 8 323e1051a39Sopenharmony_ci_sparcv9_fmadd_probe: 324e1051a39Sopenharmony_ci .word 0x81b00d80 !fxor %f0,%f0,%f0 325e1051a39Sopenharmony_ci .word 0x85b08d82 !fxor %f2,%f2,%f2 326e1051a39Sopenharmony_ci retl 327e1051a39Sopenharmony_ci .word 0x81b80440 !fmaddd %f0,%f0,%f2,%f0 328e1051a39Sopenharmony_ci.type _sparcv9_fmadd_probe,#function 329e1051a39Sopenharmony_ci.size _sparcv9_fmadd_probe,.-_sparcv9_fmadd_probe 330e1051a39Sopenharmony_ci 331e1051a39Sopenharmony_ci.global _sparcv9_rdcfr 332e1051a39Sopenharmony_ci.align 8 333e1051a39Sopenharmony_ci_sparcv9_rdcfr: 334e1051a39Sopenharmony_ci retl 335e1051a39Sopenharmony_ci .word 0x91468000 !rd %asr26,%o0 336e1051a39Sopenharmony_ci.type _sparcv9_rdcfr,#function 337e1051a39Sopenharmony_ci.size _sparcv9_rdcfr,.-_sparcv9_rdcfr 338e1051a39Sopenharmony_ci 339e1051a39Sopenharmony_ci.global _sparcv9_vis3_probe 340e1051a39Sopenharmony_ci.align 8 341e1051a39Sopenharmony_ci_sparcv9_vis3_probe: 342e1051a39Sopenharmony_ci retl 343e1051a39Sopenharmony_ci .word 0x81b022a0 !xmulx %g0,%g0,%g0 344e1051a39Sopenharmony_ci.type _sparcv9_vis3_probe,#function 345e1051a39Sopenharmony_ci.size _sparcv9_vis3_probe,.-_sparcv9_vis3_probe 346e1051a39Sopenharmony_ci 347e1051a39Sopenharmony_ci.global _sparcv9_random 348e1051a39Sopenharmony_ci.align 8 349e1051a39Sopenharmony_ci_sparcv9_random: 350e1051a39Sopenharmony_ci retl 351e1051a39Sopenharmony_ci .word 0x91b002a0 !random %o0 352e1051a39Sopenharmony_ci.type _sparcv9_random,#function 353e1051a39Sopenharmony_ci.size _sparcv9_random,.-_sparcv9_vis3_probe 354e1051a39Sopenharmony_ci 355e1051a39Sopenharmony_ci.global _sparcv9_fjaesx_probe 356e1051a39Sopenharmony_ci.align 8 357e1051a39Sopenharmony_ci_sparcv9_fjaesx_probe: 358e1051a39Sopenharmony_ci .word 0x81b09206 !faesencx %f2,%f6,%f0 359e1051a39Sopenharmony_ci retl 360e1051a39Sopenharmony_ci nop 361e1051a39Sopenharmony_ci.size _sparcv9_fjaesx_probe,.-_sparcv9_fjaesx_probe 362e1051a39Sopenharmony_ci 363e1051a39Sopenharmony_ci.global OPENSSL_cleanse 364e1051a39Sopenharmony_ci.align 32 365e1051a39Sopenharmony_ciOPENSSL_cleanse: 366e1051a39Sopenharmony_ci cmp %o1,14 367e1051a39Sopenharmony_ci nop 368e1051a39Sopenharmony_ci#ifdef ABI64 369e1051a39Sopenharmony_ci bgu %xcc,.Lot 370e1051a39Sopenharmony_ci#else 371e1051a39Sopenharmony_ci bgu .Lot 372e1051a39Sopenharmony_ci#endif 373e1051a39Sopenharmony_ci cmp %o1,0 374e1051a39Sopenharmony_ci bne .Little 375e1051a39Sopenharmony_ci nop 376e1051a39Sopenharmony_ci retl 377e1051a39Sopenharmony_ci nop 378e1051a39Sopenharmony_ci 379e1051a39Sopenharmony_ci.Little: 380e1051a39Sopenharmony_ci stb %g0,[%o0] 381e1051a39Sopenharmony_ci subcc %o1,1,%o1 382e1051a39Sopenharmony_ci bnz .Little 383e1051a39Sopenharmony_ci add %o0,1,%o0 384e1051a39Sopenharmony_ci retl 385e1051a39Sopenharmony_ci nop 386e1051a39Sopenharmony_ci.align 32 387e1051a39Sopenharmony_ci.Lot: 388e1051a39Sopenharmony_ci#ifndef ABI64 389e1051a39Sopenharmony_ci subcc %g0,1,%g1 390e1051a39Sopenharmony_ci ! see above for explanation 391e1051a39Sopenharmony_ci .word 0x83408000 !rd %ccr,%g1 392e1051a39Sopenharmony_ci cmp %g1,0x99 393e1051a39Sopenharmony_ci bne .v8lot 394e1051a39Sopenharmony_ci nop 395e1051a39Sopenharmony_ci#endif 396e1051a39Sopenharmony_ci 397e1051a39Sopenharmony_ci.v9lot: andcc %o0,7,%g0 398e1051a39Sopenharmony_ci bz .v9aligned 399e1051a39Sopenharmony_ci nop 400e1051a39Sopenharmony_ci stb %g0,[%o0] 401e1051a39Sopenharmony_ci sub %o1,1,%o1 402e1051a39Sopenharmony_ci ba .v9lot 403e1051a39Sopenharmony_ci add %o0,1,%o0 404e1051a39Sopenharmony_ci.align 16,0x01000000 405e1051a39Sopenharmony_ci.v9aligned: 406e1051a39Sopenharmony_ci .word 0xc0720000 !stx %g0,[%o0] 407e1051a39Sopenharmony_ci sub %o1,8,%o1 408e1051a39Sopenharmony_ci andcc %o1,-8,%g0 409e1051a39Sopenharmony_ci#ifdef ABI64 410e1051a39Sopenharmony_ci .word 0x126ffffd !bnz %xcc,.v9aligned 411e1051a39Sopenharmony_ci#else 412e1051a39Sopenharmony_ci .word 0x124ffffd !bnz %icc,.v9aligned 413e1051a39Sopenharmony_ci#endif 414e1051a39Sopenharmony_ci add %o0,8,%o0 415e1051a39Sopenharmony_ci 416e1051a39Sopenharmony_ci cmp %o1,0 417e1051a39Sopenharmony_ci bne .Little 418e1051a39Sopenharmony_ci nop 419e1051a39Sopenharmony_ci retl 420e1051a39Sopenharmony_ci nop 421e1051a39Sopenharmony_ci#ifndef ABI64 422e1051a39Sopenharmony_ci.v8lot: andcc %o0,3,%g0 423e1051a39Sopenharmony_ci bz .v8aligned 424e1051a39Sopenharmony_ci nop 425e1051a39Sopenharmony_ci stb %g0,[%o0] 426e1051a39Sopenharmony_ci sub %o1,1,%o1 427e1051a39Sopenharmony_ci ba .v8lot 428e1051a39Sopenharmony_ci add %o0,1,%o0 429e1051a39Sopenharmony_ci nop 430e1051a39Sopenharmony_ci.v8aligned: 431e1051a39Sopenharmony_ci st %g0,[%o0] 432e1051a39Sopenharmony_ci sub %o1,4,%o1 433e1051a39Sopenharmony_ci andcc %o1,-4,%g0 434e1051a39Sopenharmony_ci bnz .v8aligned 435e1051a39Sopenharmony_ci add %o0,4,%o0 436e1051a39Sopenharmony_ci 437e1051a39Sopenharmony_ci cmp %o1,0 438e1051a39Sopenharmony_ci bne .Little 439e1051a39Sopenharmony_ci nop 440e1051a39Sopenharmony_ci retl 441e1051a39Sopenharmony_ci nop 442e1051a39Sopenharmony_ci#endif 443e1051a39Sopenharmony_ci.type OPENSSL_cleanse,#function 444e1051a39Sopenharmony_ci.size OPENSSL_cleanse,.-OPENSSL_cleanse 445e1051a39Sopenharmony_ci 446e1051a39Sopenharmony_ci.global CRYPTO_memcmp 447e1051a39Sopenharmony_ci.align 16 448e1051a39Sopenharmony_ciCRYPTO_memcmp: 449e1051a39Sopenharmony_ci cmp %o2,0 450e1051a39Sopenharmony_ci#ifdef ABI64 451e1051a39Sopenharmony_ci beq,pn %xcc,.Lno_data 452e1051a39Sopenharmony_ci#else 453e1051a39Sopenharmony_ci beq .Lno_data 454e1051a39Sopenharmony_ci#endif 455e1051a39Sopenharmony_ci xor %g1,%g1,%g1 456e1051a39Sopenharmony_ci nop 457e1051a39Sopenharmony_ci 458e1051a39Sopenharmony_ci.Loop_cmp: 459e1051a39Sopenharmony_ci ldub [%o0],%o3 460e1051a39Sopenharmony_ci add %o0,1,%o0 461e1051a39Sopenharmony_ci ldub [%o1],%o4 462e1051a39Sopenharmony_ci add %o1,1,%o1 463e1051a39Sopenharmony_ci subcc %o2,1,%o2 464e1051a39Sopenharmony_ci xor %o3,%o4,%o4 465e1051a39Sopenharmony_ci#ifdef ABI64 466e1051a39Sopenharmony_ci bnz %xcc,.Loop_cmp 467e1051a39Sopenharmony_ci#else 468e1051a39Sopenharmony_ci bnz .Loop_cmp 469e1051a39Sopenharmony_ci#endif 470e1051a39Sopenharmony_ci or %o4,%g1,%g1 471e1051a39Sopenharmony_ci 472e1051a39Sopenharmony_ci sub %g0,%g1,%g1 473e1051a39Sopenharmony_ci srl %g1,31,%g1 474e1051a39Sopenharmony_ci.Lno_data: 475e1051a39Sopenharmony_ci retl 476e1051a39Sopenharmony_ci mov %g1,%o0 477e1051a39Sopenharmony_ci.type CRYPTO_memcmp,#function 478e1051a39Sopenharmony_ci.size CRYPTO_memcmp,.-CRYPTO_memcmp 479e1051a39Sopenharmony_ci 480e1051a39Sopenharmony_ci.global _sparcv9_vis1_instrument_bus 481e1051a39Sopenharmony_ci.align 8 482e1051a39Sopenharmony_ci_sparcv9_vis1_instrument_bus: 483e1051a39Sopenharmony_ci mov %o1,%o3 ! save cnt 484e1051a39Sopenharmony_ci .word 0x99410000 !rd %tick,%o4 ! tick 485e1051a39Sopenharmony_ci mov %o4,%o5 ! lasttick = tick 486e1051a39Sopenharmony_ci set 0,%g4 ! diff 487e1051a39Sopenharmony_ci 488e1051a39Sopenharmony_ci andn %o0,63,%g1 489e1051a39Sopenharmony_ci .word 0xc1985e00 !ldda [%g1]0xf0,%f0 ! block load 490e1051a39Sopenharmony_ci .word 0x8143e040 !membar #Sync 491e1051a39Sopenharmony_ci .word 0xc1b85c00 !stda %f0,[%g1]0xe0 ! block store and commit 492e1051a39Sopenharmony_ci .word 0x8143e040 !membar #Sync 493e1051a39Sopenharmony_ci ld [%o0],%o4 494e1051a39Sopenharmony_ci add %o4,%g4,%g4 495e1051a39Sopenharmony_ci .word 0xc9e2100c !cas [%o0],%o4,%g4 496e1051a39Sopenharmony_ci 497e1051a39Sopenharmony_ci.Loop: .word 0x99410000 !rd %tick,%o4 498e1051a39Sopenharmony_ci sub %o4,%o5,%g4 ! diff=tick-lasttick 499e1051a39Sopenharmony_ci mov %o4,%o5 ! lasttick=tick 500e1051a39Sopenharmony_ci 501e1051a39Sopenharmony_ci andn %o0,63,%g1 502e1051a39Sopenharmony_ci .word 0xc1985e00 !ldda [%g1]0xf0,%f0 ! block load 503e1051a39Sopenharmony_ci .word 0x8143e040 !membar #Sync 504e1051a39Sopenharmony_ci .word 0xc1b85c00 !stda %f0,[%g1]0xe0 ! block store and commit 505e1051a39Sopenharmony_ci .word 0x8143e040 !membar #Sync 506e1051a39Sopenharmony_ci ld [%o0],%o4 507e1051a39Sopenharmony_ci add %o4,%g4,%g4 508e1051a39Sopenharmony_ci .word 0xc9e2100c !cas [%o0],%o4,%g4 509e1051a39Sopenharmony_ci subcc %o1,1,%o1 ! --$cnt 510e1051a39Sopenharmony_ci bnz .Loop 511e1051a39Sopenharmony_ci add %o0,4,%o0 ! ++$out 512e1051a39Sopenharmony_ci 513e1051a39Sopenharmony_ci retl 514e1051a39Sopenharmony_ci mov %o3,%o0 515e1051a39Sopenharmony_ci.type _sparcv9_vis1_instrument_bus,#function 516e1051a39Sopenharmony_ci.size _sparcv9_vis1_instrument_bus,.-_sparcv9_vis1_instrument_bus 517e1051a39Sopenharmony_ci 518e1051a39Sopenharmony_ci.global _sparcv9_vis1_instrument_bus2 519e1051a39Sopenharmony_ci.align 8 520e1051a39Sopenharmony_ci_sparcv9_vis1_instrument_bus2: 521e1051a39Sopenharmony_ci mov %o1,%o3 ! save cnt 522e1051a39Sopenharmony_ci sll %o1,2,%o1 ! cnt*=4 523e1051a39Sopenharmony_ci 524e1051a39Sopenharmony_ci .word 0x99410000 !rd %tick,%o4 ! tick 525e1051a39Sopenharmony_ci mov %o4,%o5 ! lasttick = tick 526e1051a39Sopenharmony_ci set 0,%g4 ! diff 527e1051a39Sopenharmony_ci 528e1051a39Sopenharmony_ci andn %o0,63,%g1 529e1051a39Sopenharmony_ci .word 0xc1985e00 !ldda [%g1]0xf0,%f0 ! block load 530e1051a39Sopenharmony_ci .word 0x8143e040 !membar #Sync 531e1051a39Sopenharmony_ci .word 0xc1b85c00 !stda %f0,[%g1]0xe0 ! block store and commit 532e1051a39Sopenharmony_ci .word 0x8143e040 !membar #Sync 533e1051a39Sopenharmony_ci ld [%o0],%o4 534e1051a39Sopenharmony_ci add %o4,%g4,%g4 535e1051a39Sopenharmony_ci .word 0xc9e2100c !cas [%o0],%o4,%g4 536e1051a39Sopenharmony_ci 537e1051a39Sopenharmony_ci .word 0x99410000 !rd %tick,%o4 ! tick 538e1051a39Sopenharmony_ci sub %o4,%o5,%g4 ! diff=tick-lasttick 539e1051a39Sopenharmony_ci mov %o4,%o5 ! lasttick=tick 540e1051a39Sopenharmony_ci mov %g4,%g5 ! lastdiff=diff 541e1051a39Sopenharmony_ci.Loop2: 542e1051a39Sopenharmony_ci andn %o0,63,%g1 543e1051a39Sopenharmony_ci .word 0xc1985e00 !ldda [%g1]0xf0,%f0 ! block load 544e1051a39Sopenharmony_ci .word 0x8143e040 !membar #Sync 545e1051a39Sopenharmony_ci .word 0xc1b85c00 !stda %f0,[%g1]0xe0 ! block store and commit 546e1051a39Sopenharmony_ci .word 0x8143e040 !membar #Sync 547e1051a39Sopenharmony_ci ld [%o0],%o4 548e1051a39Sopenharmony_ci add %o4,%g4,%g4 549e1051a39Sopenharmony_ci .word 0xc9e2100c !cas [%o0],%o4,%g4 550e1051a39Sopenharmony_ci 551e1051a39Sopenharmony_ci subcc %o2,1,%o2 ! --max 552e1051a39Sopenharmony_ci bz .Ldone2 553e1051a39Sopenharmony_ci nop 554e1051a39Sopenharmony_ci 555e1051a39Sopenharmony_ci .word 0x99410000 !rd %tick,%o4 ! tick 556e1051a39Sopenharmony_ci sub %o4,%o5,%g4 ! diff=tick-lasttick 557e1051a39Sopenharmony_ci mov %o4,%o5 ! lasttick=tick 558e1051a39Sopenharmony_ci cmp %g4,%g5 559e1051a39Sopenharmony_ci mov %g4,%g5 ! lastdiff=diff 560e1051a39Sopenharmony_ci 561e1051a39Sopenharmony_ci .word 0x83408000 !rd %ccr,%g1 562e1051a39Sopenharmony_ci and %g1,4,%g1 ! isolate zero flag 563e1051a39Sopenharmony_ci xor %g1,4,%g1 ! flip zero flag 564e1051a39Sopenharmony_ci 565e1051a39Sopenharmony_ci subcc %o1,%g1,%o1 ! conditional --$cnt 566e1051a39Sopenharmony_ci bnz .Loop2 567e1051a39Sopenharmony_ci add %o0,%g1,%o0 ! conditional ++$out 568e1051a39Sopenharmony_ci 569e1051a39Sopenharmony_ci.Ldone2: 570e1051a39Sopenharmony_ci srl %o1,2,%o1 571e1051a39Sopenharmony_ci retl 572e1051a39Sopenharmony_ci sub %o3,%o1,%o0 573e1051a39Sopenharmony_ci.type _sparcv9_vis1_instrument_bus2,#function 574e1051a39Sopenharmony_ci.size _sparcv9_vis1_instrument_bus2,.-_sparcv9_vis1_instrument_bus2 575e1051a39Sopenharmony_ci 576e1051a39Sopenharmony_ci.section ".init",#alloc,#execinstr 577e1051a39Sopenharmony_ci call OPENSSL_cpuid_setup 578e1051a39Sopenharmony_ci nop 579