mirror of
https://github.com/openssl/openssl.git
synced 2024-12-03 05:41:46 +08:00
32be631ca1
If one of the perlasm xlate drivers crashes, OpenSSL's build will currently swallow the error and silently truncate the output to however far the driver got. This will hopefully fail to build, but better to check such things. Handle this by checking for errors when closing STDOUT (which is a pipe to the xlate driver). Reviewed-by: Richard Levitte <levitte@openssl.org> Reviewed-by: Tim Hudson <tjh@openssl.org> Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org> (Merged from https://github.com/openssl/openssl/pull/10883)
288 lines
5.3 KiB
Perl
288 lines
5.3 KiB
Perl
#! /usr/bin/env perl
|
|
# Copyright 2012-2016 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";
|