aes-spe-core.S 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Fast AES implementation for SPE instruction set (PPC)
  4. *
  5. * This code makes use of the SPE SIMD instruction set as defined in
  6. * http://cache.freescale.com/files/32bit/doc/ref_manual/SPEPIM.pdf
  7. * Implementation is based on optimization guide notes from
  8. * http://cache.freescale.com/files/32bit/doc/app_note/AN2665.pdf
  9. *
  10. * Copyright (c) 2015 Markus Stockhausen <stockhausen@collogia.de>
  11. */
  12. #include <asm/ppc_asm.h>
  13. #include "aes-spe-regs.h"
  14. #define EAD(in, bpos) \
  15. rlwimi rT0,in,28-((bpos+3)%4)*8,20,27;
  16. #define DAD(in, bpos) \
  17. rlwimi rT1,in,24-((bpos+3)%4)*8,24,31;
  18. #define LWH(out, off) \
  19. evlwwsplat out,off(rT0); /* load word high */
  20. #define LWL(out, off) \
  21. lwz out,off(rT0); /* load word low */
  22. #define LBZ(out, tab, off) \
  23. lbz out,off(tab); /* load byte */
  24. #define LAH(out, in, bpos, off) \
  25. EAD(in, bpos) /* calc addr + load word high */ \
  26. LWH(out, off)
  27. #define LAL(out, in, bpos, off) \
  28. EAD(in, bpos) /* calc addr + load word low */ \
  29. LWL(out, off)
  30. #define LAE(out, in, bpos) \
  31. EAD(in, bpos) /* calc addr + load enc byte */ \
  32. LBZ(out, rT0, 8)
  33. #define LBE(out) \
  34. LBZ(out, rT0, 8) /* load enc byte */
  35. #define LAD(out, in, bpos) \
  36. DAD(in, bpos) /* calc addr + load dec byte */ \
  37. LBZ(out, rT1, 0)
  38. #define LBD(out) \
  39. LBZ(out, rT1, 0)
  40. /*
  41. * ppc_encrypt_block: The central encryption function for a single 16 bytes
  42. * block. It does no stack handling or register saving to support fast calls
  43. * via bl/blr. It expects that caller has pre-xored input data with first
  44. * 4 words of encryption key into rD0-rD3. Pointer/counter registers must
  45. * have also been set up before (rT0, rKP, CTR). Output is stored in rD0-rD3
  46. * and rW0-rW3 and caller must execute a final xor on the output registers.
  47. * All working registers rD0-rD3 & rW0-rW7 are overwritten during processing.
  48. *
  49. */
  50. _GLOBAL(ppc_encrypt_block)
  51. LAH(rW4, rD1, 2, 4)
  52. LAH(rW6, rD0, 3, 0)
  53. LAH(rW3, rD0, 1, 8)
  54. ppc_encrypt_block_loop:
  55. LAH(rW0, rD3, 0, 12)
  56. LAL(rW0, rD0, 0, 12)
  57. LAH(rW1, rD1, 0, 12)
  58. LAH(rW2, rD2, 1, 8)
  59. LAL(rW2, rD3, 1, 8)
  60. LAL(rW3, rD1, 1, 8)
  61. LAL(rW4, rD2, 2, 4)
  62. LAL(rW6, rD1, 3, 0)
  63. LAH(rW5, rD3, 2, 4)
  64. LAL(rW5, rD0, 2, 4)
  65. LAH(rW7, rD2, 3, 0)
  66. evldw rD1,16(rKP)
  67. EAD(rD3, 3)
  68. evxor rW2,rW2,rW4
  69. LWL(rW7, 0)
  70. evxor rW2,rW2,rW6
  71. EAD(rD2, 0)
  72. evxor rD1,rD1,rW2
  73. LWL(rW1, 12)
  74. evxor rD1,rD1,rW0
  75. evldw rD3,24(rKP)
  76. evmergehi rD0,rD0,rD1
  77. EAD(rD1, 2)
  78. evxor rW3,rW3,rW5
  79. LWH(rW4, 4)
  80. evxor rW3,rW3,rW7
  81. EAD(rD0, 3)
  82. evxor rD3,rD3,rW3
  83. LWH(rW6, 0)
  84. evxor rD3,rD3,rW1
  85. EAD(rD0, 1)
  86. evmergehi rD2,rD2,rD3
  87. LWH(rW3, 8)
  88. LAH(rW0, rD3, 0, 12)
  89. LAL(rW0, rD0, 0, 12)
  90. LAH(rW1, rD1, 0, 12)
  91. LAH(rW2, rD2, 1, 8)
  92. LAL(rW2, rD3, 1, 8)
  93. LAL(rW3, rD1, 1, 8)
  94. LAL(rW4, rD2, 2, 4)
  95. LAL(rW6, rD1, 3, 0)
  96. LAH(rW5, rD3, 2, 4)
  97. LAL(rW5, rD0, 2, 4)
  98. LAH(rW7, rD2, 3, 0)
  99. evldw rD1,32(rKP)
  100. EAD(rD3, 3)
  101. evxor rW2,rW2,rW4
  102. LWL(rW7, 0)
  103. evxor rW2,rW2,rW6
  104. EAD(rD2, 0)
  105. evxor rD1,rD1,rW2
  106. LWL(rW1, 12)
  107. evxor rD1,rD1,rW0
  108. evldw rD3,40(rKP)
  109. evmergehi rD0,rD0,rD1
  110. EAD(rD1, 2)
  111. evxor rW3,rW3,rW5
  112. LWH(rW4, 4)
  113. evxor rW3,rW3,rW7
  114. EAD(rD0, 3)
  115. evxor rD3,rD3,rW3
  116. LWH(rW6, 0)
  117. evxor rD3,rD3,rW1
  118. EAD(rD0, 1)
  119. evmergehi rD2,rD2,rD3
  120. LWH(rW3, 8)
  121. addi rKP,rKP,32
  122. bdnz ppc_encrypt_block_loop
  123. LAH(rW0, rD3, 0, 12)
  124. LAL(rW0, rD0, 0, 12)
  125. LAH(rW1, rD1, 0, 12)
  126. LAH(rW2, rD2, 1, 8)
  127. LAL(rW2, rD3, 1, 8)
  128. LAL(rW3, rD1, 1, 8)
  129. LAL(rW4, rD2, 2, 4)
  130. LAH(rW5, rD3, 2, 4)
  131. LAL(rW6, rD1, 3, 0)
  132. LAL(rW5, rD0, 2, 4)
  133. LAH(rW7, rD2, 3, 0)
  134. evldw rD1,16(rKP)
  135. EAD(rD3, 3)
  136. evxor rW2,rW2,rW4
  137. LWL(rW7, 0)
  138. evxor rW2,rW2,rW6
  139. EAD(rD2, 0)
  140. evxor rD1,rD1,rW2
  141. LWL(rW1, 12)
  142. evxor rD1,rD1,rW0
  143. evldw rD3,24(rKP)
  144. evmergehi rD0,rD0,rD1
  145. EAD(rD1, 0)
  146. evxor rW3,rW3,rW5
  147. LBE(rW2)
  148. evxor rW3,rW3,rW7
  149. EAD(rD0, 1)
  150. evxor rD3,rD3,rW3
  151. LBE(rW6)
  152. evxor rD3,rD3,rW1
  153. EAD(rD0, 0)
  154. evmergehi rD2,rD2,rD3
  155. LBE(rW1)
  156. LAE(rW0, rD3, 0)
  157. LAE(rW1, rD0, 0)
  158. LAE(rW4, rD2, 1)
  159. LAE(rW5, rD3, 1)
  160. LAE(rW3, rD2, 0)
  161. LAE(rW7, rD1, 1)
  162. rlwimi rW0,rW4,8,16,23
  163. rlwimi rW1,rW5,8,16,23
  164. LAE(rW4, rD1, 2)
  165. LAE(rW5, rD2, 2)
  166. rlwimi rW2,rW6,8,16,23
  167. rlwimi rW3,rW7,8,16,23
  168. LAE(rW6, rD3, 2)
  169. LAE(rW7, rD0, 2)
  170. rlwimi rW0,rW4,16,8,15
  171. rlwimi rW1,rW5,16,8,15
  172. LAE(rW4, rD0, 3)
  173. LAE(rW5, rD1, 3)
  174. rlwimi rW2,rW6,16,8,15
  175. lwz rD0,32(rKP)
  176. rlwimi rW3,rW7,16,8,15
  177. lwz rD1,36(rKP)
  178. LAE(rW6, rD2, 3)
  179. LAE(rW7, rD3, 3)
  180. rlwimi rW0,rW4,24,0,7
  181. lwz rD2,40(rKP)
  182. rlwimi rW1,rW5,24,0,7
  183. lwz rD3,44(rKP)
  184. rlwimi rW2,rW6,24,0,7
  185. rlwimi rW3,rW7,24,0,7
  186. blr
  187. /*
  188. * ppc_decrypt_block: The central decryption function for a single 16 bytes
  189. * block. It does no stack handling or register saving to support fast calls
  190. * via bl/blr. It expects that caller has pre-xored input data with first
  191. * 4 words of encryption key into rD0-rD3. Pointer/counter registers must
  192. * have also been set up before (rT0, rKP, CTR). Output is stored in rD0-rD3
  193. * and rW0-rW3 and caller must execute a final xor on the output registers.
  194. * All working registers rD0-rD3 & rW0-rW7 are overwritten during processing.
  195. *
  196. */
  197. _GLOBAL(ppc_decrypt_block)
  198. LAH(rW0, rD1, 0, 12)
  199. LAH(rW6, rD0, 3, 0)
  200. LAH(rW3, rD0, 1, 8)
  201. ppc_decrypt_block_loop:
  202. LAH(rW1, rD3, 0, 12)
  203. LAL(rW0, rD2, 0, 12)
  204. LAH(rW2, rD2, 1, 8)
  205. LAL(rW2, rD3, 1, 8)
  206. LAH(rW4, rD3, 2, 4)
  207. LAL(rW4, rD0, 2, 4)
  208. LAL(rW6, rD1, 3, 0)
  209. LAH(rW5, rD1, 2, 4)
  210. LAH(rW7, rD2, 3, 0)
  211. LAL(rW7, rD3, 3, 0)
  212. LAL(rW3, rD1, 1, 8)
  213. evldw rD1,16(rKP)
  214. EAD(rD0, 0)
  215. evxor rW4,rW4,rW6
  216. LWL(rW1, 12)
  217. evxor rW0,rW0,rW4
  218. EAD(rD2, 2)
  219. evxor rW0,rW0,rW2
  220. LWL(rW5, 4)
  221. evxor rD1,rD1,rW0
  222. evldw rD3,24(rKP)
  223. evmergehi rD0,rD0,rD1
  224. EAD(rD1, 0)
  225. evxor rW3,rW3,rW7
  226. LWH(rW0, 12)
  227. evxor rW3,rW3,rW1
  228. EAD(rD0, 3)
  229. evxor rD3,rD3,rW3
  230. LWH(rW6, 0)
  231. evxor rD3,rD3,rW5
  232. EAD(rD0, 1)
  233. evmergehi rD2,rD2,rD3
  234. LWH(rW3, 8)
  235. LAH(rW1, rD3, 0, 12)
  236. LAL(rW0, rD2, 0, 12)
  237. LAH(rW2, rD2, 1, 8)
  238. LAL(rW2, rD3, 1, 8)
  239. LAH(rW4, rD3, 2, 4)
  240. LAL(rW4, rD0, 2, 4)
  241. LAL(rW6, rD1, 3, 0)
  242. LAH(rW5, rD1, 2, 4)
  243. LAH(rW7, rD2, 3, 0)
  244. LAL(rW7, rD3, 3, 0)
  245. LAL(rW3, rD1, 1, 8)
  246. evldw rD1,32(rKP)
  247. EAD(rD0, 0)
  248. evxor rW4,rW4,rW6
  249. LWL(rW1, 12)
  250. evxor rW0,rW0,rW4
  251. EAD(rD2, 2)
  252. evxor rW0,rW0,rW2
  253. LWL(rW5, 4)
  254. evxor rD1,rD1,rW0
  255. evldw rD3,40(rKP)
  256. evmergehi rD0,rD0,rD1
  257. EAD(rD1, 0)
  258. evxor rW3,rW3,rW7
  259. LWH(rW0, 12)
  260. evxor rW3,rW3,rW1
  261. EAD(rD0, 3)
  262. evxor rD3,rD3,rW3
  263. LWH(rW6, 0)
  264. evxor rD3,rD3,rW5
  265. EAD(rD0, 1)
  266. evmergehi rD2,rD2,rD3
  267. LWH(rW3, 8)
  268. addi rKP,rKP,32
  269. bdnz ppc_decrypt_block_loop
  270. LAH(rW1, rD3, 0, 12)
  271. LAL(rW0, rD2, 0, 12)
  272. LAH(rW2, rD2, 1, 8)
  273. LAL(rW2, rD3, 1, 8)
  274. LAH(rW4, rD3, 2, 4)
  275. LAL(rW4, rD0, 2, 4)
  276. LAL(rW6, rD1, 3, 0)
  277. LAH(rW5, rD1, 2, 4)
  278. LAH(rW7, rD2, 3, 0)
  279. LAL(rW7, rD3, 3, 0)
  280. LAL(rW3, rD1, 1, 8)
  281. evldw rD1,16(rKP)
  282. EAD(rD0, 0)
  283. evxor rW4,rW4,rW6
  284. LWL(rW1, 12)
  285. evxor rW0,rW0,rW4
  286. EAD(rD2, 2)
  287. evxor rW0,rW0,rW2
  288. LWL(rW5, 4)
  289. evxor rD1,rD1,rW0
  290. evldw rD3,24(rKP)
  291. evmergehi rD0,rD0,rD1
  292. DAD(rD1, 0)
  293. evxor rW3,rW3,rW7
  294. LBD(rW0)
  295. evxor rW3,rW3,rW1
  296. DAD(rD0, 1)
  297. evxor rD3,rD3,rW3
  298. LBD(rW6)
  299. evxor rD3,rD3,rW5
  300. DAD(rD0, 0)
  301. evmergehi rD2,rD2,rD3
  302. LBD(rW3)
  303. LAD(rW2, rD3, 0)
  304. LAD(rW1, rD2, 0)
  305. LAD(rW4, rD2, 1)
  306. LAD(rW5, rD3, 1)
  307. LAD(rW7, rD1, 1)
  308. rlwimi rW0,rW4,8,16,23
  309. rlwimi rW1,rW5,8,16,23
  310. LAD(rW4, rD3, 2)
  311. LAD(rW5, rD0, 2)
  312. rlwimi rW2,rW6,8,16,23
  313. rlwimi rW3,rW7,8,16,23
  314. LAD(rW6, rD1, 2)
  315. LAD(rW7, rD2, 2)
  316. rlwimi rW0,rW4,16,8,15
  317. rlwimi rW1,rW5,16,8,15
  318. LAD(rW4, rD0, 3)
  319. LAD(rW5, rD1, 3)
  320. rlwimi rW2,rW6,16,8,15
  321. lwz rD0,32(rKP)
  322. rlwimi rW3,rW7,16,8,15
  323. lwz rD1,36(rKP)
  324. LAD(rW6, rD2, 3)
  325. LAD(rW7, rD3, 3)
  326. rlwimi rW0,rW4,24,0,7
  327. lwz rD2,40(rKP)
  328. rlwimi rW1,rW5,24,0,7
  329. lwz rD3,44(rKP)
  330. rlwimi rW2,rW6,24,0,7
  331. rlwimi rW3,rW7,24,0,7
  332. blr