1e1051a39Sopenharmony_ci#! /usr/bin/env perl 2e1051a39Sopenharmony_ci# Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci# 4e1051a39Sopenharmony_ci# Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci# this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci# in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci# https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci# $output is the last argument if it looks like a file (it has an extension) 11e1051a39Sopenharmony_ci# $flavour is the first argument if it doesn't look like a file 12e1051a39Sopenharmony_ci$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; 13e1051a39Sopenharmony_ci$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; 14e1051a39Sopenharmony_ci 15e1051a39Sopenharmony_ci$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 16e1051a39Sopenharmony_ci( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or 17e1051a39Sopenharmony_ci( $xlate="${dir}perlasm/arm-xlate.pl" and -f $xlate) or 18e1051a39Sopenharmony_cidie "can't locate arm-xlate.pl"; 19e1051a39Sopenharmony_ci 20e1051a39Sopenharmony_ciopen OUT,"| \"$^X\" $xlate $flavour \"$output\"" 21e1051a39Sopenharmony_ci or die "can't call $xlate: $!"; 22e1051a39Sopenharmony_ci*STDOUT=*OUT; 23e1051a39Sopenharmony_ci 24e1051a39Sopenharmony_ci$code.=<<___; 25e1051a39Sopenharmony_ci#include "arm_arch.h" 26e1051a39Sopenharmony_ci 27e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__) 28e1051a39Sopenharmony_ci.syntax unified 29e1051a39Sopenharmony_ci.thumb 30e1051a39Sopenharmony_ci#else 31e1051a39Sopenharmony_ci.code 32 32e1051a39Sopenharmony_ci#undef __thumb2__ 33e1051a39Sopenharmony_ci#endif 34e1051a39Sopenharmony_ci 35e1051a39Sopenharmony_ci.text 36e1051a39Sopenharmony_ci 37e1051a39Sopenharmony_ci.align 5 38e1051a39Sopenharmony_ci.global OPENSSL_atomic_add 39e1051a39Sopenharmony_ci.type OPENSSL_atomic_add,%function 40e1051a39Sopenharmony_ciOPENSSL_atomic_add: 41e1051a39Sopenharmony_ci#if __ARM_ARCH__>=6 42e1051a39Sopenharmony_ci.Ladd: ldrex r2,[r0] 43e1051a39Sopenharmony_ci add r3,r2,r1 44e1051a39Sopenharmony_ci strex r2,r3,[r0] 45e1051a39Sopenharmony_ci cmp r2,#0 46e1051a39Sopenharmony_ci bne .Ladd 47e1051a39Sopenharmony_ci mov r0,r3 48e1051a39Sopenharmony_ci bx lr 49e1051a39Sopenharmony_ci#else 50e1051a39Sopenharmony_ci stmdb sp!,{r4-r6,lr} 51e1051a39Sopenharmony_ci ldr r2,.Lspinlock 52e1051a39Sopenharmony_ci adr r3,.Lspinlock 53e1051a39Sopenharmony_ci mov r4,r0 54e1051a39Sopenharmony_ci mov r5,r1 55e1051a39Sopenharmony_ci add r6,r3,r2 @ &spinlock 56e1051a39Sopenharmony_ci b .+8 57e1051a39Sopenharmony_ci.Lspin: bl sched_yield 58e1051a39Sopenharmony_ci mov r0,#-1 59e1051a39Sopenharmony_ci swp r0,r0,[r6] 60e1051a39Sopenharmony_ci cmp r0,#0 61e1051a39Sopenharmony_ci bne .Lspin 62e1051a39Sopenharmony_ci 63e1051a39Sopenharmony_ci ldr r2,[r4] 64e1051a39Sopenharmony_ci add r2,r2,r5 65e1051a39Sopenharmony_ci str r2,[r4] 66e1051a39Sopenharmony_ci str r0,[r6] @ release spinlock 67e1051a39Sopenharmony_ci ldmia sp!,{r4-r6,lr} 68e1051a39Sopenharmony_ci tst lr,#1 69e1051a39Sopenharmony_ci moveq pc,lr 70e1051a39Sopenharmony_ci .word 0xe12fff1e @ bx lr 71e1051a39Sopenharmony_ci#endif 72e1051a39Sopenharmony_ci.size OPENSSL_atomic_add,.-OPENSSL_atomic_add 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ci.global OPENSSL_cleanse 75e1051a39Sopenharmony_ci.type OPENSSL_cleanse,%function 76e1051a39Sopenharmony_ciOPENSSL_cleanse: 77e1051a39Sopenharmony_ci eor ip,ip,ip 78e1051a39Sopenharmony_ci cmp r1,#7 79e1051a39Sopenharmony_ci#ifdef __thumb2__ 80e1051a39Sopenharmony_ci itt hs 81e1051a39Sopenharmony_ci#endif 82e1051a39Sopenharmony_ci subhs r1,r1,#4 83e1051a39Sopenharmony_ci bhs .Lot 84e1051a39Sopenharmony_ci cmp r1,#0 85e1051a39Sopenharmony_ci beq .Lcleanse_done 86e1051a39Sopenharmony_ci.Little: 87e1051a39Sopenharmony_ci strb ip,[r0],#1 88e1051a39Sopenharmony_ci subs r1,r1,#1 89e1051a39Sopenharmony_ci bhi .Little 90e1051a39Sopenharmony_ci b .Lcleanse_done 91e1051a39Sopenharmony_ci 92e1051a39Sopenharmony_ci.Lot: tst r0,#3 93e1051a39Sopenharmony_ci beq .Laligned 94e1051a39Sopenharmony_ci strb ip,[r0],#1 95e1051a39Sopenharmony_ci sub r1,r1,#1 96e1051a39Sopenharmony_ci b .Lot 97e1051a39Sopenharmony_ci.Laligned: 98e1051a39Sopenharmony_ci str ip,[r0],#4 99e1051a39Sopenharmony_ci subs r1,r1,#4 100e1051a39Sopenharmony_ci bhs .Laligned 101e1051a39Sopenharmony_ci adds r1,r1,#4 102e1051a39Sopenharmony_ci bne .Little 103e1051a39Sopenharmony_ci.Lcleanse_done: 104e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5 105e1051a39Sopenharmony_ci bx lr 106e1051a39Sopenharmony_ci#else 107e1051a39Sopenharmony_ci tst lr,#1 108e1051a39Sopenharmony_ci moveq pc,lr 109e1051a39Sopenharmony_ci .word 0xe12fff1e @ bx lr 110e1051a39Sopenharmony_ci#endif 111e1051a39Sopenharmony_ci.size OPENSSL_cleanse,.-OPENSSL_cleanse 112e1051a39Sopenharmony_ci 113e1051a39Sopenharmony_ci.global CRYPTO_memcmp 114e1051a39Sopenharmony_ci.type CRYPTO_memcmp,%function 115e1051a39Sopenharmony_ci.align 4 116e1051a39Sopenharmony_ciCRYPTO_memcmp: 117e1051a39Sopenharmony_ci eor ip,ip,ip 118e1051a39Sopenharmony_ci cmp r2,#0 119e1051a39Sopenharmony_ci beq .Lno_data 120e1051a39Sopenharmony_ci stmdb sp!,{r4,r5} 121e1051a39Sopenharmony_ci 122e1051a39Sopenharmony_ci.Loop_cmp: 123e1051a39Sopenharmony_ci ldrb r4,[r0],#1 124e1051a39Sopenharmony_ci ldrb r5,[r1],#1 125e1051a39Sopenharmony_ci eor r4,r4,r5 126e1051a39Sopenharmony_ci orr ip,ip,r4 127e1051a39Sopenharmony_ci subs r2,r2,#1 128e1051a39Sopenharmony_ci bne .Loop_cmp 129e1051a39Sopenharmony_ci 130e1051a39Sopenharmony_ci ldmia sp!,{r4,r5} 131e1051a39Sopenharmony_ci.Lno_data: 132e1051a39Sopenharmony_ci rsb r0,ip,#0 133e1051a39Sopenharmony_ci mov r0,r0,lsr#31 134e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5 135e1051a39Sopenharmony_ci bx lr 136e1051a39Sopenharmony_ci#else 137e1051a39Sopenharmony_ci tst lr,#1 138e1051a39Sopenharmony_ci moveq pc,lr 139e1051a39Sopenharmony_ci .word 0xe12fff1e @ bx lr 140e1051a39Sopenharmony_ci#endif 141e1051a39Sopenharmony_ci.size CRYPTO_memcmp,.-CRYPTO_memcmp 142e1051a39Sopenharmony_ci 143e1051a39Sopenharmony_ci#if __ARM_MAX_ARCH__>=7 144e1051a39Sopenharmony_ci.arch armv7-a 145e1051a39Sopenharmony_ci.fpu neon 146e1051a39Sopenharmony_ci 147e1051a39Sopenharmony_ci.align 5 148e1051a39Sopenharmony_ci.global _armv7_neon_probe 149e1051a39Sopenharmony_ci.type _armv7_neon_probe,%function 150e1051a39Sopenharmony_ci_armv7_neon_probe: 151e1051a39Sopenharmony_ci vorr q0,q0,q0 152e1051a39Sopenharmony_ci bx lr 153e1051a39Sopenharmony_ci.size _armv7_neon_probe,.-_armv7_neon_probe 154e1051a39Sopenharmony_ci 155e1051a39Sopenharmony_ci.global _armv7_tick 156e1051a39Sopenharmony_ci.type _armv7_tick,%function 157e1051a39Sopenharmony_ci_armv7_tick: 158e1051a39Sopenharmony_ci#ifdef __APPLE__ 159e1051a39Sopenharmony_ci mrrc p15,0,r0,r1,c14 @ CNTPCT 160e1051a39Sopenharmony_ci#else 161e1051a39Sopenharmony_ci mrrc p15,1,r0,r1,c14 @ CNTVCT 162e1051a39Sopenharmony_ci#endif 163e1051a39Sopenharmony_ci bx lr 164e1051a39Sopenharmony_ci.size _armv7_tick,.-_armv7_tick 165e1051a39Sopenharmony_ci 166e1051a39Sopenharmony_ci.global _armv8_aes_probe 167e1051a39Sopenharmony_ci.type _armv8_aes_probe,%function 168e1051a39Sopenharmony_ci_armv8_aes_probe: 169e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__) 170e1051a39Sopenharmony_ci .byte 0xb0,0xff,0x00,0x03 @ aese.8 q0,q0 171e1051a39Sopenharmony_ci#else 172e1051a39Sopenharmony_ci .byte 0x00,0x03,0xb0,0xf3 @ aese.8 q0,q0 173e1051a39Sopenharmony_ci#endif 174e1051a39Sopenharmony_ci bx lr 175e1051a39Sopenharmony_ci.size _armv8_aes_probe,.-_armv8_aes_probe 176e1051a39Sopenharmony_ci 177e1051a39Sopenharmony_ci.global _armv8_sha1_probe 178e1051a39Sopenharmony_ci.type _armv8_sha1_probe,%function 179e1051a39Sopenharmony_ci_armv8_sha1_probe: 180e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__) 181e1051a39Sopenharmony_ci .byte 0x00,0xef,0x40,0x0c @ sha1c.32 q0,q0,q0 182e1051a39Sopenharmony_ci#else 183e1051a39Sopenharmony_ci .byte 0x40,0x0c,0x00,0xf2 @ sha1c.32 q0,q0,q0 184e1051a39Sopenharmony_ci#endif 185e1051a39Sopenharmony_ci bx lr 186e1051a39Sopenharmony_ci.size _armv8_sha1_probe,.-_armv8_sha1_probe 187e1051a39Sopenharmony_ci 188e1051a39Sopenharmony_ci.global _armv8_sha256_probe 189e1051a39Sopenharmony_ci.type _armv8_sha256_probe,%function 190e1051a39Sopenharmony_ci_armv8_sha256_probe: 191e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__) 192e1051a39Sopenharmony_ci .byte 0x00,0xff,0x40,0x0c @ sha256h.32 q0,q0,q0 193e1051a39Sopenharmony_ci#else 194e1051a39Sopenharmony_ci .byte 0x40,0x0c,0x00,0xf3 @ sha256h.32 q0,q0,q0 195e1051a39Sopenharmony_ci#endif 196e1051a39Sopenharmony_ci bx lr 197e1051a39Sopenharmony_ci.size _armv8_sha256_probe,.-_armv8_sha256_probe 198e1051a39Sopenharmony_ci.global _armv8_pmull_probe 199e1051a39Sopenharmony_ci.type _armv8_pmull_probe,%function 200e1051a39Sopenharmony_ci_armv8_pmull_probe: 201e1051a39Sopenharmony_ci#if defined(__thumb2__) && !defined(__APPLE__) 202e1051a39Sopenharmony_ci .byte 0xa0,0xef,0x00,0x0e @ vmull.p64 q0,d0,d0 203e1051a39Sopenharmony_ci#else 204e1051a39Sopenharmony_ci .byte 0x00,0x0e,0xa0,0xf2 @ vmull.p64 q0,d0,d0 205e1051a39Sopenharmony_ci#endif 206e1051a39Sopenharmony_ci bx lr 207e1051a39Sopenharmony_ci.size _armv8_pmull_probe,.-_armv8_pmull_probe 208e1051a39Sopenharmony_ci#endif 209e1051a39Sopenharmony_ci 210e1051a39Sopenharmony_ci.global OPENSSL_wipe_cpu 211e1051a39Sopenharmony_ci.type OPENSSL_wipe_cpu,%function 212e1051a39Sopenharmony_ciOPENSSL_wipe_cpu: 213e1051a39Sopenharmony_ci#if __ARM_MAX_ARCH__>=7 214e1051a39Sopenharmony_ci ldr r0,.LOPENSSL_armcap 215e1051a39Sopenharmony_ci adr r1,.LOPENSSL_armcap 216e1051a39Sopenharmony_ci ldr r0,[r1,r0] 217e1051a39Sopenharmony_ci#ifdef __APPLE__ 218e1051a39Sopenharmony_ci ldr r0,[r0] 219e1051a39Sopenharmony_ci#endif 220e1051a39Sopenharmony_ci#endif 221e1051a39Sopenharmony_ci eor r2,r2,r2 222e1051a39Sopenharmony_ci eor r3,r3,r3 223e1051a39Sopenharmony_ci eor ip,ip,ip 224e1051a39Sopenharmony_ci#if __ARM_MAX_ARCH__>=7 225e1051a39Sopenharmony_ci tst r0,#1 226e1051a39Sopenharmony_ci beq .Lwipe_done 227e1051a39Sopenharmony_ci veor q0, q0, q0 228e1051a39Sopenharmony_ci veor q1, q1, q1 229e1051a39Sopenharmony_ci veor q2, q2, q2 230e1051a39Sopenharmony_ci veor q3, q3, q3 231e1051a39Sopenharmony_ci veor q8, q8, q8 232e1051a39Sopenharmony_ci veor q9, q9, q9 233e1051a39Sopenharmony_ci veor q10, q10, q10 234e1051a39Sopenharmony_ci veor q11, q11, q11 235e1051a39Sopenharmony_ci veor q12, q12, q12 236e1051a39Sopenharmony_ci veor q13, q13, q13 237e1051a39Sopenharmony_ci veor q14, q14, q14 238e1051a39Sopenharmony_ci veor q15, q15, q15 239e1051a39Sopenharmony_ci.Lwipe_done: 240e1051a39Sopenharmony_ci#endif 241e1051a39Sopenharmony_ci mov r0,sp 242e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5 243e1051a39Sopenharmony_ci bx lr 244e1051a39Sopenharmony_ci#else 245e1051a39Sopenharmony_ci tst lr,#1 246e1051a39Sopenharmony_ci moveq pc,lr 247e1051a39Sopenharmony_ci .word 0xe12fff1e @ bx lr 248e1051a39Sopenharmony_ci#endif 249e1051a39Sopenharmony_ci.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu 250e1051a39Sopenharmony_ci 251e1051a39Sopenharmony_ci.global OPENSSL_instrument_bus 252e1051a39Sopenharmony_ci.type OPENSSL_instrument_bus,%function 253e1051a39Sopenharmony_ciOPENSSL_instrument_bus: 254e1051a39Sopenharmony_ci eor r0,r0,r0 255e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5 256e1051a39Sopenharmony_ci bx lr 257e1051a39Sopenharmony_ci#else 258e1051a39Sopenharmony_ci tst lr,#1 259e1051a39Sopenharmony_ci moveq pc,lr 260e1051a39Sopenharmony_ci .word 0xe12fff1e @ bx lr 261e1051a39Sopenharmony_ci#endif 262e1051a39Sopenharmony_ci.size OPENSSL_instrument_bus,.-OPENSSL_instrument_bus 263e1051a39Sopenharmony_ci 264e1051a39Sopenharmony_ci.global OPENSSL_instrument_bus2 265e1051a39Sopenharmony_ci.type OPENSSL_instrument_bus2,%function 266e1051a39Sopenharmony_ciOPENSSL_instrument_bus2: 267e1051a39Sopenharmony_ci eor r0,r0,r0 268e1051a39Sopenharmony_ci#if __ARM_ARCH__>=5 269e1051a39Sopenharmony_ci bx lr 270e1051a39Sopenharmony_ci#else 271e1051a39Sopenharmony_ci tst lr,#1 272e1051a39Sopenharmony_ci moveq pc,lr 273e1051a39Sopenharmony_ci .word 0xe12fff1e @ bx lr 274e1051a39Sopenharmony_ci#endif 275e1051a39Sopenharmony_ci.size OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2 276e1051a39Sopenharmony_ci 277e1051a39Sopenharmony_ci.align 5 278e1051a39Sopenharmony_ci#if __ARM_MAX_ARCH__>=7 279e1051a39Sopenharmony_ci.LOPENSSL_armcap: 280e1051a39Sopenharmony_ci.word OPENSSL_armcap_P-. 281e1051a39Sopenharmony_ci#endif 282e1051a39Sopenharmony_ci#if __ARM_ARCH__>=6 283e1051a39Sopenharmony_ci.align 5 284e1051a39Sopenharmony_ci#else 285e1051a39Sopenharmony_ci.Lspinlock: 286e1051a39Sopenharmony_ci.word atomic_add_spinlock-.Lspinlock 287e1051a39Sopenharmony_ci.align 5 288e1051a39Sopenharmony_ci 289e1051a39Sopenharmony_ci.data 290e1051a39Sopenharmony_ci.align 2 291e1051a39Sopenharmony_ciatomic_add_spinlock: 292e1051a39Sopenharmony_ci.word 0 293e1051a39Sopenharmony_ci#endif 294e1051a39Sopenharmony_ci 295e1051a39Sopenharmony_ci.comm OPENSSL_armcap_P,4,4 296e1051a39Sopenharmony_ci.hidden OPENSSL_armcap_P 297e1051a39Sopenharmony_ci___ 298e1051a39Sopenharmony_ci 299e1051a39Sopenharmony_ciprint $code; 300e1051a39Sopenharmony_ciclose STDOUT or die "error closing STDOUT: $!"; 301