xref: /openbmc/qemu/tests/tcg/riscv64/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 
test_SB_SR(uint8_t * o,const uint8_t * i)5*ca1e9c3bSRichard Henderson bool test_SB_SR(uint8_t *o, const uint8_t *i)
6*ca1e9c3bSRichard Henderson {
7*ca1e9c3bSRichard Henderson     uint64_t *o8 = (uint64_t *)o;
8*ca1e9c3bSRichard Henderson     const uint64_t *i8 = (const uint64_t *)i;
9*ca1e9c3bSRichard Henderson 
10*ca1e9c3bSRichard Henderson     /* aes64es rd, rs1, rs2 = 0011001 rs2 rs1 000 rd 0110011 */
11*ca1e9c3bSRichard Henderson     asm(".insn r 0x33, 0x0, 0x19, %0, %2, %3\n\t"
12*ca1e9c3bSRichard Henderson         ".insn r 0x33, 0x0, 0x19, %1, %3, %2"
13*ca1e9c3bSRichard Henderson         : "=&r"(o8[0]), "=&r"(o8[1]) : "r"(i8[0]), "r"(i8[1]));
14*ca1e9c3bSRichard Henderson     return true;
15*ca1e9c3bSRichard Henderson }
16*ca1e9c3bSRichard Henderson 
test_MC(uint8_t * o,const uint8_t * i)17*ca1e9c3bSRichard Henderson bool test_MC(uint8_t *o, const uint8_t *i)
18*ca1e9c3bSRichard Henderson {
19*ca1e9c3bSRichard Henderson     return false;
20*ca1e9c3bSRichard Henderson }
21*ca1e9c3bSRichard Henderson 
test_SB_SR_MC_AK(uint8_t * o,const uint8_t * i,const uint8_t * k)22*ca1e9c3bSRichard Henderson bool test_SB_SR_MC_AK(uint8_t *o, const uint8_t *i, const uint8_t *k)
23*ca1e9c3bSRichard Henderson {
24*ca1e9c3bSRichard Henderson     uint64_t *o8 = (uint64_t *)o;
25*ca1e9c3bSRichard Henderson     const uint64_t *i8 = (const uint64_t *)i;
26*ca1e9c3bSRichard Henderson     const uint64_t *k8 = (const uint64_t *)k;
27*ca1e9c3bSRichard Henderson 
28*ca1e9c3bSRichard Henderson     /* aesesm rd, rs1, rs2 = 0011011 rs2 rs1 000 rd 0110011 */
29*ca1e9c3bSRichard Henderson     asm(".insn r 0x33, 0x0, 0x1b, %0, %2, %3\n\t"
30*ca1e9c3bSRichard Henderson         ".insn r 0x33, 0x0, 0x1b, %1, %3, %2\n\t"
31*ca1e9c3bSRichard Henderson         "xor %0,%0,%4\n\t"
32*ca1e9c3bSRichard Henderson         "xor %1,%1,%5"
33*ca1e9c3bSRichard Henderson         : "=&r"(o8[0]), "=&r"(o8[1])
34*ca1e9c3bSRichard Henderson         : "r"(i8[0]), "r"(i8[1]), "r"(k8[0]), "r"(k8[1]));
35*ca1e9c3bSRichard Henderson     return true;
36*ca1e9c3bSRichard Henderson }
37*ca1e9c3bSRichard Henderson 
test_ISB_ISR(uint8_t * o,const uint8_t * i)38*ca1e9c3bSRichard Henderson bool test_ISB_ISR(uint8_t *o, const uint8_t *i)
39*ca1e9c3bSRichard Henderson {
40*ca1e9c3bSRichard Henderson     uint64_t *o8 = (uint64_t *)o;
41*ca1e9c3bSRichard Henderson     const uint64_t *i8 = (const uint64_t *)i;
42*ca1e9c3bSRichard Henderson 
43*ca1e9c3bSRichard Henderson     /* aes64ds rd, rs1, rs2 = 0011101 rs2 rs1 000 rd 0110011 */
44*ca1e9c3bSRichard Henderson     asm(".insn r 0x33, 0x0, 0x1d, %0, %2, %3\n\t"
45*ca1e9c3bSRichard Henderson         ".insn r 0x33, 0x0, 0x1d, %1, %3, %2"
46*ca1e9c3bSRichard Henderson         : "=&r"(o8[0]), "=&r"(o8[1]) : "r"(i8[0]), "r"(i8[1]));
47*ca1e9c3bSRichard Henderson     return true;
48*ca1e9c3bSRichard Henderson }
49*ca1e9c3bSRichard Henderson 
test_IMC(uint8_t * o,const uint8_t * i)50*ca1e9c3bSRichard Henderson bool test_IMC(uint8_t *o, const uint8_t *i)
51*ca1e9c3bSRichard Henderson {
52*ca1e9c3bSRichard Henderson     uint64_t *o8 = (uint64_t *)o;
53*ca1e9c3bSRichard Henderson     const uint64_t *i8 = (const uint64_t *)i;
54*ca1e9c3bSRichard Henderson 
55*ca1e9c3bSRichard Henderson     /* aes64im rd, rs1 = 0011000 00000 rs1 001 rd 0010011 */
56*ca1e9c3bSRichard Henderson     asm(".insn r 0x13, 0x1, 0x18, %0, %0, x0\n\t"
57*ca1e9c3bSRichard Henderson         ".insn r 0x13, 0x1, 0x18, %1, %1, x0"
58*ca1e9c3bSRichard Henderson         : "=r"(o8[0]), "=r"(o8[1]) : "0"(i8[0]), "1"(i8[1]));
59*ca1e9c3bSRichard Henderson     return true;
60*ca1e9c3bSRichard Henderson }
61*ca1e9c3bSRichard Henderson 
test_ISB_ISR_AK_IMC(uint8_t * o,const uint8_t * i,const uint8_t * k)62*ca1e9c3bSRichard Henderson bool test_ISB_ISR_AK_IMC(uint8_t *o, const uint8_t *i, const uint8_t *k)
63*ca1e9c3bSRichard Henderson {
64*ca1e9c3bSRichard Henderson     return false;
65*ca1e9c3bSRichard Henderson }
66*ca1e9c3bSRichard Henderson 
test_ISB_ISR_IMC_AK(uint8_t * o,const uint8_t * i,const uint8_t * k)67*ca1e9c3bSRichard Henderson bool test_ISB_ISR_IMC_AK(uint8_t *o, const uint8_t *i, const uint8_t *k)
68*ca1e9c3bSRichard Henderson {
69*ca1e9c3bSRichard Henderson     uint64_t *o8 = (uint64_t *)o;
70*ca1e9c3bSRichard Henderson     const uint64_t *i8 = (const uint64_t *)i;
71*ca1e9c3bSRichard Henderson     const uint64_t *k8 = (const uint64_t *)k;
72*ca1e9c3bSRichard Henderson 
73*ca1e9c3bSRichard Henderson     /* aes64dsm rd, rs1, rs2 = 0011111 rs2 rs1 000 rd 0110011 */
74*ca1e9c3bSRichard Henderson     asm(".insn r 0x33, 0x0, 0x1f, %0, %2, %3\n\t"
75*ca1e9c3bSRichard Henderson         ".insn r 0x33, 0x0, 0x1f, %1, %3, %2\n\t"
76*ca1e9c3bSRichard Henderson         "xor %0,%0,%4\n\t"
77*ca1e9c3bSRichard Henderson         "xor %1,%1,%5"
78*ca1e9c3bSRichard Henderson         : "=&r"(o8[0]), "=&r"(o8[1])
79*ca1e9c3bSRichard Henderson         : "r"(i8[0]), "r"(i8[1]), "r"(k8[0]), "r"(k8[1]));
80*ca1e9c3bSRichard Henderson     return true;
81*ca1e9c3bSRichard Henderson }
82