xref: /openbmc/qemu/tests/tcg/ppc64/test-aes.c (revision 2ff49e96accc8fd9a38e9abd16f0cfa0adab1605)
1*ca1e9c3bSRichard Henderson /* SPDX-License-Identifier: GPL-2.0-or-later */
2*ca1e9c3bSRichard Henderson 
3*ca1e9c3bSRichard Henderson #include "../multiarch/test-aes-main.c.inc"
4*ca1e9c3bSRichard Henderson 
5*ca1e9c3bSRichard Henderson #undef BIG_ENDIAN
6*ca1e9c3bSRichard Henderson #define BIG_ENDIAN  (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
7*ca1e9c3bSRichard Henderson 
8*ca1e9c3bSRichard Henderson static unsigned char bswap_le[16] __attribute__((aligned(16))) = {
9*ca1e9c3bSRichard Henderson     8,9,10,11,12,13,14,15,
10*ca1e9c3bSRichard Henderson     0,1,2,3,4,5,6,7
11*ca1e9c3bSRichard Henderson };
12*ca1e9c3bSRichard Henderson 
test_SB_SR(uint8_t * o,const uint8_t * i)13*ca1e9c3bSRichard Henderson bool test_SB_SR(uint8_t *o, const uint8_t *i)
14*ca1e9c3bSRichard Henderson {
15*ca1e9c3bSRichard Henderson     /* vcipherlast also adds round key, so supply zero. */
16*ca1e9c3bSRichard Henderson     if (BIG_ENDIAN) {
17*ca1e9c3bSRichard Henderson         asm("lxvd2x 32,0,%1\n\t"
18*ca1e9c3bSRichard Henderson             "vspltisb 1,0\n\t"
19*ca1e9c3bSRichard Henderson             "vcipherlast 0,0,1\n\t"
20*ca1e9c3bSRichard Henderson             "stxvd2x 32,0,%0"
21*ca1e9c3bSRichard Henderson             : : "r"(o), "r"(i) : "memory", "v0", "v1");
22*ca1e9c3bSRichard Henderson     } else {
23*ca1e9c3bSRichard Henderson         asm("lxvd2x 32,0,%1\n\t"
24*ca1e9c3bSRichard Henderson             "lxvd2x 34,0,%2\n\t"
25*ca1e9c3bSRichard Henderson             "vspltisb 1,0\n\t"
26*ca1e9c3bSRichard Henderson             "vperm 0,0,0,2\n\t"
27*ca1e9c3bSRichard Henderson             "vcipherlast 0,0,1\n\t"
28*ca1e9c3bSRichard Henderson             "vperm 0,0,0,2\n\t"
29*ca1e9c3bSRichard Henderson             "stxvd2x 32,0,%0"
30*ca1e9c3bSRichard Henderson             : : "r"(o), "r"(i), "r"(bswap_le) : "memory", "v0", "v1", "v2");
31*ca1e9c3bSRichard Henderson     }
32*ca1e9c3bSRichard Henderson     return true;
33*ca1e9c3bSRichard Henderson }
34*ca1e9c3bSRichard Henderson 
test_MC(uint8_t * o,const uint8_t * i)35*ca1e9c3bSRichard Henderson bool test_MC(uint8_t *o, const uint8_t *i)
36*ca1e9c3bSRichard Henderson {
37*ca1e9c3bSRichard Henderson     return false;
38*ca1e9c3bSRichard Henderson }
39*ca1e9c3bSRichard Henderson 
test_SB_SR_MC_AK(uint8_t * o,const uint8_t * i,const uint8_t * k)40*ca1e9c3bSRichard Henderson bool test_SB_SR_MC_AK(uint8_t *o, const uint8_t *i, const uint8_t *k)
41*ca1e9c3bSRichard Henderson {
42*ca1e9c3bSRichard Henderson     if (BIG_ENDIAN) {
43*ca1e9c3bSRichard Henderson         asm("lxvd2x 32,0,%1\n\t"
44*ca1e9c3bSRichard Henderson             "lxvd2x 33,0,%2\n\t"
45*ca1e9c3bSRichard Henderson             "vcipher 0,0,1\n\t"
46*ca1e9c3bSRichard Henderson             "stxvd2x 32,0,%0"
47*ca1e9c3bSRichard Henderson             : : "r"(o), "r"(i), "r"(k) : "memory", "v0", "v1");
48*ca1e9c3bSRichard Henderson     } else {
49*ca1e9c3bSRichard Henderson         asm("lxvd2x 32,0,%1\n\t"
50*ca1e9c3bSRichard Henderson             "lxvd2x 33,0,%2\n\t"
51*ca1e9c3bSRichard Henderson             "lxvd2x 34,0,%3\n\t"
52*ca1e9c3bSRichard Henderson             "vperm 0,0,0,2\n\t"
53*ca1e9c3bSRichard Henderson             "vperm 1,1,1,2\n\t"
54*ca1e9c3bSRichard Henderson             "vcipher 0,0,1\n\t"
55*ca1e9c3bSRichard Henderson             "vperm 0,0,0,2\n\t"
56*ca1e9c3bSRichard Henderson             "stxvd2x 32,0,%0"
57*ca1e9c3bSRichard Henderson             : : "r"(o), "r"(i), "r"(k), "r"(bswap_le)
58*ca1e9c3bSRichard Henderson               : "memory", "v0", "v1", "v2");
59*ca1e9c3bSRichard Henderson     }
60*ca1e9c3bSRichard Henderson     return true;
61*ca1e9c3bSRichard Henderson }
62*ca1e9c3bSRichard Henderson 
test_ISB_ISR(uint8_t * o,const uint8_t * i)63*ca1e9c3bSRichard Henderson bool test_ISB_ISR(uint8_t *o, const uint8_t *i)
64*ca1e9c3bSRichard Henderson {
65*ca1e9c3bSRichard Henderson     /* vcipherlast also adds round key, so supply zero. */
66*ca1e9c3bSRichard Henderson     if (BIG_ENDIAN) {
67*ca1e9c3bSRichard Henderson         asm("lxvd2x 32,0,%1\n\t"
68*ca1e9c3bSRichard Henderson             "vspltisb 1,0\n\t"
69*ca1e9c3bSRichard Henderson             "vncipherlast 0,0,1\n\t"
70*ca1e9c3bSRichard Henderson             "stxvd2x 32,0,%0"
71*ca1e9c3bSRichard Henderson             : : "r"(o), "r"(i) : "memory", "v0", "v1");
72*ca1e9c3bSRichard Henderson     } else {
73*ca1e9c3bSRichard Henderson         asm("lxvd2x 32,0,%1\n\t"
74*ca1e9c3bSRichard Henderson             "lxvd2x 34,0,%2\n\t"
75*ca1e9c3bSRichard Henderson             "vspltisb 1,0\n\t"
76*ca1e9c3bSRichard Henderson             "vperm 0,0,0,2\n\t"
77*ca1e9c3bSRichard Henderson             "vncipherlast 0,0,1\n\t"
78*ca1e9c3bSRichard Henderson             "vperm 0,0,0,2\n\t"
79*ca1e9c3bSRichard Henderson             "stxvd2x 32,0,%0"
80*ca1e9c3bSRichard Henderson             : : "r"(o), "r"(i), "r"(bswap_le) : "memory", "v0", "v1", "v2");
81*ca1e9c3bSRichard Henderson     }
82*ca1e9c3bSRichard Henderson     return true;
83*ca1e9c3bSRichard Henderson }
84*ca1e9c3bSRichard Henderson 
test_IMC(uint8_t * o,const uint8_t * i)85*ca1e9c3bSRichard Henderson bool test_IMC(uint8_t *o, const uint8_t *i)
86*ca1e9c3bSRichard Henderson {
87*ca1e9c3bSRichard Henderson     return false;
88*ca1e9c3bSRichard Henderson }
89*ca1e9c3bSRichard Henderson 
test_ISB_ISR_AK_IMC(uint8_t * o,const uint8_t * i,const uint8_t * k)90*ca1e9c3bSRichard Henderson bool test_ISB_ISR_AK_IMC(uint8_t *o, const uint8_t *i, const uint8_t *k)
91*ca1e9c3bSRichard Henderson {
92*ca1e9c3bSRichard Henderson     if (BIG_ENDIAN) {
93*ca1e9c3bSRichard Henderson         asm("lxvd2x 32,0,%1\n\t"
94*ca1e9c3bSRichard Henderson             "lxvd2x 33,0,%2\n\t"
95*ca1e9c3bSRichard Henderson             "vncipher 0,0,1\n\t"
96*ca1e9c3bSRichard Henderson             "stxvd2x 32,0,%0"
97*ca1e9c3bSRichard Henderson             : : "r"(o), "r"(i), "r"(k) : "memory", "v0", "v1");
98*ca1e9c3bSRichard Henderson     } else {
99*ca1e9c3bSRichard Henderson         asm("lxvd2x 32,0,%1\n\t"
100*ca1e9c3bSRichard Henderson             "lxvd2x 33,0,%2\n\t"
101*ca1e9c3bSRichard Henderson             "lxvd2x 34,0,%3\n\t"
102*ca1e9c3bSRichard Henderson             "vperm 0,0,0,2\n\t"
103*ca1e9c3bSRichard Henderson             "vperm 1,1,1,2\n\t"
104*ca1e9c3bSRichard Henderson             "vncipher 0,0,1\n\t"
105*ca1e9c3bSRichard Henderson             "vperm 0,0,0,2\n\t"
106*ca1e9c3bSRichard Henderson             "stxvd2x 32,0,%0"
107*ca1e9c3bSRichard Henderson             : : "r"(o), "r"(i), "r"(k), "r"(bswap_le)
108*ca1e9c3bSRichard Henderson               : "memory", "v0", "v1", "v2");
109*ca1e9c3bSRichard Henderson     }
110*ca1e9c3bSRichard Henderson     return true;
111*ca1e9c3bSRichard Henderson }
112*ca1e9c3bSRichard Henderson 
test_ISB_ISR_IMC_AK(uint8_t * o,const uint8_t * i,const uint8_t * k)113*ca1e9c3bSRichard Henderson bool test_ISB_ISR_IMC_AK(uint8_t *o, const uint8_t *i, const uint8_t *k)
114*ca1e9c3bSRichard Henderson {
115*ca1e9c3bSRichard Henderson     return false;
116*ca1e9c3bSRichard Henderson }
117