| #! /usr/bin/env perl |
| # Copyright 2007-2022 The OpenSSL Project Authors. All Rights Reserved. |
| # |
| # Licensed under the Apache License 2.0 (the "License"). You may not use |
| # this file except in compliance with the License. You can obtain a copy |
| # in the file LICENSE in the source distribution or at |
| # https://www.openssl.org/source/license.html |
| |
| |
| # $output is the last argument if it looks like a file (it has an extension) |
| # $flavour is the first argument if it doesn't look like a file |
| $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef; |
| $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef; |
| |
| $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; |
| ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or |
| ( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or |
| die "can't locate ppc-xlate.pl"; |
| |
| open STDOUT,"| $^X $xlate $flavour \"$output\"" |
| or die "can't call $xlate: $!"; |
| |
| if ($flavour=~/64/) { |
| $CMPLI="cmpldi"; |
| $SHRLI="srdi"; |
| $SIGNX="extsw"; |
| } else { |
| $CMPLI="cmplwi"; |
| $SHRLI="srwi"; |
| $SIGNX="mr"; |
| } |
| |
| $code=<<___; |
| .machine "any" |
| .text |
| |
| .globl .OPENSSL_fpu_probe |
| .align 4 |
| .OPENSSL_fpu_probe: |
| fmr f0,f0 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,0,0 |
| .size .OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe |
| .globl .OPENSSL_ppc64_probe |
| .align 4 |
| .OPENSSL_ppc64_probe: |
| fcfid f1,f1 |
| extrdi r0,r0,32,0 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,0,0 |
| .size .OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe |
| |
| .globl .OPENSSL_altivec_probe |
| .align 4 |
| .OPENSSL_altivec_probe: |
| .long 0x10000484 # vor v0,v0,v0 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,0,0 |
| .size .OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe |
| |
| .globl .OPENSSL_crypto207_probe |
| .align 4 |
| .OPENSSL_crypto207_probe: |
| lvx_u v0,0,r1 |
| vcipher v0,v0,v0 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,0,0 |
| .size .OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe |
| |
| .globl .OPENSSL_madd300_probe |
| .align 4 |
| .OPENSSL_madd300_probe: |
| xor r0,r0,r0 |
| maddld r3,r0,r0,r0 |
| maddhdu r3,r0,r0,r0 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,0,0 |
| |
| .globl .OPENSSL_brd31_probe |
| .align 4 |
| .OPENSSL_brd31_probe: |
| xor r0,r0,r0 |
| brd r3,r0 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,0,0 |
| .size .OPENSSL_brd31_probe,.-.OPENSSL_brd31_probe |
| |
| |
| .globl .OPENSSL_wipe_cpu |
| .align 4 |
| .OPENSSL_wipe_cpu: |
| xor r0,r0,r0 |
| fmr f0,f31 |
| fmr f1,f31 |
| fmr f2,f31 |
| mr r3,r1 |
| fmr f3,f31 |
| xor r4,r4,r4 |
| fmr f4,f31 |
| xor r5,r5,r5 |
| fmr f5,f31 |
| xor r6,r6,r6 |
| fmr f6,f31 |
| xor r7,r7,r7 |
| fmr f7,f31 |
| xor r8,r8,r8 |
| fmr f8,f31 |
| xor r9,r9,r9 |
| fmr f9,f31 |
| xor r10,r10,r10 |
| fmr f10,f31 |
| xor r11,r11,r11 |
| fmr f11,f31 |
| xor r12,r12,r12 |
| fmr f12,f31 |
| fmr f13,f31 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,0,0 |
| .size .OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu |
| |
| .globl .OPENSSL_atomic_add |
| .align 4 |
| .OPENSSL_atomic_add: |
| Ladd: lwarx r5,0,r3 |
| add r0,r4,r5 |
| stwcx. r0,0,r3 |
| bne- Ladd |
| $SIGNX r3,r0 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,2,0 |
| .long 0 |
| .size .OPENSSL_atomic_add,.-.OPENSSL_atomic_add |
| |
| .globl .OPENSSL_rdtsc_mftb |
| .align 4 |
| .OPENSSL_rdtsc_mftb: |
| mftb r3 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,0,0 |
| .size .OPENSSL_rdtsc_mftb,.-.OPENSSL_rdtsc_mftb |
| |
| .globl .OPENSSL_rdtsc_mfspr268 |
| .align 4 |
| .OPENSSL_rdtsc_mfspr268: |
| mfspr r3,268 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,0,0 |
| .size .OPENSSL_rdtsc_mfspr268,.-.OPENSSL_rdtsc_mfspr268 |
| |
| .globl .OPENSSL_cleanse |
| .align 4 |
| .OPENSSL_cleanse: |
| $CMPLI r4,7 |
| li r0,0 |
| bge Lot |
| $CMPLI r4,0 |
| beqlr- |
| Little: mtctr r4 |
| stb r0,0(r3) |
| addi r3,r3,1 |
| bdnz \$-8 |
| blr |
| Lot: andi. r5,r3,3 |
| beq Laligned |
| stb r0,0(r3) |
| subi r4,r4,1 |
| addi r3,r3,1 |
| b Lot |
| Laligned: |
| $SHRLI r5,r4,2 |
| mtctr r5 |
| stw r0,0(r3) |
| addi r3,r3,4 |
| bdnz \$-8 |
| andi. r4,r4,3 |
| bne Little |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,2,0 |
| .long 0 |
| .size .OPENSSL_cleanse,.-.OPENSSL_cleanse |
| |
| globl .CRYPTO_memcmp |
| .align 4 |
| .CRYPTO_memcmp: |
| $CMPLI r5,0 |
| li r0,0 |
| beq Lno_data |
| mtctr r5 |
| Loop_cmp: |
| lbz r6,0(r3) |
| addi r3,r3,1 |
| lbz r7,0(r4) |
| addi r4,r4,1 |
| xor r6,r6,r7 |
| or r0,r0,r6 |
| bdnz Loop_cmp |
| |
| Lno_data: |
| li r3,0 |
| sub r3,r3,r0 |
| extrwi r3,r3,1,0 |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,3,0 |
| .long 0 |
| .size .CRYPTO_memcmp,.-.CRYPTO_memcmp |
| ___ |
| { |
| my ($out,$cnt,$max)=("r3","r4","r5"); |
| my ($tick,$lasttick)=("r6","r7"); |
| my ($diff,$lastdiff)=("r8","r9"); |
| |
| $code.=<<___; |
| .globl .OPENSSL_instrument_bus_mftb |
| .align 4 |
| .OPENSSL_instrument_bus_mftb: |
| mtctr $cnt |
| |
| mftb $lasttick # collect 1st tick |
| li $diff,0 |
| |
| dcbf 0,$out # flush cache line |
| lwarx $tick,0,$out # load and lock |
| add $tick,$tick,$diff |
| stwcx. $tick,0,$out |
| stwx $tick,0,$out |
| |
| Loop: mftb $tick |
| sub $diff,$tick,$lasttick |
| mr $lasttick,$tick |
| dcbf 0,$out # flush cache line |
| lwarx $tick,0,$out # load and lock |
| add $tick,$tick,$diff |
| stwcx. $tick,0,$out |
| stwx $tick,0,$out |
| addi $out,$out,4 # ++$out |
| bdnz Loop |
| |
| mr r3,$cnt |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,2,0 |
| .long 0 |
| .size .OPENSSL_instrument_bus_mftb,.-.OPENSSL_instrument_bus_mftb |
| |
| .globl .OPENSSL_instrument_bus2_mftb |
| .align 4 |
| .OPENSSL_instrument_bus2_mftb: |
| mr r0,$cnt |
| slwi $cnt,$cnt,2 |
| |
| mftb $lasttick # collect 1st tick |
| li $diff,0 |
| |
| dcbf 0,$out # flush cache line |
| lwarx $tick,0,$out # load and lock |
| add $tick,$tick,$diff |
| stwcx. $tick,0,$out |
| stwx $tick,0,$out |
| |
| mftb $tick # collect 1st diff |
| sub $diff,$tick,$lasttick |
| mr $lasttick,$tick |
| mr $lastdiff,$diff |
| Loop2: |
| dcbf 0,$out # flush cache line |
| lwarx $tick,0,$out # load and lock |
| add $tick,$tick,$diff |
| stwcx. $tick,0,$out |
| stwx $tick,0,$out |
| |
| addic. $max,$max,-1 |
| beq Ldone2 |
| |
| mftb $tick |
| sub $diff,$tick,$lasttick |
| mr $lasttick,$tick |
| cmplw 7,$diff,$lastdiff |
| mr $lastdiff,$diff |
| |
| mfcr $tick # pull cr |
| not $tick,$tick # flip bits |
| rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale |
| |
| sub. $cnt,$cnt,$tick # conditional --$cnt |
| add $out,$out,$tick # conditional ++$out |
| bne Loop2 |
| |
| Ldone2: |
| srwi $cnt,$cnt,2 |
| sub r3,r0,$cnt |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,3,0 |
| .long 0 |
| .size .OPENSSL_instrument_bus2_mftb,.-.OPENSSL_instrument_bus2_mftb |
| |
| .globl .OPENSSL_instrument_bus_mfspr268 |
| .align 4 |
| .OPENSSL_instrument_bus_mfspr268: |
| mtctr $cnt |
| |
| mfspr $lasttick,268 # collect 1st tick |
| li $diff,0 |
| |
| dcbf 0,$out # flush cache line |
| lwarx $tick,0,$out # load and lock |
| add $tick,$tick,$diff |
| stwcx. $tick,0,$out |
| stwx $tick,0,$out |
| |
| Loop3: mfspr $tick,268 |
| sub $diff,$tick,$lasttick |
| mr $lasttick,$tick |
| dcbf 0,$out # flush cache line |
| lwarx $tick,0,$out # load and lock |
| add $tick,$tick,$diff |
| stwcx. $tick,0,$out |
| stwx $tick,0,$out |
| addi $out,$out,4 # ++$out |
| bdnz Loop3 |
| |
| mr r3,$cnt |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,2,0 |
| .long 0 |
| .size .OPENSSL_instrument_bus_mfspr268,.-.OPENSSL_instrument_bus_mfspr268 |
| |
| .globl .OPENSSL_instrument_bus2_mfspr268 |
| .align 4 |
| .OPENSSL_instrument_bus2_mfspr268: |
| mr r0,$cnt |
| slwi $cnt,$cnt,2 |
| |
| mfspr $lasttick,268 # collect 1st tick |
| li $diff,0 |
| |
| dcbf 0,$out # flush cache line |
| lwarx $tick,0,$out # load and lock |
| add $tick,$tick,$diff |
| stwcx. $tick,0,$out |
| stwx $tick,0,$out |
| |
| mfspr $tick,268 # collect 1st diff |
| sub $diff,$tick,$lasttick |
| mr $lasttick,$tick |
| mr $lastdiff,$diff |
| Loop4: |
| dcbf 0,$out # flush cache line |
| lwarx $tick,0,$out # load and lock |
| add $tick,$tick,$diff |
| stwcx. $tick,0,$out |
| stwx $tick,0,$out |
| |
| addic. $max,$max,-1 |
| beq Ldone4 |
| |
| mfspr $tick,268 |
| sub $diff,$tick,$lasttick |
| mr $lasttick,$tick |
| cmplw 7,$diff,$lastdiff |
| mr $lastdiff,$diff |
| |
| mfcr $tick # pull cr |
| not $tick,$tick # flip bits |
| rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale |
| |
| sub. $cnt,$cnt,$tick # conditional --$cnt |
| add $out,$out,$tick # conditional ++$out |
| bne Loop4 |
| |
| Ldone4: |
| srwi $cnt,$cnt,2 |
| sub r3,r0,$cnt |
| blr |
| .long 0 |
| .byte 0,12,0x14,0,0,0,3,0 |
| .long 0 |
| .size .OPENSSL_instrument_bus2_mfspr268,.-.OPENSSL_instrument_bus2_mfspr268 |
| ___ |
| } |
| |
| $code =~ s/\`([^\`]*)\`/eval $1/gem; |
| print $code; |
| close STDOUT or die "error closing STDOUT: $!"; |