Blame crypto/ppccpuid.pl

Packit c4476c
#! /usr/bin/env perl
Packit c4476c
# Copyright 2007-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
Packit c4476c
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
Packit c4476c
( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
Packit c4476c
( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
Packit c4476c
die "can't locate ppc-xlate.pl";
Packit c4476c
Packit c4476c
open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
Packit c4476c
Packit c4476c
if ($flavour=~/64/) {
Packit c4476c
    $CMPLI="cmpldi";
Packit c4476c
    $SHRLI="srdi";
Packit c4476c
    $SIGNX="extsw";
Packit c4476c
} else {
Packit c4476c
    $CMPLI="cmplwi";
Packit c4476c
    $SHRLI="srwi";
Packit c4476c
    $SIGNX="mr";
Packit c4476c
}
Packit c4476c
Packit c4476c
$code=<<___;
Packit c4476c
.machine	"any"
Packit c4476c
.text
Packit c4476c
Packit c4476c
.globl	.OPENSSL_fpu_probe
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_fpu_probe:
Packit c4476c
	fmr	f0,f0
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,0,0
Packit c4476c
.size	.OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe
Packit c4476c
.globl	.OPENSSL_ppc64_probe
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_ppc64_probe:
Packit c4476c
	fcfid	f1,f1
Packit c4476c
	extrdi	r0,r0,32,0
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,0,0
Packit c4476c
.size	.OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe
Packit c4476c
Packit c4476c
.globl	.OPENSSL_altivec_probe
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_altivec_probe:
Packit c4476c
	.long	0x10000484	# vor	v0,v0,v0
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,0,0
Packit c4476c
.size	.OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
Packit c4476c
Packit c4476c
.globl	.OPENSSL_crypto207_probe
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_crypto207_probe:
Packit c4476c
	lvx_u	v0,0,r1
Packit c4476c
	vcipher	v0,v0,v0
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,0,0
Packit c4476c
.size	.OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
Packit c4476c
Packit c4476c
.globl	.OPENSSL_madd300_probe
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_madd300_probe:
Packit c4476c
	xor	r0,r0,r0
Packit c4476c
	maddld	r3,r0,r0,r0
Packit c4476c
	maddhdu	r3,r0,r0,r0
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,0,0
Packit c4476c
Packit c4476c
.globl	.OPENSSL_wipe_cpu
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_wipe_cpu:
Packit c4476c
	xor	r0,r0,r0
Packit c4476c
	fmr	f0,f31
Packit c4476c
	fmr	f1,f31
Packit c4476c
	fmr	f2,f31
Packit c4476c
	mr	r3,r1
Packit c4476c
	fmr	f3,f31
Packit c4476c
	xor	r4,r4,r4
Packit c4476c
	fmr	f4,f31
Packit c4476c
	xor	r5,r5,r5
Packit c4476c
	fmr	f5,f31
Packit c4476c
	xor	r6,r6,r6
Packit c4476c
	fmr	f6,f31
Packit c4476c
	xor	r7,r7,r7
Packit c4476c
	fmr	f7,f31
Packit c4476c
	xor	r8,r8,r8
Packit c4476c
	fmr	f8,f31
Packit c4476c
	xor	r9,r9,r9
Packit c4476c
	fmr	f9,f31
Packit c4476c
	xor	r10,r10,r10
Packit c4476c
	fmr	f10,f31
Packit c4476c
	xor	r11,r11,r11
Packit c4476c
	fmr	f11,f31
Packit c4476c
	xor	r12,r12,r12
Packit c4476c
	fmr	f12,f31
Packit c4476c
	fmr	f13,f31
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,0,0
Packit c4476c
.size	.OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
Packit c4476c
Packit c4476c
.globl	.OPENSSL_atomic_add
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_atomic_add:
Packit c4476c
Ladd:	lwarx	r5,0,r3
Packit c4476c
	add	r0,r4,r5
Packit c4476c
	stwcx.	r0,0,r3
Packit c4476c
	bne-	Ladd
Packit c4476c
	$SIGNX	r3,r0
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,2,0
Packit c4476c
	.long	0
Packit c4476c
.size	.OPENSSL_atomic_add,.-.OPENSSL_atomic_add
Packit c4476c
Packit c4476c
.globl	.OPENSSL_rdtsc_mftb
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_rdtsc_mftb:
Packit c4476c
	mftb	r3
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,0,0
Packit c4476c
.size	.OPENSSL_rdtsc_mftb,.-.OPENSSL_rdtsc_mftb
Packit c4476c
Packit c4476c
.globl	.OPENSSL_rdtsc_mfspr268
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_rdtsc_mfspr268:
Packit c4476c
	mfspr	r3,268
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,0,0
Packit c4476c
.size	.OPENSSL_rdtsc_mfspr268,.-.OPENSSL_rdtsc_mfspr268
Packit c4476c
Packit c4476c
.globl	.OPENSSL_cleanse
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_cleanse:
Packit c4476c
	$CMPLI	r4,7
Packit c4476c
	li	r0,0
Packit c4476c
	bge	Lot
Packit c4476c
	$CMPLI	r4,0
Packit c4476c
	beqlr-
Packit c4476c
Little:	mtctr	r4
Packit c4476c
	stb	r0,0(r3)
Packit c4476c
	addi	r3,r3,1
Packit c4476c
	bdnz	\$-8
Packit c4476c
	blr
Packit c4476c
Lot:	andi.	r5,r3,3
Packit c4476c
	beq	Laligned
Packit c4476c
	stb	r0,0(r3)
Packit c4476c
	subi	r4,r4,1
Packit c4476c
	addi	r3,r3,1
Packit c4476c
	b	Lot
Packit c4476c
Laligned:
Packit c4476c
	$SHRLI	r5,r4,2
Packit c4476c
	mtctr	r5
Packit c4476c
	stw	r0,0(r3)
Packit c4476c
	addi	r3,r3,4
Packit c4476c
	bdnz	\$-8
Packit c4476c
	andi.	r4,r4,3
Packit c4476c
	bne	Little
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,2,0
Packit c4476c
	.long	0
Packit c4476c
.size	.OPENSSL_cleanse,.-.OPENSSL_cleanse
Packit c4476c
Packit c4476c
globl	.CRYPTO_memcmp
Packit c4476c
.align	4
Packit c4476c
.CRYPTO_memcmp:
Packit c4476c
	$CMPLI	r5,0
Packit c4476c
	li	r0,0
Packit c4476c
	beq	Lno_data
Packit c4476c
	mtctr	r5
Packit c4476c
Loop_cmp:
Packit c4476c
	lbz	r6,0(r3)
Packit c4476c
	addi	r3,r3,1
Packit c4476c
	lbz	r7,0(r4)
Packit c4476c
	addi	r4,r4,1
Packit c4476c
	xor	r6,r6,r7
Packit c4476c
	or	r0,r0,r6
Packit c4476c
	bdnz	Loop_cmp
Packit c4476c
Packit c4476c
Lno_data:
Packit c4476c
	li	r3,0
Packit c4476c
	sub	r3,r3,r0
Packit c4476c
	extrwi	r3,r3,1,0
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,3,0
Packit c4476c
	.long	0
Packit c4476c
.size	.CRYPTO_memcmp,.-.CRYPTO_memcmp
Packit c4476c
___
Packit c4476c
{
Packit c4476c
my ($out,$cnt,$max)=("r3","r4","r5");
Packit c4476c
my ($tick,$lasttick)=("r6","r7");
Packit c4476c
my ($diff,$lastdiff)=("r8","r9");
Packit c4476c
Packit c4476c
$code.=<<___;
Packit c4476c
.globl	.OPENSSL_instrument_bus_mftb
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_instrument_bus_mftb:
Packit c4476c
	mtctr	$cnt
Packit c4476c
Packit c4476c
	mftb	$lasttick		# collect 1st tick
Packit c4476c
	li	$diff,0
Packit c4476c
Packit c4476c
	dcbf	0,$out			# flush cache line
Packit c4476c
	lwarx	$tick,0,$out		# load and lock
Packit c4476c
	add	$tick,$tick,$diff
Packit c4476c
	stwcx.	$tick,0,$out
Packit c4476c
	stwx	$tick,0,$out
Packit c4476c
Packit c4476c
Loop:	mftb	$tick
Packit c4476c
	sub	$diff,$tick,$lasttick
Packit c4476c
	mr	$lasttick,$tick
Packit c4476c
	dcbf	0,$out			# flush cache line
Packit c4476c
	lwarx	$tick,0,$out		# load and lock
Packit c4476c
	add	$tick,$tick,$diff
Packit c4476c
	stwcx.	$tick,0,$out
Packit c4476c
	stwx	$tick,0,$out
Packit c4476c
	addi	$out,$out,4		# ++$out
Packit c4476c
	bdnz	Loop
Packit c4476c
Packit c4476c
	mr	r3,$cnt
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,2,0
Packit c4476c
	.long	0
Packit c4476c
.size	.OPENSSL_instrument_bus_mftb,.-.OPENSSL_instrument_bus_mftb
Packit c4476c
Packit c4476c
.globl	.OPENSSL_instrument_bus2_mftb
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_instrument_bus2_mftb:
Packit c4476c
	mr	r0,$cnt
Packit c4476c
	slwi	$cnt,$cnt,2
Packit c4476c
Packit c4476c
	mftb	$lasttick		# collect 1st tick
Packit c4476c
	li	$diff,0
Packit c4476c
Packit c4476c
	dcbf	0,$out			# flush cache line
Packit c4476c
	lwarx	$tick,0,$out		# load and lock
Packit c4476c
	add	$tick,$tick,$diff
Packit c4476c
	stwcx.	$tick,0,$out
Packit c4476c
	stwx	$tick,0,$out
Packit c4476c
Packit c4476c
	mftb	$tick			# collect 1st diff
Packit c4476c
	sub	$diff,$tick,$lasttick
Packit c4476c
	mr	$lasttick,$tick
Packit c4476c
	mr	$lastdiff,$diff
Packit c4476c
Loop2:
Packit c4476c
	dcbf	0,$out			# flush cache line
Packit c4476c
	lwarx	$tick,0,$out		# load and lock
Packit c4476c
	add	$tick,$tick,$diff
Packit c4476c
	stwcx.	$tick,0,$out
Packit c4476c
	stwx	$tick,0,$out
Packit c4476c
Packit c4476c
	addic.	$max,$max,-1
Packit c4476c
	beq	Ldone2
Packit c4476c
Packit c4476c
	mftb	$tick
Packit c4476c
	sub	$diff,$tick,$lasttick
Packit c4476c
	mr	$lasttick,$tick
Packit c4476c
	cmplw	7,$diff,$lastdiff
Packit c4476c
	mr	$lastdiff,$diff
Packit c4476c
Packit c4476c
	mfcr	$tick			# pull cr
Packit c4476c
	not	$tick,$tick		# flip bits
Packit c4476c
	rlwinm	$tick,$tick,1,29,29	# isolate flipped eq bit and scale
Packit c4476c
Packit c4476c
	sub.	$cnt,$cnt,$tick		# conditional --$cnt
Packit c4476c
	add	$out,$out,$tick		# conditional ++$out
Packit c4476c
	bne	Loop2
Packit c4476c
Packit c4476c
Ldone2:
Packit c4476c
	srwi	$cnt,$cnt,2
Packit c4476c
	sub	r3,r0,$cnt
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,3,0
Packit c4476c
	.long	0
Packit c4476c
.size	.OPENSSL_instrument_bus2_mftb,.-.OPENSSL_instrument_bus2_mftb
Packit c4476c
Packit c4476c
.globl	.OPENSSL_instrument_bus_mfspr268
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_instrument_bus_mfspr268:
Packit c4476c
	mtctr	$cnt
Packit c4476c
Packit c4476c
	mfspr	$lasttick,268		# collect 1st tick
Packit c4476c
	li	$diff,0
Packit c4476c
Packit c4476c
	dcbf	0,$out			# flush cache line
Packit c4476c
	lwarx	$tick,0,$out		# load and lock
Packit c4476c
	add	$tick,$tick,$diff
Packit c4476c
	stwcx.	$tick,0,$out
Packit c4476c
	stwx	$tick,0,$out
Packit c4476c
Packit c4476c
Loop3:	mfspr	$tick,268
Packit c4476c
	sub	$diff,$tick,$lasttick
Packit c4476c
	mr	$lasttick,$tick
Packit c4476c
	dcbf	0,$out			# flush cache line
Packit c4476c
	lwarx	$tick,0,$out		# load and lock
Packit c4476c
	add	$tick,$tick,$diff
Packit c4476c
	stwcx.	$tick,0,$out
Packit c4476c
	stwx	$tick,0,$out
Packit c4476c
	addi	$out,$out,4		# ++$out
Packit c4476c
	bdnz	Loop3
Packit c4476c
Packit c4476c
	mr	r3,$cnt
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,2,0
Packit c4476c
	.long	0
Packit c4476c
.size	.OPENSSL_instrument_bus_mfspr268,.-.OPENSSL_instrument_bus_mfspr268
Packit c4476c
Packit c4476c
.globl	.OPENSSL_instrument_bus2_mfspr268
Packit c4476c
.align	4
Packit c4476c
.OPENSSL_instrument_bus2_mfspr268:
Packit c4476c
	mr	r0,$cnt
Packit c4476c
	slwi	$cnt,$cnt,2
Packit c4476c
Packit c4476c
	mfspr	$lasttick,268		# collect 1st tick
Packit c4476c
	li	$diff,0
Packit c4476c
Packit c4476c
	dcbf	0,$out			# flush cache line
Packit c4476c
	lwarx	$tick,0,$out		# load and lock
Packit c4476c
	add	$tick,$tick,$diff
Packit c4476c
	stwcx.	$tick,0,$out
Packit c4476c
	stwx	$tick,0,$out
Packit c4476c
Packit c4476c
	mfspr	$tick,268		# collect 1st diff
Packit c4476c
	sub	$diff,$tick,$lasttick
Packit c4476c
	mr	$lasttick,$tick
Packit c4476c
	mr	$lastdiff,$diff
Packit c4476c
Loop4:
Packit c4476c
	dcbf	0,$out			# flush cache line
Packit c4476c
	lwarx	$tick,0,$out		# load and lock
Packit c4476c
	add	$tick,$tick,$diff
Packit c4476c
	stwcx.	$tick,0,$out
Packit c4476c
	stwx	$tick,0,$out
Packit c4476c
Packit c4476c
	addic.	$max,$max,-1
Packit c4476c
	beq	Ldone4
Packit c4476c
Packit c4476c
	mfspr	$tick,268
Packit c4476c
	sub	$diff,$tick,$lasttick
Packit c4476c
	mr	$lasttick,$tick
Packit c4476c
	cmplw	7,$diff,$lastdiff
Packit c4476c
	mr	$lastdiff,$diff
Packit c4476c
Packit c4476c
	mfcr	$tick			# pull cr
Packit c4476c
	not	$tick,$tick		# flip bits
Packit c4476c
	rlwinm	$tick,$tick,1,29,29	# isolate flipped eq bit and scale
Packit c4476c
Packit c4476c
	sub.	$cnt,$cnt,$tick		# conditional --$cnt
Packit c4476c
	add	$out,$out,$tick		# conditional ++$out
Packit c4476c
	bne	Loop4
Packit c4476c
Packit c4476c
Ldone4:
Packit c4476c
	srwi	$cnt,$cnt,2
Packit c4476c
	sub	r3,r0,$cnt
Packit c4476c
	blr
Packit c4476c
	.long	0
Packit c4476c
	.byte	0,12,0x14,0,0,0,3,0
Packit c4476c
	.long	0
Packit c4476c
.size	.OPENSSL_instrument_bus2_mfspr268,.-.OPENSSL_instrument_bus2_mfspr268
Packit c4476c
___
Packit c4476c
}
Packit c4476c
Packit c4476c
$code =~ s/\`([^\`]*)\`/eval $1/gem;
Packit c4476c
print $code;
Packit c4476c
close STDOUT or die "error closing STDOUT: $!";