Home | History | Annotate | Line # | Download | only in crypto
      1 #! /usr/bin/env perl
      2 # Copyright 2012-2020 The OpenSSL Project Authors. All Rights Reserved.
      3 #
      4 # Licensed under the Apache License 2.0 (the "License").  You may not use
      5 # this file except in compliance with the License.  You can obtain a copy
      6 # in the file LICENSE in the source distribution or at
      7 # https://www.openssl.org/source/license.html
      8 
      9 while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
     10 open STDOUT,">$output";
     11 
     12 $code.=<<___;
     13 	.text
     14 
     15 	.if	.ASSEMBLER_VERSION<7000000
     16 	.asg	0,__TI_EABI__
     17 	.endif
     18 	.if	__TI_EABI__
     19 	.asg	OPENSSL_rdtsc,_OPENSSL_rdtsc
     20 	.asg	OPENSSL_cleanse,_OPENSSL_cleanse
     21 	.asg	CRYPTO_memcmp,_CRYPTO_memcmp
     22 	.asg	OPENSSL_atomic_add,_OPENSSL_atomic_add
     23 	.asg	OPENSSL_wipe_cpu,_OPENSSL_wipe_cpu
     24 	.asg	OPENSSL_instrument_bus,_OPENSSL_instrument_bus
     25 	.asg	OPENSSL_instrument_bus2,_OPENSSL_instrument_bus2
     26 	.endif
     27 
     28 	.asg	B3,RA
     29 
     30 	.global	_OPENSSL_rdtsc
     31 _OPENSSL_rdtsc:
     32 	.asmfunc
     33 	B	RA
     34 	MVC	TSCL,B0
     35 	MVC	TSCH,B1
     36   [!B0]	MVC	B0,TSCL		; start TSC
     37 	MV	B0,A4
     38 	MV	B1,A5
     39 	.endasmfunc
     40 
     41 	.global	_OPENSSL_cleanse
     42 _OPENSSL_cleanse:
     43 	.asmfunc
     44 	ZERO	A3:A2
     45 ||	ZERO	B2
     46 ||	SHRU	B4,3,B0		; is length >= 8
     47 ||	ADD	1,A4,B6
     48   [!B0]	BNOP	RA
     49 ||	ZERO	A1
     50 ||	ZERO	B1
     51    [B0]	MVC	B0,ILC
     52 ||[!B0]	CMPLT	0,B4,A1
     53 ||[!B0]	CMPLT	1,B4,B1
     54    [A1]	STB	A2,*A4++[2]
     55 || [B1] STB	B2,*B6++[2]
     56 ||[!B0]	CMPLT	2,B4,A1
     57 ||[!B0]	CMPLT	3,B4,B1
     58    [A1]	STB	A2,*A4++[2]
     59 || [B1] STB	B2,*B6++[2]
     60 ||[!B0]	CMPLT	4,B4,A1
     61 ||[!B0]	CMPLT	5,B4,B1
     62    [A1]	STB	A2,*A4++[2]
     63 || [B1] STB	B2,*B6++[2]
     64 ||[!B0]	CMPLT	6,B4,A1
     65    [A1]	STB	A2,*A4++[2]
     66 
     67 	SPLOOP	1
     68 	STNDW	A3:A2,*A4++
     69 ||	SUB	B4,8,B4
     70 	SPKERNEL
     71 
     72 	MV	B4,B0		; remaining bytes
     73 ||	ADD	1,A4,B6
     74 ||	BNOP	RA
     75    [B0]	CMPLT	0,B0,A1
     76 || [B0]	CMPLT	1,B0,B1
     77    [A1]	STB	A2,*A4++[2]
     78 || [B1] STB	B2,*B6++[2]
     79 || [B0]	CMPLT	2,B0,A1
     80 || [B0]	CMPLT	3,B0,B1
     81    [A1]	STB	A2,*A4++[2]
     82 || [B1] STB	B2,*B6++[2]
     83 || [B0]	CMPLT	4,B0,A1
     84 || [B0]	CMPLT	5,B0,B1
     85    [A1]	STB	A2,*A4++[2]
     86 || [B1] STB	B2,*B6++[2]
     87 || [B0]	CMPLT	6,B0,A1
     88    [A1]	STB	A2,*A4++[2]
     89 	.endasmfunc
     90 
     91 	.global	_CRYPTO_memcmp
     92 _CRYPTO_memcmp:
     93 	.asmfunc
     94 	MV	A6,B0
     95   [!B0]	BNOP	RA
     96 ||[!B0]	ZERO	A4
     97    [B0]	MVC	B0,ILC
     98 || [B0]	ZERO	A0
     99 	NOP	4
    100 
    101 	SPLOOP	1
    102 	LDBU	*A4++,A1
    103 ||	LDBU	*B4++,B1
    104 	NOP	4
    105 	XOR.L	B1,A1,A2
    106 	SPKERNEL 1,0
    107 ||	OR.S	A2,A0,A0
    108 
    109 	BNOP	RA,3
    110 	ZERO.L	A4
    111   [A0]	MVK	1,A4
    112 	.endasmfunc
    113 
    114 	.global	_OPENSSL_atomic_add
    115 _OPENSSL_atomic_add:
    116 	.asmfunc
    117 	MV	A4,B0
    118 atomic_add?:
    119 	LL	*B0,B5
    120 	NOP	4
    121 	ADD	B4,B5,B5
    122 	SL	B5,*B0
    123 	CMTL	*B0,B1
    124 	NOP	4
    125   [!B1]	B	atomic_add?
    126    [B1]	BNOP	RA,4
    127 	MV	B5,A4
    128 	.endasmfunc
    129 
    130 	.global	_OPENSSL_wipe_cpu
    131 _OPENSSL_wipe_cpu:
    132 	.asmfunc
    133 	ZERO	A0
    134 ||	ZERO	B0
    135 ||	ZERO	A1
    136 ||	ZERO	B1
    137 	ZERO	A3:A2
    138 ||	MVD	B0,B2
    139 ||	ZERO	A4
    140 ||	ZERO	B4
    141 ||	ZERO	A5
    142 ||	ZERO	B5
    143 ||	BNOP	RA
    144 	ZERO	A7:A6
    145 ||	ZERO	B7:B6
    146 ||	ZERO	A8
    147 ||	ZERO	B8
    148 ||	ZERO	A9
    149 ||	ZERO	B9
    150 	ZERO	A17:A16
    151 ||	ZERO	B17:B16
    152 ||	ZERO	A18
    153 ||	ZERO	B18
    154 ||	ZERO	A19
    155 ||	ZERO	B19
    156 	ZERO	A21:A20
    157 ||	ZERO	B21:B20
    158 ||	ZERO	A22
    159 ||	ZERO	B22
    160 ||	ZERO	A23
    161 ||	ZERO	B23
    162 	ZERO	A25:A24
    163 ||	ZERO	B25:B24
    164 ||	ZERO	A26
    165 ||	ZERO	B26
    166 ||	ZERO	A27
    167 ||	ZERO	B27
    168 	ZERO	A29:A28
    169 ||	ZERO	B29:B28
    170 ||	ZERO	A30
    171 ||	ZERO	B30
    172 ||	ZERO	A31
    173 ||	ZERO	B31
    174 	.endasmfunc
    175 
    176 CLFLUSH	.macro	CONTROL,ADDR,LEN
    177 	B	passthrough?
    178 ||	STW	ADDR,*CONTROL[0]
    179 	STW	LEN,*CONTROL[1]
    180 spinlock?:
    181 	LDW	*CONTROL[1],A0
    182 	NOP	3
    183 passthrough?:
    184 	NOP
    185   [A0]	BNOP	spinlock?,5
    186 	.endm
    187 
    188 	.global	_OPENSSL_instrument_bus
    189 _OPENSSL_instrument_bus:
    190 	.asmfunc
    191 	MV	B4,B0			; reassign sizeof(output)
    192 ||	MV	A4,B4			; reassign output
    193 ||	MVK	0x00004030,A3
    194 	MV	B0,A4			; return value
    195 ||	MVK	1,A1
    196 ||	MVKH	0x01840000,A3		; L1DWIBAR
    197 	MVC	TSCL,B8			; collect 1st tick
    198 ||	MVK	0x00004010,A5
    199 	MV	B8,B9			; lasttick = tick
    200 ||	MVK	0,B7			; lastdiff = 0
    201 ||	MVKH	0x01840000,A5		; L2WIBAR
    202 	CLFLUSH	A3,B4,A1		; write-back and invalidate L1D line
    203 	CLFLUSH	A5,B4,A1		; write-back and invalidate L2 line
    204 	LL	*B4,B5
    205 	NOP	4
    206 	ADD	B7,B5,B5
    207 	SL	B5,*B4
    208 	CMTL	*B4,B1
    209 	NOP	4
    210 	STW	B5,*B4
    211 bus_loop1?:
    212 	MVC	TSCL,B8
    213 || [B0]	SUB	B0,1,B0
    214 	SUB	B8,B9,B7		; lastdiff = tick - lasttick
    215 ||	MV	B8,B9			; lasttick = tick
    216 	CLFLUSH	A3,B4,A1		; write-back and invalidate L1D line
    217 	CLFLUSH	A5,B4,A1		; write-back and invalidate L2 line
    218 	LL	*B4,B5
    219 	NOP	4
    220 	ADD	B7,B5,B5
    221 	SL	B5,*B4
    222 	CMTL	*B4,B1
    223 	STW	B5,*B4			; [!B1] is removed to flatten samples
    224 ||	ADDK	4,B4
    225 || [B0]	BNOP	bus_loop1?,5
    226 
    227 	BNOP	RA,5
    228 	.endasmfunc
    229 
    230 	.global	_OPENSSL_instrument_bus2
    231 _OPENSSL_instrument_bus2:
    232 	.asmfunc
    233 	MV	A6,B0			; reassign max
    234 ||	MV	B4,A6			; reassign sizeof(output)
    235 ||	MVK	0x00004030,A3
    236 	MV	A4,B4			; reassign output
    237 ||	MVK	0,A4			; return value
    238 ||	MVK	1,A1
    239 ||	MVKH	0x01840000,A3		; L1DWIBAR
    240 
    241 	MVC	TSCL,B8			; collect 1st tick
    242 ||	MVK	0x00004010,A5
    243 	MV	B8,B9			; lasttick = tick
    244 ||	MVK	0,B7			; lastdiff = 0
    245 ||	MVKH	0x01840000,A5		; L2WIBAR
    246 	CLFLUSH	A3,B4,A1		; write-back and invalidate L1D line
    247 	CLFLUSH	A5,B4,A1		; write-back and invalidate L2 line
    248 	LL	*B4,B5
    249 	NOP	4
    250 	ADD	B7,B5,B5
    251 	SL	B5,*B4
    252 	CMTL	*B4,B1
    253 	NOP	4
    254 	STW	B5,*B4
    255 
    256 	MVC	TSCL,B8			; collect 1st diff
    257 	SUB	B8,B9,B7		; lastdiff = tick - lasttick
    258 ||	MV	B8,B9			; lasttick = tick
    259 ||	SUB	B0,1,B0
    260 bus_loop2?:
    261 	CLFLUSH	A3,B4,A1		; write-back and invalidate L1D line
    262 	CLFLUSH	A5,B4,A1		; write-back and invalidate L2 line
    263 	LL	*B4,B5
    264 	NOP	4
    265 	ADD	B7,B5,B5
    266 	SL	B5,*B4
    267 	CMTL	*B4,B1
    268 	STW	B5,*B4			; [!B1] is removed to flatten samples
    269 ||[!B0]	BNOP	bus_loop2_done?,2
    270 ||	SUB	B0,1,B0
    271 	MVC	TSCL,B8
    272 	SUB	B8,B9,B8
    273 ||	MV	B8,B9
    274 	CMPEQ	B8,B7,B2
    275 ||	MV	B8,B7
    276   [!B2]	ADDAW	B4,1,B4
    277 ||[!B2]	ADDK	1,A4
    278 	CMPEQ	A4,A6,A2
    279   [!A2]	BNOP	bus_loop2?,5
    280 
    281 bus_loop2_done?:
    282 	BNOP	RA,5
    283 	.endasmfunc
    284 ___
    285 
    286 print $code;
    287 close STDOUT or die "error closing STDOUT: $!";
    288