1#! /usr/bin/env perl 2# Copyright 2007-2016 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 12$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 13( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or 14( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or 15die "can't locate ppc-xlate.pl"; 16 17open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!"; 18 19if ($flavour=~/64/) { 20 $CMPLI="cmpldi"; 21 $SHRLI="srdi"; 22 $SIGNX="extsw"; 23} else { 24 $CMPLI="cmplwi"; 25 $SHRLI="srwi"; 26 $SIGNX="mr"; 27} 28 29$code=<<___; 30.machine "any" 31.text 32 33.globl .OPENSSL_fpu_probe 34.align 4 35.OPENSSL_fpu_probe: 36 fmr f0,f0 37 blr 38 .long 0 39 .byte 0,12,0x14,0,0,0,0,0 40.size .OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe 41.globl .OPENSSL_ppc64_probe 42.align 4 43.OPENSSL_ppc64_probe: 44 fcfid f1,f1 45 extrdi r0,r0,32,0 46 blr 47 .long 0 48 .byte 0,12,0x14,0,0,0,0,0 49.size .OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe 50 51.globl .OPENSSL_altivec_probe 52.align 4 53.OPENSSL_altivec_probe: 54 .long 0x10000484 # vor v0,v0,v0 55 blr 56 .long 0 57 .byte 0,12,0x14,0,0,0,0,0 58.size .OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe 59 60.globl .OPENSSL_crypto207_probe 61.align 4 62.OPENSSL_crypto207_probe: 63 lvx_u v0,0,r1 64 vcipher v0,v0,v0 65 blr 66 .long 0 67 .byte 0,12,0x14,0,0,0,0,0 68.size .OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe 69 70.globl .OPENSSL_madd300_probe 71.align 4 72.OPENSSL_madd300_probe: 73 xor r0,r0,r0 74 maddld r3,r0,r0,r0 75 maddhdu r3,r0,r0,r0 76 blr 77 .long 0 78 .byte 0,12,0x14,0,0,0,0,0 79 80.globl .OPENSSL_wipe_cpu 81.align 4 82.OPENSSL_wipe_cpu: 83 xor r0,r0,r0 84 fmr f0,f31 85 fmr f1,f31 86 fmr f2,f31 87 mr r3,r1 88 fmr f3,f31 89 xor r4,r4,r4 90 fmr f4,f31 91 xor r5,r5,r5 92 fmr f5,f31 93 xor r6,r6,r6 94 fmr f6,f31 95 xor r7,r7,r7 96 fmr f7,f31 97 xor r8,r8,r8 98 fmr f8,f31 99 xor r9,r9,r9 100 fmr f9,f31 101 xor r10,r10,r10 102 fmr f10,f31 103 xor r11,r11,r11 104 fmr f11,f31 105 xor r12,r12,r12 106 fmr f12,f31 107 fmr f13,f31 108 blr 109 .long 0 110 .byte 0,12,0x14,0,0,0,0,0 111.size .OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu 112 113.globl .OPENSSL_atomic_add 114.align 4 115.OPENSSL_atomic_add: 116Ladd: lwarx r5,0,r3 117 add r0,r4,r5 118 stwcx. r0,0,r3 119 bne- Ladd 120 $SIGNX r3,r0 121 blr 122 .long 0 123 .byte 0,12,0x14,0,0,0,2,0 124 .long 0 125.size .OPENSSL_atomic_add,.-.OPENSSL_atomic_add 126 127.globl .OPENSSL_rdtsc 128.align 4 129.OPENSSL_rdtsc: 130___ 131$code.=<<___ if ($flavour =~ /64/); 132 mftb r3 133___ 134$code.=<<___ if ($flavour !~ /64/); 135Loop_rdtsc: 136 mftbu r5 137 mftb r3 138 mftbu r4 139 cmplw r4,r5 140 bne Loop_rdtsc 141___ 142$code.=<<___; 143 blr 144 .long 0 145 .byte 0,12,0x14,0,0,0,0,0 146.size .OPENSSL_rdtsc,.-.OPENSSL_rdtsc 147 148.globl .OPENSSL_cleanse 149.align 4 150.OPENSSL_cleanse: 151 $CMPLI r4,7 152 li r0,0 153 bge Lot 154 $CMPLI r4,0 155 beqlr- 156Little: mtctr r4 157 stb r0,0(r3) 158 addi r3,r3,1 159 bdnz \$-8 160 blr 161Lot: andi. r5,r3,3 162 beq Laligned 163 stb r0,0(r3) 164 subi r4,r4,1 165 addi r3,r3,1 166 b Lot 167Laligned: 168 $SHRLI r5,r4,2 169 mtctr r5 170 stw r0,0(r3) 171 addi r3,r3,4 172 bdnz \$-8 173 andi. r4,r4,3 174 bne Little 175 blr 176 .long 0 177 .byte 0,12,0x14,0,0,0,2,0 178 .long 0 179.size .OPENSSL_cleanse,.-.OPENSSL_cleanse 180 181globl .CRYPTO_memcmp 182.align 4 183.CRYPTO_memcmp: 184 $CMPLI r5,0 185 li r0,0 186 beq Lno_data 187 mtctr r5 188Loop_cmp: 189 lbz r6,0(r3) 190 addi r3,r3,1 191 lbz r7,0(r4) 192 addi r4,r4,1 193 xor r6,r6,r7 194 or r0,r0,r6 195 bdnz Loop_cmp 196 197Lno_data: 198 li r3,0 199 sub r3,r3,r0 200 extrwi r3,r3,1,0 201 blr 202 .long 0 203 .byte 0,12,0x14,0,0,0,3,0 204 .long 0 205.size .CRYPTO_memcmp,.-.CRYPTO_memcmp 206___ 207{ 208my ($out,$cnt,$max)=("r3","r4","r5"); 209my ($tick,$lasttick)=("r6","r7"); 210my ($diff,$lastdiff)=("r8","r9"); 211 212$code.=<<___; 213.globl .OPENSSL_instrument_bus 214.align 4 215.OPENSSL_instrument_bus: 216 mtctr $cnt 217 218 mftb $lasttick # collect 1st tick 219 li $diff,0 220 221 dcbf 0,$out # flush cache line 222 lwarx $tick,0,$out # load and lock 223 add $tick,$tick,$diff 224 stwcx. $tick,0,$out 225 stwx $tick,0,$out 226 227Loop: mftb $tick 228 sub $diff,$tick,$lasttick 229 mr $lasttick,$tick 230 dcbf 0,$out # flush cache line 231 lwarx $tick,0,$out # load and lock 232 add $tick,$tick,$diff 233 stwcx. $tick,0,$out 234 stwx $tick,0,$out 235 addi $out,$out,4 # ++$out 236 bdnz Loop 237 238 mr r3,$cnt 239 blr 240 .long 0 241 .byte 0,12,0x14,0,0,0,2,0 242 .long 0 243.size .OPENSSL_instrument_bus,.-.OPENSSL_instrument_bus 244 245.globl .OPENSSL_instrument_bus2 246.align 4 247.OPENSSL_instrument_bus2: 248 mr r0,$cnt 249 slwi $cnt,$cnt,2 250 251 mftb $lasttick # collect 1st tick 252 li $diff,0 253 254 dcbf 0,$out # flush cache line 255 lwarx $tick,0,$out # load and lock 256 add $tick,$tick,$diff 257 stwcx. $tick,0,$out 258 stwx $tick,0,$out 259 260 mftb $tick # collect 1st diff 261 sub $diff,$tick,$lasttick 262 mr $lasttick,$tick 263 mr $lastdiff,$diff 264Loop2: 265 dcbf 0,$out # flush cache line 266 lwarx $tick,0,$out # load and lock 267 add $tick,$tick,$diff 268 stwcx. $tick,0,$out 269 stwx $tick,0,$out 270 271 addic. $max,$max,-1 272 beq Ldone2 273 274 mftb $tick 275 sub $diff,$tick,$lasttick 276 mr $lasttick,$tick 277 cmplw 7,$diff,$lastdiff 278 mr $lastdiff,$diff 279 280 mfcr $tick # pull cr 281 not $tick,$tick # flip bits 282 rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale 283 284 sub. $cnt,$cnt,$tick # conditional --$cnt 285 add $out,$out,$tick # conditional ++$out 286 bne Loop2 287 288Ldone2: 289 srwi $cnt,$cnt,2 290 sub r3,r0,$cnt 291 blr 292 .long 0 293 .byte 0,12,0x14,0,0,0,3,0 294 .long 0 295.size .OPENSSL_instrument_bus2,.-.OPENSSL_instrument_bus2 296___ 297} 298 299$code =~ s/\`([^\`]*)\`/eval $1/gem; 300print $code; 301close STDOUT; 302