#! /usr/bin/env perl # Copyright 2012-2020 The OpenSSL Project Authors. All Rights Reserved. # # Licensed under the Apache License 2.0 (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: $!";