Blame crypto/armv4cpuid.pl

Packit c4476c
#! /usr/bin/env perl
Packit c4476c
# Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
#
Packit c4476c
# Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
# this file except in compliance with the License.  You can obtain a copy
Packit c4476c
# in the file LICENSE in the source distribution or at
Packit c4476c
# https://www.openssl.org/source/license.html
Packit c4476c
Packit c4476c
Packit c4476c
$flavour = shift;
Packit c4476c
$output  = shift;
Packit c4476c
Packit c4476c
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
Packit c4476c
( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
Packit c4476c
( $xlate="${dir}perlasm/arm-xlate.pl" and -f $xlate) or
Packit c4476c
die "can't locate arm-xlate.pl";
Packit c4476c
Packit c4476c
open OUT,"| \"$^X\" $xlate $flavour $output";
Packit c4476c
*STDOUT=*OUT;
Packit c4476c
Packit c4476c
$code.=<<___;
Packit c4476c
#include "arm_arch.h"
Packit c4476c
Packit c4476c
.text
Packit c4476c
#if defined(__thumb2__) && !defined(__APPLE__)
Packit c4476c
.syntax	unified
Packit c4476c
.thumb
Packit c4476c
#else
Packit c4476c
.code	32
Packit c4476c
#undef	__thumb2__
Packit c4476c
#endif
Packit c4476c
Packit c4476c
.align	5
Packit c4476c
.global	OPENSSL_atomic_add
Packit c4476c
.type	OPENSSL_atomic_add,%function
Packit c4476c
OPENSSL_atomic_add:
Packit c4476c
#if __ARM_ARCH__>=6
Packit c4476c
.Ladd:	ldrex	r2,[r0]
Packit c4476c
	add	r3,r2,r1
Packit c4476c
	strex	r2,r3,[r0]
Packit c4476c
	cmp	r2,#0
Packit c4476c
	bne	.Ladd
Packit c4476c
	mov	r0,r3
Packit c4476c
	bx	lr
Packit c4476c
#else
Packit c4476c
	stmdb	sp!,{r4-r6,lr}
Packit c4476c
	ldr	r2,.Lspinlock
Packit c4476c
	adr	r3,.Lspinlock
Packit c4476c
	mov	r4,r0
Packit c4476c
	mov	r5,r1
Packit c4476c
	add	r6,r3,r2	@ &spinlock
Packit c4476c
	b	.+8
Packit c4476c
.Lspin:	bl	sched_yield
Packit c4476c
	mov	r0,#-1
Packit c4476c
	swp	r0,r0,[r6]
Packit c4476c
	cmp	r0,#0
Packit c4476c
	bne	.Lspin
Packit c4476c
Packit c4476c
	ldr	r2,[r4]
Packit c4476c
	add	r2,r2,r5
Packit c4476c
	str	r2,[r4]
Packit c4476c
	str	r0,[r6]		@ release spinlock
Packit c4476c
	ldmia	sp!,{r4-r6,lr}
Packit c4476c
	tst	lr,#1
Packit c4476c
	moveq	pc,lr
Packit c4476c
	.word	0xe12fff1e	@ bx	lr
Packit c4476c
#endif
Packit c4476c
.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
Packit c4476c
Packit c4476c
.global	OPENSSL_cleanse
Packit c4476c
.type	OPENSSL_cleanse,%function
Packit c4476c
OPENSSL_cleanse:
Packit c4476c
	eor	ip,ip,ip
Packit c4476c
	cmp	r1,#7
Packit c4476c
#ifdef	__thumb2__
Packit c4476c
	itt	hs
Packit c4476c
#endif
Packit c4476c
	subhs	r1,r1,#4
Packit c4476c
	bhs	.Lot
Packit c4476c
	cmp	r1,#0
Packit c4476c
	beq	.Lcleanse_done
Packit c4476c
.Little:
Packit c4476c
	strb	ip,[r0],#1
Packit c4476c
	subs	r1,r1,#1
Packit c4476c
	bhi	.Little
Packit c4476c
	b	.Lcleanse_done
Packit c4476c
Packit c4476c
.Lot:	tst	r0,#3
Packit c4476c
	beq	.Laligned
Packit c4476c
	strb	ip,[r0],#1
Packit c4476c
	sub	r1,r1,#1
Packit c4476c
	b	.Lot
Packit c4476c
.Laligned:
Packit c4476c
	str	ip,[r0],#4
Packit c4476c
	subs	r1,r1,#4
Packit c4476c
	bhs	.Laligned
Packit c4476c
	adds	r1,r1,#4
Packit c4476c
	bne	.Little
Packit c4476c
.Lcleanse_done:
Packit c4476c
#if __ARM_ARCH__>=5
Packit c4476c
	bx	lr
Packit c4476c
#else
Packit c4476c
	tst	lr,#1
Packit c4476c
	moveq	pc,lr
Packit c4476c
	.word	0xe12fff1e	@ bx	lr
Packit c4476c
#endif
Packit c4476c
.size	OPENSSL_cleanse,.-OPENSSL_cleanse
Packit c4476c
Packit c4476c
.global	CRYPTO_memcmp
Packit c4476c
.type	CRYPTO_memcmp,%function
Packit c4476c
.align	4
Packit c4476c
CRYPTO_memcmp:
Packit c4476c
	eor	ip,ip,ip
Packit c4476c
	cmp	r2,#0
Packit c4476c
	beq	.Lno_data
Packit c4476c
	stmdb	sp!,{r4,r5}
Packit c4476c
Packit c4476c
.Loop_cmp:
Packit c4476c
	ldrb	r4,[r0],#1
Packit c4476c
	ldrb	r5,[r1],#1
Packit c4476c
	eor	r4,r4,r5
Packit c4476c
	orr	ip,ip,r4
Packit c4476c
	subs	r2,r2,#1
Packit c4476c
	bne	.Loop_cmp
Packit c4476c
Packit c4476c
	ldmia	sp!,{r4,r5}
Packit c4476c
.Lno_data:
Packit c4476c
	rsb	r0,ip,#0
Packit c4476c
	mov	r0,r0,lsr#31
Packit c4476c
#if __ARM_ARCH__>=5
Packit c4476c
	bx	lr
Packit c4476c
#else
Packit c4476c
	tst	lr,#1
Packit c4476c
	moveq	pc,lr
Packit c4476c
	.word	0xe12fff1e	@ bx	lr
Packit c4476c
#endif
Packit c4476c
.size	CRYPTO_memcmp,.-CRYPTO_memcmp
Packit c4476c
Packit c4476c
#if __ARM_MAX_ARCH__>=7
Packit c4476c
.arch	armv7-a
Packit c4476c
.fpu	neon
Packit c4476c
Packit c4476c
.align	5
Packit c4476c
.global	_armv7_neon_probe
Packit c4476c
.type	_armv7_neon_probe,%function
Packit c4476c
_armv7_neon_probe:
Packit c4476c
	vorr	q0,q0,q0
Packit c4476c
	bx	lr
Packit c4476c
.size	_armv7_neon_probe,.-_armv7_neon_probe
Packit c4476c
Packit c4476c
.global	_armv7_tick
Packit c4476c
.type	_armv7_tick,%function
Packit c4476c
_armv7_tick:
Packit c4476c
#ifdef	__APPLE__
Packit c4476c
	mrrc	p15,0,r0,r1,c14		@ CNTPCT
Packit c4476c
#else
Packit c4476c
	mrrc	p15,1,r0,r1,c14		@ CNTVCT
Packit c4476c
#endif
Packit c4476c
	bx	lr
Packit c4476c
.size	_armv7_tick,.-_armv7_tick
Packit c4476c
Packit c4476c
.global	_armv8_aes_probe
Packit c4476c
.type	_armv8_aes_probe,%function
Packit c4476c
_armv8_aes_probe:
Packit c4476c
#if defined(__thumb2__) && !defined(__APPLE__)
Packit c4476c
	.byte	0xb0,0xff,0x00,0x03	@ aese.8	q0,q0
Packit c4476c
#else
Packit c4476c
	.byte	0x00,0x03,0xb0,0xf3	@ aese.8	q0,q0
Packit c4476c
#endif
Packit c4476c
	bx	lr
Packit c4476c
.size	_armv8_aes_probe,.-_armv8_aes_probe
Packit c4476c
Packit c4476c
.global	_armv8_sha1_probe
Packit c4476c
.type	_armv8_sha1_probe,%function
Packit c4476c
_armv8_sha1_probe:
Packit c4476c
#if defined(__thumb2__) && !defined(__APPLE__)
Packit c4476c
	.byte	0x00,0xef,0x40,0x0c	@ sha1c.32	q0,q0,q0
Packit c4476c
#else
Packit c4476c
	.byte	0x40,0x0c,0x00,0xf2	@ sha1c.32	q0,q0,q0
Packit c4476c
#endif
Packit c4476c
	bx	lr
Packit c4476c
.size	_armv8_sha1_probe,.-_armv8_sha1_probe
Packit c4476c
Packit c4476c
.global	_armv8_sha256_probe
Packit c4476c
.type	_armv8_sha256_probe,%function
Packit c4476c
_armv8_sha256_probe:
Packit c4476c
#if defined(__thumb2__) && !defined(__APPLE__)
Packit c4476c
	.byte	0x00,0xff,0x40,0x0c	@ sha256h.32	q0,q0,q0
Packit c4476c
#else
Packit c4476c
	.byte	0x40,0x0c,0x00,0xf3	@ sha256h.32	q0,q0,q0
Packit c4476c
#endif
Packit c4476c
	bx	lr
Packit c4476c
.size	_armv8_sha256_probe,.-_armv8_sha256_probe
Packit c4476c
.global	_armv8_pmull_probe
Packit c4476c
.type	_armv8_pmull_probe,%function
Packit c4476c
_armv8_pmull_probe:
Packit c4476c
#if defined(__thumb2__) && !defined(__APPLE__)
Packit c4476c
	.byte	0xa0,0xef,0x00,0x0e	@ vmull.p64	q0,d0,d0
Packit c4476c
#else
Packit c4476c
	.byte	0x00,0x0e,0xa0,0xf2	@ vmull.p64	q0,d0,d0
Packit c4476c
#endif
Packit c4476c
	bx	lr
Packit c4476c
.size	_armv8_pmull_probe,.-_armv8_pmull_probe
Packit c4476c
#endif
Packit c4476c
Packit c4476c
.global	OPENSSL_wipe_cpu
Packit c4476c
.type	OPENSSL_wipe_cpu,%function
Packit c4476c
OPENSSL_wipe_cpu:
Packit c4476c
#if __ARM_MAX_ARCH__>=7
Packit c4476c
	ldr	r0,.LOPENSSL_armcap
Packit c4476c
	adr	r1,.LOPENSSL_armcap
Packit c4476c
	ldr	r0,[r1,r0]
Packit c4476c
#ifdef	__APPLE__
Packit c4476c
	ldr	r0,[r0]
Packit c4476c
#endif
Packit c4476c
#endif
Packit c4476c
	eor	r2,r2,r2
Packit c4476c
	eor	r3,r3,r3
Packit c4476c
	eor	ip,ip,ip
Packit c4476c
#if __ARM_MAX_ARCH__>=7
Packit c4476c
	tst	r0,#1
Packit c4476c
	beq	.Lwipe_done
Packit c4476c
	veor	q0, q0, q0
Packit c4476c
	veor	q1, q1, q1
Packit c4476c
	veor	q2, q2, q2
Packit c4476c
	veor	q3, q3, q3
Packit c4476c
	veor	q8, q8, q8
Packit c4476c
	veor	q9, q9, q9
Packit c4476c
	veor	q10, q10, q10
Packit c4476c
	veor	q11, q11, q11
Packit c4476c
	veor	q12, q12, q12
Packit c4476c
	veor	q13, q13, q13
Packit c4476c
	veor	q14, q14, q14
Packit c4476c
	veor	q15, q15, q15
Packit c4476c
.Lwipe_done:
Packit c4476c
#endif
Packit c4476c
	mov	r0,sp
Packit c4476c
#if __ARM_ARCH__>=5
Packit c4476c
	bx	lr
Packit c4476c
#else
Packit c4476c
	tst	lr,#1
Packit c4476c
	moveq	pc,lr
Packit c4476c
	.word	0xe12fff1e	@ bx	lr
Packit c4476c
#endif
Packit c4476c
.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
Packit c4476c
Packit c4476c
.global	OPENSSL_instrument_bus
Packit c4476c
.type	OPENSSL_instrument_bus,%function
Packit c4476c
OPENSSL_instrument_bus:
Packit c4476c
	eor	r0,r0,r0
Packit c4476c
#if __ARM_ARCH__>=5
Packit c4476c
	bx	lr
Packit c4476c
#else
Packit c4476c
	tst	lr,#1
Packit c4476c
	moveq	pc,lr
Packit c4476c
	.word	0xe12fff1e	@ bx	lr
Packit c4476c
#endif
Packit c4476c
.size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
Packit c4476c
Packit c4476c
.global	OPENSSL_instrument_bus2
Packit c4476c
.type	OPENSSL_instrument_bus2,%function
Packit c4476c
OPENSSL_instrument_bus2:
Packit c4476c
	eor	r0,r0,r0
Packit c4476c
#if __ARM_ARCH__>=5
Packit c4476c
	bx	lr
Packit c4476c
#else
Packit c4476c
	tst	lr,#1
Packit c4476c
	moveq	pc,lr
Packit c4476c
	.word	0xe12fff1e	@ bx	lr
Packit c4476c
#endif
Packit c4476c
.size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
Packit c4476c
Packit c4476c
.align	5
Packit c4476c
#if __ARM_MAX_ARCH__>=7
Packit c4476c
.LOPENSSL_armcap:
Packit c4476c
.word	OPENSSL_armcap_P-.
Packit c4476c
#endif
Packit c4476c
#if __ARM_ARCH__>=6
Packit c4476c
.align	5
Packit c4476c
#else
Packit c4476c
.Lspinlock:
Packit c4476c
.word	atomic_add_spinlock-.Lspinlock
Packit c4476c
.align	5
Packit c4476c
Packit c4476c
.data
Packit c4476c
.align	2
Packit c4476c
atomic_add_spinlock:
Packit c4476c
.word	0
Packit c4476c
#endif
Packit c4476c
Packit c4476c
.comm	OPENSSL_armcap_P,4,4
Packit c4476c
.hidden	OPENSSL_armcap_P
Packit c4476c
___
Packit c4476c
Packit c4476c
print $code;
Packit c4476c
close STDOUT or die "error closing STDOUT: $!";