1208599Srdivacky#! /usr/bin/env perl 2208599Srdivacky# Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved. 3208599Srdivacky# 4208599Srdivacky# Licensed under the Apache License 2.0 (the "License"). You may not use 5208599Srdivacky# this file except in compliance with the License. You can obtain a copy 6208599Srdivacky# in the file LICENSE in the source distribution or at 7208599Srdivacky# https://www.openssl.org/source/license.html 8208599Srdivacky 9208599Srdivacky 10208599Srdivacky# $output is the last argument if it looks like a file (it has an extension) 11208599Srdivacky# $flavour is the first argument if it doesn't look like a file 12208599Srdivacky$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; 13208599Srdivacky$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; 14208599Srdivacky 15208599Srdivacky$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 16208599Srdivacky( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or 17208599Srdivacky( $xlate="${dir}perlasm/arm-xlate.pl" and -f $xlate) or 18208599Srdivackydie "can't locate arm-xlate.pl"; 19208599Srdivacky 20208599Srdivackyopen OUT,"| \"$^X\" $xlate $flavour \"$output\"" 21208599Srdivacky or die "can't call $xlate: $!"; 22208599Srdivacky*STDOUT=*OUT; 23208599Srdivacky 24208599Srdivacky$code.=<<___; 25208599Srdivacky#include "arm_arch.h" 26208599Srdivacky 27208599Srdivacky.text 28208599Srdivacky.arch armv8-a+crypto 29208599Srdivacky 30208599Srdivacky.align 5 31208599Srdivacky.globl _armv7_neon_probe 32208599Srdivacky.type _armv7_neon_probe,%function 33212904Sdim_armv7_neon_probe: 34208599Srdivacky orr v15.16b, v15.16b, v15.16b 35208599Srdivacky ret 36208599Srdivacky.size _armv7_neon_probe,.-_armv7_neon_probe 37208599Srdivacky 38208599Srdivacky.globl _armv7_tick 39208599Srdivacky.type _armv7_tick,%function 40208599Srdivacky_armv7_tick: 41208599Srdivacky#ifdef __APPLE__ 42208599Srdivacky mrs x0, CNTPCT_EL0 43208599Srdivacky#else 44208599Srdivacky mrs x0, CNTVCT_EL0 45212904Sdim#endif 46212904Sdim ret 47208599Srdivacky.size _armv7_tick,.-_armv7_tick 48208599Srdivacky 49208599Srdivacky.globl _armv8_aes_probe 50208599Srdivacky.type _armv8_aes_probe,%function 51208599Srdivacky_armv8_aes_probe: 52208599Srdivacky aese v0.16b, v0.16b 53208599Srdivacky ret 54208599Srdivacky.size _armv8_aes_probe,.-_armv8_aes_probe 55208599Srdivacky 56208599Srdivacky.globl _armv8_sha1_probe 57208599Srdivacky.type _armv8_sha1_probe,%function 58208599Srdivacky_armv8_sha1_probe: 59208599Srdivacky sha1h s0, s0 60208599Srdivacky ret 61208599Srdivacky.size _armv8_sha1_probe,.-_armv8_sha1_probe 62208599Srdivacky 63208599Srdivacky.globl _armv8_sha256_probe 64208599Srdivacky.type _armv8_sha256_probe,%function 65208599Srdivacky_armv8_sha256_probe: 66208599Srdivacky sha256su0 v0.4s, v0.4s 67208599Srdivacky ret 68208599Srdivacky.size _armv8_sha256_probe,.-_armv8_sha256_probe 69208599Srdivacky 70208599Srdivacky.globl _armv8_pmull_probe 71208599Srdivacky.type _armv8_pmull_probe,%function 72208599Srdivacky_armv8_pmull_probe: 73208599Srdivacky pmull v0.1q, v0.1d, v0.1d 74208599Srdivacky ret 75208599Srdivacky.size _armv8_pmull_probe,.-_armv8_pmull_probe 76208599Srdivacky 77208599Srdivacky.globl _armv8_sha512_probe 78208599Srdivacky.type _armv8_sha512_probe,%function 79208599Srdivacky_armv8_sha512_probe: 80208599Srdivacky .long 0xcec08000 // sha512su0 v0.2d,v0.2d 81208599Srdivacky ret 82208599Srdivacky.size _armv8_sha512_probe,.-_armv8_sha512_probe 83208599Srdivacky 84208599Srdivacky.globl _armv8_cpuid_probe 85208599Srdivacky.type _armv8_cpuid_probe,%function 86_armv8_cpuid_probe: 87 mrs x0, midr_el1 88 ret 89.size _armv8_cpuid_probe,.-_armv8_cpuid_probe 90 91.globl OPENSSL_cleanse 92.type OPENSSL_cleanse,%function 93.align 5 94OPENSSL_cleanse: 95 cbz x1,.Lret // len==0? 96 cmp x1,#15 97 b.hi .Lot // len>15 98 nop 99.Little: 100 strb wzr,[x0],#1 // store byte-by-byte 101 subs x1,x1,#1 102 b.ne .Little 103.Lret: ret 104 105.align 4 106.Lot: tst x0,#7 107 b.eq .Laligned // inp is aligned 108 strb wzr,[x0],#1 // store byte-by-byte 109 sub x1,x1,#1 110 b .Lot 111 112.align 4 113.Laligned: 114 str xzr,[x0],#8 // store word-by-word 115 sub x1,x1,#8 116 tst x1,#-8 117 b.ne .Laligned // len>=8 118 cbnz x1,.Little // len!=0? 119 ret 120.size OPENSSL_cleanse,.-OPENSSL_cleanse 121 122.globl CRYPTO_memcmp 123.type CRYPTO_memcmp,%function 124.align 4 125CRYPTO_memcmp: 126 eor w3,w3,w3 127 cbz x2,.Lno_data // len==0? 128 cmp x2,#16 129 b.ne .Loop_cmp 130 ldp x8,x9,[x0] 131 ldp x10,x11,[x1] 132 eor x8,x8,x10 133 eor x9,x9,x11 134 orr x8,x8,x9 135 mov x0,#1 136 cmp x8,#0 137 csel x0,xzr,x0,eq 138 ret 139 140.align 4 141.Loop_cmp: 142 ldrb w4,[x0],#1 143 ldrb w5,[x1],#1 144 eor w4,w4,w5 145 orr w3,w3,w4 146 subs x2,x2,#1 147 b.ne .Loop_cmp 148 149.Lno_data: 150 neg w0,w3 151 lsr w0,w0,#31 152 ret 153.size CRYPTO_memcmp,.-CRYPTO_memcmp 154___ 155 156print $code; 157close STDOUT or die "error closing STDOUT: $!"; 158