288 lines
5.3 KiB
Perl
288 lines
5.3 KiB
Perl
|
#! /usr/bin/env perl
|
||
|
# Copyright 2012-2020 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
|
||
|
|
||
|
while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
|
||
|
open STDOUT,">$output";
|
||
|
|
||
|
$code.=<<___;
|
||
|
.text
|
||
|
|
||
|
.if .ASSEMBLER_VERSION<7000000
|
||
|
.asg 0,__TI_EABI__
|
||
|
.endif
|
||
|
.if __TI_EABI__
|
||
|
.asg OPENSSL_rdtsc,_OPENSSL_rdtsc
|
||
|
.asg OPENSSL_cleanse,_OPENSSL_cleanse
|
||
|
.asg CRYPTO_memcmp,_CRYPTO_memcmp
|
||
|
.asg OPENSSL_atomic_add,_OPENSSL_atomic_add
|
||
|
.asg OPENSSL_wipe_cpu,_OPENSSL_wipe_cpu
|
||
|
.asg OPENSSL_instrument_bus,_OPENSSL_instrument_bus
|
||
|
.asg OPENSSL_instrument_bus2,_OPENSSL_instrument_bus2
|
||
|
.endif
|
||
|
|
||
|
.asg B3,RA
|
||
|
|
||
|
.global _OPENSSL_rdtsc
|
||
|
_OPENSSL_rdtsc:
|
||
|
.asmfunc
|
||
|
B RA
|
||
|
MVC TSCL,B0
|
||
|
MVC TSCH,B1
|
||
|
[!B0] MVC B0,TSCL ; start TSC
|
||
|
MV B0,A4
|
||
|
MV B1,A5
|
||
|
.endasmfunc
|
||
|
|
||
|
.global _OPENSSL_cleanse
|
||
|
_OPENSSL_cleanse:
|
||
|
.asmfunc
|
||
|
ZERO A3:A2
|
||
|
|| ZERO B2
|
||
|
|| SHRU B4,3,B0 ; is length >= 8
|
||
|
|| ADD 1,A4,B6
|
||
|
[!B0] BNOP RA
|
||
|
|| ZERO A1
|
||
|
|| ZERO B1
|
||
|
[B0] MVC B0,ILC
|
||
|
||[!B0] CMPLT 0,B4,A1
|
||
|
||[!B0] CMPLT 1,B4,B1
|
||
|
[A1] STB A2,*A4++[2]
|
||
|
|| [B1] STB B2,*B6++[2]
|
||
|
||[!B0] CMPLT 2,B4,A1
|
||
|
||[!B0] CMPLT 3,B4,B1
|
||
|
[A1] STB A2,*A4++[2]
|
||
|
|| [B1] STB B2,*B6++[2]
|
||
|
||[!B0] CMPLT 4,B4,A1
|
||
|
||[!B0] CMPLT 5,B4,B1
|
||
|
[A1] STB A2,*A4++[2]
|
||
|
|| [B1] STB B2,*B6++[2]
|
||
|
||[!B0] CMPLT 6,B4,A1
|
||
|
[A1] STB A2,*A4++[2]
|
||
|
|
||
|
SPLOOP 1
|
||
|
STNDW A3:A2,*A4++
|
||
|
|| SUB B4,8,B4
|
||
|
SPKERNEL
|
||
|
|
||
|
MV B4,B0 ; remaining bytes
|
||
|
|| ADD 1,A4,B6
|
||
|
|| BNOP RA
|
||
|
[B0] CMPLT 0,B0,A1
|
||
|
|| [B0] CMPLT 1,B0,B1
|
||
|
[A1] STB A2,*A4++[2]
|
||
|
|| [B1] STB B2,*B6++[2]
|
||
|
|| [B0] CMPLT 2,B0,A1
|
||
|
|| [B0] CMPLT 3,B0,B1
|
||
|
[A1] STB A2,*A4++[2]
|
||
|
|| [B1] STB B2,*B6++[2]
|
||
|
|| [B0] CMPLT 4,B0,A1
|
||
|
|| [B0] CMPLT 5,B0,B1
|
||
|
[A1] STB A2,*A4++[2]
|
||
|
|| [B1] STB B2,*B6++[2]
|
||
|
|| [B0] CMPLT 6,B0,A1
|
||
|
[A1] STB A2,*A4++[2]
|
||
|
.endasmfunc
|
||
|
|
||
|
.global _CRYPTO_memcmp
|
||
|
_CRYPTO_memcmp:
|
||
|
.asmfunc
|
||
|
MV A6,B0
|
||
|
[!B0] BNOP RA
|
||
|
||[!B0] ZERO A4
|
||
|
[B0] MVC B0,ILC
|
||
|
|| [B0] ZERO A0
|
||
|
NOP 4
|
||
|
|
||
|
SPLOOP 1
|
||
|
LDBU *A4++,A1
|
||
|
|| LDBU *B4++,B1
|
||
|
NOP 4
|
||
|
XOR.L B1,A1,A2
|
||
|
SPKERNEL 1,0
|
||
|
|| OR.S A2,A0,A0
|
||
|
|
||
|
BNOP RA,3
|
||
|
ZERO.L A4
|
||
|
[A0] MVK 1,A4
|
||
|
.endasmfunc
|
||
|
|
||
|
.global _OPENSSL_atomic_add
|
||
|
_OPENSSL_atomic_add:
|
||
|
.asmfunc
|
||
|
MV A4,B0
|
||
|
atomic_add?:
|
||
|
LL *B0,B5
|
||
|
NOP 4
|
||
|
ADD B4,B5,B5
|
||
|
SL B5,*B0
|
||
|
CMTL *B0,B1
|
||
|
NOP 4
|
||
|
[!B1] B atomic_add?
|
||
|
[B1] BNOP RA,4
|
||
|
MV B5,A4
|
||
|
.endasmfunc
|
||
|
|
||
|
.global _OPENSSL_wipe_cpu
|
||
|
_OPENSSL_wipe_cpu:
|
||
|
.asmfunc
|
||
|
ZERO A0
|
||
|
|| ZERO B0
|
||
|
|| ZERO A1
|
||
|
|| ZERO B1
|
||
|
ZERO A3:A2
|
||
|
|| MVD B0,B2
|
||
|
|| ZERO A4
|
||
|
|| ZERO B4
|
||
|
|| ZERO A5
|
||
|
|| ZERO B5
|
||
|
|| BNOP RA
|
||
|
ZERO A7:A6
|
||
|
|| ZERO B7:B6
|
||
|
|| ZERO A8
|
||
|
|| ZERO B8
|
||
|
|| ZERO A9
|
||
|
|| ZERO B9
|
||
|
ZERO A17:A16
|
||
|
|| ZERO B17:B16
|
||
|
|| ZERO A18
|
||
|
|| ZERO B18
|
||
|
|| ZERO A19
|
||
|
|| ZERO B19
|
||
|
ZERO A21:A20
|
||
|
|| ZERO B21:B20
|
||
|
|| ZERO A22
|
||
|
|| ZERO B22
|
||
|
|| ZERO A23
|
||
|
|| ZERO B23
|
||
|
ZERO A25:A24
|
||
|
|| ZERO B25:B24
|
||
|
|| ZERO A26
|
||
|
|| ZERO B26
|
||
|
|| ZERO A27
|
||
|
|| ZERO B27
|
||
|
ZERO A29:A28
|
||
|
|| ZERO B29:B28
|
||
|
|| ZERO A30
|
||
|
|| ZERO B30
|
||
|
|| ZERO A31
|
||
|
|| ZERO B31
|
||
|
.endasmfunc
|
||
|
|
||
|
CLFLUSH .macro CONTROL,ADDR,LEN
|
||
|
B passthrough?
|
||
|
|| STW ADDR,*CONTROL[0]
|
||
|
STW LEN,*CONTROL[1]
|
||
|
spinlock?:
|
||
|
LDW *CONTROL[1],A0
|
||
|
NOP 3
|
||
|
passthrough?:
|
||
|
NOP
|
||
|
[A0] BNOP spinlock?,5
|
||
|
.endm
|
||
|
|
||
|
.global _OPENSSL_instrument_bus
|
||
|
_OPENSSL_instrument_bus:
|
||
|
.asmfunc
|
||
|
MV B4,B0 ; reassign sizeof(output)
|
||
|
|| MV A4,B4 ; reassign output
|
||
|
|| MVK 0x00004030,A3
|
||
|
MV B0,A4 ; return value
|
||
|
|| MVK 1,A1
|
||
|
|| MVKH 0x01840000,A3 ; L1DWIBAR
|
||
|
MVC TSCL,B8 ; collect 1st tick
|
||
|
|| MVK 0x00004010,A5
|
||
|
MV B8,B9 ; lasttick = tick
|
||
|
|| MVK 0,B7 ; lastdiff = 0
|
||
|
|| MVKH 0x01840000,A5 ; L2WIBAR
|
||
|
CLFLUSH A3,B4,A1 ; write-back and invalidate L1D line
|
||
|
CLFLUSH A5,B4,A1 ; write-back and invalidate L2 line
|
||
|
LL *B4,B5
|
||
|
NOP 4
|
||
|
ADD B7,B5,B5
|
||
|
SL B5,*B4
|
||
|
CMTL *B4,B1
|
||
|
NOP 4
|
||
|
STW B5,*B4
|
||
|
bus_loop1?:
|
||
|
MVC TSCL,B8
|
||
|
|| [B0] SUB B0,1,B0
|
||
|
SUB B8,B9,B7 ; lastdiff = tick - lasttick
|
||
|
|| MV B8,B9 ; lasttick = tick
|
||
|
CLFLUSH A3,B4,A1 ; write-back and invalidate L1D line
|
||
|
CLFLUSH A5,B4,A1 ; write-back and invalidate L2 line
|
||
|
LL *B4,B5
|
||
|
NOP 4
|
||
|
ADD B7,B5,B5
|
||
|
SL B5,*B4
|
||
|
CMTL *B4,B1
|
||
|
STW B5,*B4 ; [!B1] is removed to flatten samples
|
||
|
|| ADDK 4,B4
|
||
|
|| [B0] BNOP bus_loop1?,5
|
||
|
|
||
|
BNOP RA,5
|
||
|
.endasmfunc
|
||
|
|
||
|
.global _OPENSSL_instrument_bus2
|
||
|
_OPENSSL_instrument_bus2:
|
||
|
.asmfunc
|
||
|
MV A6,B0 ; reassign max
|
||
|
|| MV B4,A6 ; reassign sizeof(output)
|
||
|
|| MVK 0x00004030,A3
|
||
|
MV A4,B4 ; reassign output
|
||
|
|| MVK 0,A4 ; return value
|
||
|
|| MVK 1,A1
|
||
|
|| MVKH 0x01840000,A3 ; L1DWIBAR
|
||
|
|
||
|
MVC TSCL,B8 ; collect 1st tick
|
||
|
|| MVK 0x00004010,A5
|
||
|
MV B8,B9 ; lasttick = tick
|
||
|
|| MVK 0,B7 ; lastdiff = 0
|
||
|
|| MVKH 0x01840000,A5 ; L2WIBAR
|
||
|
CLFLUSH A3,B4,A1 ; write-back and invalidate L1D line
|
||
|
CLFLUSH A5,B4,A1 ; write-back and invalidate L2 line
|
||
|
LL *B4,B5
|
||
|
NOP 4
|
||
|
ADD B7,B5,B5
|
||
|
SL B5,*B4
|
||
|
CMTL *B4,B1
|
||
|
NOP 4
|
||
|
STW B5,*B4
|
||
|
|
||
|
MVC TSCL,B8 ; collect 1st diff
|
||
|
SUB B8,B9,B7 ; lastdiff = tick - lasttick
|
||
|
|| MV B8,B9 ; lasttick = tick
|
||
|
|| SUB B0,1,B0
|
||
|
bus_loop2?:
|
||
|
CLFLUSH A3,B4,A1 ; write-back and invalidate L1D line
|
||
|
CLFLUSH A5,B4,A1 ; write-back and invalidate L2 line
|
||
|
LL *B4,B5
|
||
|
NOP 4
|
||
|
ADD B7,B5,B5
|
||
|
SL B5,*B4
|
||
|
CMTL *B4,B1
|
||
|
STW B5,*B4 ; [!B1] is removed to flatten samples
|
||
|
||[!B0] BNOP bus_loop2_done?,2
|
||
|
|| SUB B0,1,B0
|
||
|
MVC TSCL,B8
|
||
|
SUB B8,B9,B8
|
||
|
|| MV B8,B9
|
||
|
CMPEQ B8,B7,B2
|
||
|
|| MV B8,B7
|
||
|
[!B2] ADDAW B4,1,B4
|
||
|
||[!B2] ADDK 1,A4
|
||
|
CMPEQ A4,A6,A2
|
||
|
[!A2] BNOP bus_loop2?,5
|
||
|
|
||
|
bus_loop2_done?:
|
||
|
BNOP RA,5
|
||
|
.endasmfunc
|
||
|
___
|
||
|
|
||
|
print $code;
|
||
|
close STDOUT or die "error closing STDOUT: $!";
|