1#! /usr/bin/env perl 2# Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. 3# 4# Licensed under the OpenSSL license (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 10$flavour = shift; 11$output = shift; 12 13$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 14( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or 15( $xlate="${dir}perlasm/arm-xlate.pl" and -f $xlate) or 16die "can't locate arm-xlate.pl"; 17 18open OUT,"| \"$^X\" $xlate $flavour $output"; 19*STDOUT=*OUT; 20 21$code.=<<___; 22#include "arm_arch.h" 23 24.text 25.arch armv8-a+crypto 26 27.align 5 28.globl _armv7_neon_probe 29.type _armv7_neon_probe,%function 30_armv7_neon_probe: 31 orr v15.16b, v15.16b, v15.16b 32 ret 33.size _armv7_neon_probe,.-_armv7_neon_probe 34 35.globl _armv7_tick 36.type _armv7_tick,%function 37_armv7_tick: 38#ifdef __APPLE__ 39 mrs x0, CNTPCT_EL0 40#else 41 mrs x0, CNTVCT_EL0 42#endif 43 ret 44.size _armv7_tick,.-_armv7_tick 45 46.globl _armv8_aes_probe 47.type _armv8_aes_probe,%function 48_armv8_aes_probe: 49 aese v0.16b, v0.16b 50 ret 51.size _armv8_aes_probe,.-_armv8_aes_probe 52 53.globl _armv8_sha1_probe 54.type _armv8_sha1_probe,%function 55_armv8_sha1_probe: 56 sha1h s0, s0 57 ret 58.size _armv8_sha1_probe,.-_armv8_sha1_probe 59 60.globl _armv8_sha256_probe 61.type _armv8_sha256_probe,%function 62_armv8_sha256_probe: 63 sha256su0 v0.4s, v0.4s 64 ret 65.size _armv8_sha256_probe,.-_armv8_sha256_probe 66 67.globl _armv8_pmull_probe 68.type _armv8_pmull_probe,%function 69_armv8_pmull_probe: 70 pmull v0.1q, v0.1d, v0.1d 71 ret 72.size _armv8_pmull_probe,.-_armv8_pmull_probe 73 74.globl _armv8_sha512_probe 75.type _armv8_sha512_probe,%function 76_armv8_sha512_probe: 77 .long 0xcec08000 // sha512su0 v0.2d,v0.2d 78 ret 79.size _armv8_sha512_probe,.-_armv8_sha512_probe 80 81.globl OPENSSL_cleanse 82.type OPENSSL_cleanse,%function 83.align 5 84OPENSSL_cleanse: 85 cbz x1,.Lret // len==0? 86 cmp x1,#15 87 b.hi .Lot // len>15 88 nop 89.Little: 90 strb wzr,[x0],#1 // store byte-by-byte 91 subs x1,x1,#1 92 b.ne .Little 93.Lret: ret 94 95.align 4 96.Lot: tst x0,#7 97 b.eq .Laligned // inp is aligned 98 strb wzr,[x0],#1 // store byte-by-byte 99 sub x1,x1,#1 100 b .Lot 101 102.align 4 103.Laligned: 104 str xzr,[x0],#8 // store word-by-word 105 sub x1,x1,#8 106 tst x1,#-8 107 b.ne .Laligned // len>=8 108 cbnz x1,.Little // len!=0? 109 ret 110.size OPENSSL_cleanse,.-OPENSSL_cleanse 111 112.globl CRYPTO_memcmp 113.type CRYPTO_memcmp,%function 114.align 4 115CRYPTO_memcmp: 116 eor w3,w3,w3 117 cbz x2,.Lno_data // len==0? 118 cmp x2,#16 119 b.ne .Loop_cmp 120 ldp x8,x9,[x0] 121 ldp x10,x11,[x1] 122 eor x8,x8,x10 123 eor x9,x9,x11 124 orr x8,x8,x9 125 mov x0,#1 126 cmp x8,#0 127 csel x0,xzr,x0,eq 128 ret 129 130.align 4 131.Loop_cmp: 132 ldrb w4,[x0],#1 133 ldrb w5,[x1],#1 134 eor w4,w4,w5 135 orr w3,w3,w4 136 subs x2,x2,#1 137 b.ne .Loop_cmp 138 139.Lno_data: 140 neg w0,w3 141 lsr w0,w0,#31 142 ret 143.size CRYPTO_memcmp,.-CRYPTO_memcmp 144___ 145 146print $code; 147close STDOUT; 148