ppccpuid.pl 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #!/usr/bin/env perl
  2. $flavour = shift;
  3. $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
  4. ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
  5. ( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
  6. die "can't locate ppc-xlate.pl";
  7. open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
  8. if ($flavour=~/64/) {
  9. $CMPLI="cmpldi";
  10. $SHRLI="srdi";
  11. $SIGNX="extsw";
  12. } else {
  13. $CMPLI="cmplwi";
  14. $SHRLI="srwi";
  15. $SIGNX="mr";
  16. }
  17. $code=<<___;
  18. .machine "any"
  19. .text
  20. .globl .OPENSSL_ppc64_probe
  21. .align 4
  22. .OPENSSL_ppc64_probe:
  23. fcfid f1,f1
  24. extrdi r0,r0,32,0
  25. blr
  26. .long 0
  27. .byte 0,12,0x14,0,0,0,0,0
  28. .globl .OPENSSL_altivec_probe
  29. .align 4
  30. .OPENSSL_altivec_probe:
  31. .long 0x10000484 # vor v0,v0,v0
  32. blr
  33. .long 0
  34. .byte 0,12,0x14,0,0,0,0,0
  35. .globl .OPENSSL_crypto207_probe
  36. .align 4
  37. .OPENSSL_crypto207_probe:
  38. .long 0x7C000E99 # lvx_u v0,0,r1
  39. .long 0x10000508 # vcipher v0,v0,v0
  40. blr
  41. .long 0
  42. .byte 0,12,0x14,0,0,0,0,0
  43. .size .OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
  44. .globl .OPENSSL_wipe_cpu
  45. .align 4
  46. .OPENSSL_wipe_cpu:
  47. xor r0,r0,r0
  48. fmr f0,f31
  49. fmr f1,f31
  50. fmr f2,f31
  51. mr r3,r1
  52. fmr f3,f31
  53. xor r4,r4,r4
  54. fmr f4,f31
  55. xor r5,r5,r5
  56. fmr f5,f31
  57. xor r6,r6,r6
  58. fmr f6,f31
  59. xor r7,r7,r7
  60. fmr f7,f31
  61. xor r8,r8,r8
  62. fmr f8,f31
  63. xor r9,r9,r9
  64. fmr f9,f31
  65. xor r10,r10,r10
  66. fmr f10,f31
  67. xor r11,r11,r11
  68. fmr f11,f31
  69. xor r12,r12,r12
  70. fmr f12,f31
  71. fmr f13,f31
  72. blr
  73. .long 0
  74. .byte 0,12,0x14,0,0,0,0,0
  75. .globl .OPENSSL_atomic_add
  76. .align 4
  77. .OPENSSL_atomic_add:
  78. Ladd: lwarx r5,0,r3
  79. add r0,r4,r5
  80. stwcx. r0,0,r3
  81. bne- Ladd
  82. $SIGNX r3,r0
  83. blr
  84. .long 0
  85. .byte 0,12,0x14,0,0,0,2,0
  86. .long 0
  87. .globl .OPENSSL_rdtsc
  88. .align 4
  89. .OPENSSL_rdtsc:
  90. mftb r3
  91. mftbu r4
  92. blr
  93. .long 0
  94. .byte 0,12,0x14,0,0,0,0,0
  95. .globl .OPENSSL_cleanse
  96. .align 4
  97. .OPENSSL_cleanse:
  98. $CMPLI r4,7
  99. li r0,0
  100. bge Lot
  101. $CMPLI r4,0
  102. beqlr-
  103. Little: mtctr r4
  104. stb r0,0(r3)
  105. addi r3,r3,1
  106. bdnz- \$-8
  107. blr
  108. Lot: andi. r5,r3,3
  109. beq Laligned
  110. stb r0,0(r3)
  111. subi r4,r4,1
  112. addi r3,r3,1
  113. b Lot
  114. Laligned:
  115. $SHRLI r5,r4,2
  116. mtctr r5
  117. stw r0,0(r3)
  118. addi r3,r3,4
  119. bdnz- \$-8
  120. andi. r4,r4,3
  121. bne Little
  122. blr
  123. .long 0
  124. .byte 0,12,0x14,0,0,0,2,0
  125. .long 0
  126. ___
  127. {
  128. my ($out,$cnt,$max)=("r3","r4","r5");
  129. my ($tick,$lasttick)=("r6","r7");
  130. my ($diff,$lastdiff)=("r8","r9");
  131. $code.=<<___;
  132. .globl .OPENSSL_instrument_bus
  133. .align 4
  134. .OPENSSL_instrument_bus:
  135. mtctr $cnt
  136. mftb $lasttick # collect 1st tick
  137. li $diff,0
  138. dcbf 0,$out # flush cache line
  139. lwarx $tick,0,$out # load and lock
  140. add $tick,$tick,$diff
  141. stwcx. $tick,0,$out
  142. stwx $tick,0,$out
  143. Loop: mftb $tick
  144. sub $diff,$tick,$lasttick
  145. mr $lasttick,$tick
  146. dcbf 0,$out # flush cache line
  147. lwarx $tick,0,$out # load and lock
  148. add $tick,$tick,$diff
  149. stwcx. $tick,0,$out
  150. stwx $tick,0,$out
  151. addi $out,$out,4 # ++$out
  152. bdnz Loop
  153. mr r3,$cnt
  154. blr
  155. .long 0
  156. .byte 0,12,0x14,0,0,0,2,0
  157. .long 0
  158. .globl .OPENSSL_instrument_bus2
  159. .align 4
  160. .OPENSSL_instrument_bus2:
  161. mr r0,$cnt
  162. slwi $cnt,$cnt,2
  163. mftb $lasttick # collect 1st tick
  164. li $diff,0
  165. dcbf 0,$out # flush cache line
  166. lwarx $tick,0,$out # load and lock
  167. add $tick,$tick,$diff
  168. stwcx. $tick,0,$out
  169. stwx $tick,0,$out
  170. mftb $tick # collect 1st diff
  171. sub $diff,$tick,$lasttick
  172. mr $lasttick,$tick
  173. mr $lastdiff,$diff
  174. Loop2:
  175. dcbf 0,$out # flush cache line
  176. lwarx $tick,0,$out # load and lock
  177. add $tick,$tick,$diff
  178. stwcx. $tick,0,$out
  179. stwx $tick,0,$out
  180. addic. $max,$max,-1
  181. beq Ldone2
  182. mftb $tick
  183. sub $diff,$tick,$lasttick
  184. mr $lasttick,$tick
  185. cmplw 7,$diff,$lastdiff
  186. mr $lastdiff,$diff
  187. mfcr $tick # pull cr
  188. not $tick,$tick # flip bits
  189. rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale
  190. sub. $cnt,$cnt,$tick # conditional --$cnt
  191. add $out,$out,$tick # conditional ++$out
  192. bne Loop2
  193. Ldone2:
  194. srwi $cnt,$cnt,2
  195. sub r3,r0,$cnt
  196. blr
  197. .long 0
  198. .byte 0,12,0x14,0,0,0,3,0
  199. .long 0
  200. ___
  201. }
  202. $code =~ s/\`([^\`]*)\`/eval $1/gem;
  203. print $code;
  204. close STDOUT;