Skip to content

Commit

Permalink
Merge tag 'pull-tcg-20230709' of https://gitlab.com/rth7680/qemu into…
Browse files Browse the repository at this point in the history
… staging

crypto: Provide aes-round.h and host accel

# -----BEGIN PGP SIGNATURE-----
#
# iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmSqvGodHHJpY2hhcmQu
# aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV+1bgf9EG57jfnCQLCfMQ6C
# 0bQ0MaeAkGg+7+mUwyi3OPB1VO0yjEKv5pWEnolzrGud35P0KsyoO+msqGqxnbMv
# IbhPkQZbmfMsGFPG1DbswjiwmQU5cV+ciONDM+C+qepnuUN+JrzIDHoEFzQRFoQo
# eQL/LnuyUkYBvR7YCKNJxFHtwILKcYQPH4jiC6a92C11AzYjDfilSxnuQ2RwL3Tn
# Zwf8TKJP5QGExvUdtm8f6xJ1LT7WAvsk9ZTwudE/+XRTnw8RWk6RmZSEQPx+cBdI
# p3opaoxkkMrdmcaXbr+9eSfBGq2gsVkKYPiyTDuwVW26575Nob9ZmodT3oSBNlkC
# +njd4w==
# =Nf5i
# -----END PGP SIGNATURE-----
# gpg: Signature made Sun 09 Jul 2023 02:55:54 PM BST
# gpg:                using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F
# gpg:                issuer "richard.henderson@linaro.org"
# gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [ultimate]

* tag 'pull-tcg-20230709' of https://gitlab.com/rth7680/qemu: (37 commits)
  crypto: Unexport AES_*_rot, AES_TeN, AES_TdN
  crypto: Remove AES_imc
  crypto: Implement aesdec_IMC with AES_imc_rot
  crypto: Remove AES_shifts, AES_ishifts
  target/riscv: Use aesdec_ISB_ISR_IMC_AK
  target/riscv: Use aesenc_SB_SR_MC_AK
  target/riscv: Use aesdec_IMC
  target/riscv: Use aesdec_ISB_ISR_AK
  target/riscv: Use aesenc_SB_SR_AK
  target/arm: Use aesdec_IMC
  target/arm: Use aesenc_MC
  target/arm: Use aesdec_ISB_ISR_AK
  target/arm: Use aesenc_SB_SR_AK
  target/arm: Demultiplex AESE and AESMC
  target/i386: Use aesdec_ISB_ISR_IMC_AK
  target/i386: Use aesenc_SB_SR_MC_AK
  target/i386: Use aesdec_IMC
  target/i386: Use aesdec_ISB_ISR_AK
  target/i386: Use aesenc_SB_SR_AK
  target/ppc: Use aesdec_ISB_ISR_AK_IMC
  ...

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
  • Loading branch information
rth7680 committed Jul 9, 2023
2 parents fc61742 + ff494c8 commit 2ff49e9
Show file tree
Hide file tree
Showing 39 changed files with 2,043 additions and 723 deletions.
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -3224,6 +3224,7 @@ M: Daniel P. Berrange <berrange@redhat.com>
S: Maintained
F: crypto/
F: include/crypto/
F: host/include/*/host/crypto/
F: qapi/crypto.json
F: tests/unit/test-crypto-*
F: tests/bench/benchmark-crypto-*
Expand Down
778 changes: 501 additions & 277 deletions crypto/aes.c

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions host/include/aarch64/host/cpuinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#define CPUINFO_ALWAYS (1u << 0) /* so cpuinfo is nonzero */
#define CPUINFO_LSE (1u << 1)
#define CPUINFO_LSE2 (1u << 2)
#define CPUINFO_AES (1u << 3)

/* Initialized with a constructor. */
extern unsigned cpuinfo;
Expand Down
205 changes: 205 additions & 0 deletions host/include/aarch64/host/crypto/aes-round.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
/*
* AArch64 specific aes acceleration.
* SPDX-License-Identifier: GPL-2.0-or-later
*/

#ifndef AARCH64_HOST_CRYPTO_AES_ROUND_H
#define AARCH64_HOST_CRYPTO_AES_ROUND_H

#include "host/cpuinfo.h"
#include <arm_neon.h>

#ifdef __ARM_FEATURE_AES
# define HAVE_AES_ACCEL true
#else
# define HAVE_AES_ACCEL likely(cpuinfo & CPUINFO_AES)
#endif
#if !defined(__ARM_FEATURE_AES) && defined(CONFIG_ARM_AES_BUILTIN)
# define ATTR_AES_ACCEL __attribute__((target("+crypto")))
#else
# define ATTR_AES_ACCEL
#endif

static inline uint8x16_t aes_accel_bswap(uint8x16_t x)
{
return vqtbl1q_u8(x, (uint8x16_t){ 15, 14, 13, 12, 11, 10, 9, 8,
7, 6, 5, 4, 3, 2, 1, 0, });
}

#ifdef CONFIG_ARM_AES_BUILTIN
# define aes_accel_aesd vaesdq_u8
# define aes_accel_aese vaeseq_u8
# define aes_accel_aesmc vaesmcq_u8
# define aes_accel_aesimc vaesimcq_u8
# define aes_accel_aesd_imc(S, K) vaesimcq_u8(vaesdq_u8(S, K))
# define aes_accel_aese_mc(S, K) vaesmcq_u8(vaeseq_u8(S, K))
#else
static inline uint8x16_t aes_accel_aesd(uint8x16_t d, uint8x16_t k)
{
asm(".arch_extension aes\n\t"
"aesd %0.16b, %1.16b" : "+w"(d) : "w"(k));
return d;
}

static inline uint8x16_t aes_accel_aese(uint8x16_t d, uint8x16_t k)
{
asm(".arch_extension aes\n\t"
"aese %0.16b, %1.16b" : "+w"(d) : "w"(k));
return d;
}

static inline uint8x16_t aes_accel_aesmc(uint8x16_t d)
{
asm(".arch_extension aes\n\t"
"aesmc %0.16b, %1.16b" : "=w"(d) : "w"(d));
return d;
}

static inline uint8x16_t aes_accel_aesimc(uint8x16_t d)
{
asm(".arch_extension aes\n\t"
"aesimc %0.16b, %1.16b" : "=w"(d) : "w"(d));
return d;
}

/* Most CPUs fuse AESD+AESIMC in the execution pipeline. */
static inline uint8x16_t aes_accel_aesd_imc(uint8x16_t d, uint8x16_t k)
{
asm(".arch_extension aes\n\t"
"aesd %0.16b, %1.16b\n\t"
"aesimc %0.16b, %0.16b" : "+w"(d) : "w"(k));
return d;
}

/* Most CPUs fuse AESE+AESMC in the execution pipeline. */
static inline uint8x16_t aes_accel_aese_mc(uint8x16_t d, uint8x16_t k)
{
asm(".arch_extension aes\n\t"
"aese %0.16b, %1.16b\n\t"
"aesmc %0.16b, %0.16b" : "+w"(d) : "w"(k));
return d;
}
#endif /* CONFIG_ARM_AES_BUILTIN */

static inline void ATTR_AES_ACCEL
aesenc_MC_accel(AESState *ret, const AESState *st, bool be)
{
uint8x16_t t = (uint8x16_t)st->v;

if (be) {
t = aes_accel_bswap(t);
t = aes_accel_aesmc(t);
t = aes_accel_bswap(t);
} else {
t = aes_accel_aesmc(t);
}
ret->v = (AESStateVec)t;
}

static inline void ATTR_AES_ACCEL
aesenc_SB_SR_AK_accel(AESState *ret, const AESState *st,
const AESState *rk, bool be)
{
uint8x16_t t = (uint8x16_t)st->v;
uint8x16_t z = { };

if (be) {
t = aes_accel_bswap(t);
t = aes_accel_aese(t, z);
t = aes_accel_bswap(t);
} else {
t = aes_accel_aese(t, z);
}
ret->v = (AESStateVec)t ^ rk->v;
}

static inline void ATTR_AES_ACCEL
aesenc_SB_SR_MC_AK_accel(AESState *ret, const AESState *st,
const AESState *rk, bool be)
{
uint8x16_t t = (uint8x16_t)st->v;
uint8x16_t z = { };

if (be) {
t = aes_accel_bswap(t);
t = aes_accel_aese_mc(t, z);
t = aes_accel_bswap(t);
} else {
t = aes_accel_aese_mc(t, z);
}
ret->v = (AESStateVec)t ^ rk->v;
}

static inline void ATTR_AES_ACCEL
aesdec_IMC_accel(AESState *ret, const AESState *st, bool be)
{
uint8x16_t t = (uint8x16_t)st->v;

if (be) {
t = aes_accel_bswap(t);
t = aes_accel_aesimc(t);
t = aes_accel_bswap(t);
} else {
t = aes_accel_aesimc(t);
}
ret->v = (AESStateVec)t;
}

static inline void ATTR_AES_ACCEL
aesdec_ISB_ISR_AK_accel(AESState *ret, const AESState *st,
const AESState *rk, bool be)
{
uint8x16_t t = (uint8x16_t)st->v;
uint8x16_t z = { };

if (be) {
t = aes_accel_bswap(t);
t = aes_accel_aesd(t, z);
t = aes_accel_bswap(t);
} else {
t = aes_accel_aesd(t, z);
}
ret->v = (AESStateVec)t ^ rk->v;
}

static inline void ATTR_AES_ACCEL
aesdec_ISB_ISR_AK_IMC_accel(AESState *ret, const AESState *st,
const AESState *rk, bool be)
{
uint8x16_t t = (uint8x16_t)st->v;
uint8x16_t k = (uint8x16_t)rk->v;
uint8x16_t z = { };

if (be) {
t = aes_accel_bswap(t);
k = aes_accel_bswap(k);
t = aes_accel_aesd(t, z);
t ^= k;
t = aes_accel_aesimc(t);
t = aes_accel_bswap(t);
} else {
t = aes_accel_aesd(t, z);
t ^= k;
t = aes_accel_aesimc(t);
}
ret->v = (AESStateVec)t;
}

static inline void ATTR_AES_ACCEL
aesdec_ISB_ISR_IMC_AK_accel(AESState *ret, const AESState *st,
const AESState *rk, bool be)
{
uint8x16_t t = (uint8x16_t)st->v;
uint8x16_t z = { };

if (be) {
t = aes_accel_bswap(t);
t = aes_accel_aesd_imc(t, z);
t = aes_accel_bswap(t);
} else {
t = aes_accel_aesd_imc(t, z);
}
ret->v = (AESStateVec)t ^ rk->v;
}

#endif /* AARCH64_HOST_CRYPTO_AES_ROUND_H */
33 changes: 33 additions & 0 deletions host/include/generic/host/crypto/aes-round.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* No host specific aes acceleration.
* SPDX-License-Identifier: GPL-2.0-or-later
*/

#ifndef GENERIC_HOST_CRYPTO_AES_ROUND_H
#define GENERIC_HOST_CRYPTO_AES_ROUND_H

#define HAVE_AES_ACCEL false
#define ATTR_AES_ACCEL

void aesenc_MC_accel(AESState *, const AESState *, bool)
QEMU_ERROR("unsupported accel");
void aesenc_SB_SR_AK_accel(AESState *, const AESState *,
const AESState *, bool)
QEMU_ERROR("unsupported accel");
void aesenc_SB_SR_MC_AK_accel(AESState *, const AESState *,
const AESState *, bool)
QEMU_ERROR("unsupported accel");

void aesdec_IMC_accel(AESState *, const AESState *, bool)
QEMU_ERROR("unsupported accel");
void aesdec_ISB_ISR_AK_accel(AESState *, const AESState *,
const AESState *, bool)
QEMU_ERROR("unsupported accel");
void aesdec_ISB_ISR_AK_IMC_accel(AESState *, const AESState *,
const AESState *, bool)
QEMU_ERROR("unsupported accel");
void aesdec_ISB_ISR_IMC_AK_accel(AESState *, const AESState *,
const AESState *, bool)
QEMU_ERROR("unsupported accel");

#endif /* GENERIC_HOST_CRYPTO_AES_ROUND_H */
1 change: 1 addition & 0 deletions host/include/i386/host/cpuinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#define CPUINFO_AVX512VBMI2 (1u << 15)
#define CPUINFO_ATOMIC_VMOVDQA (1u << 16)
#define CPUINFO_ATOMIC_VMOVDQU (1u << 17)
#define CPUINFO_AES (1u << 18)

/* Initialized with a constructor. */
extern unsigned cpuinfo;
Expand Down

0 comments on commit 2ff49e9

Please sign in to comment.