Inspired by Ard Biesheuvel's RFC patches for accelerating AES under emulation, provide a set of primitives that maps between the guest and host fragments.
There is a small guest correctness test case. I think the end result is quite a bit cleaner, since the logic is now centralized, rather than spread across 4 different guests. Further work could clean up crypto/aes.c itself to use these instead of the tables directly. I'm sure that's just an ultimate fallback when an appropriate system library is not available, and so not terribly important, but it could still significantly reduce the amount of code we carry. I would imagine structuring a polynomial multiplication header in a similar way. There are 4 or 5 versions of those spread across the different guests. Anyway, please review. r~ Richard Henderson (35): tests/multiarch: Add test-aes target/arm: Move aesmc and aesimc tables to crypto/aes.c crypto/aes: Add constants for ShiftRows, InvShiftRows crypto: Add aesenc_SB_SR target/i386: Use aesenc_SB_SR target/arm: Demultiplex AESE and AESMC target/arm: Use aesenc_SB_SR target/ppc: Use aesenc_SB_SR target/riscv: Use aesenc_SB_SR crypto: Add aesdec_ISB_ISR target/i386: Use aesdec_ISB_ISR target/arm: Use aesdec_ISB_ISR target/ppc: Use aesdec_ISB_ISR target/riscv: Use aesdec_ISB_ISR crypto: Add aesenc_MC target/arm: Use aesenc_MC crypto: Add aesdec_IMC target/i386: Use aesdec_IMC target/arm: Use aesdec_IMC target/riscv: Use aesdec_IMC crypto: Add aesenc_SB_SR_MC_AK target/i386: Use aesenc_SB_SR_MC_AK target/ppc: Use aesenc_SB_SR_MC_AK target/riscv: Use aesenc_SB_SR_MC_AK crypto: Add aesdec_ISB_ISR_IMC_AK target/i386: Use aesdec_ISB_ISR_IMC_AK target/riscv: Use aesdec_ISB_ISR_IMC_AK crypto: Add aesdec_ISB_ISR_AK_IMC target/ppc: Use aesdec_ISB_ISR_AK_IMC host/include/i386: Implement aes-round.h host/include/aarch64: Implement aes-round.h crypto: Remove AES_shifts, AES_ishifts crypto: Implement aesdec_IMC with AES_imc_rot crypto: Remove AES_imc crypto: Unexport AES_*_rot, AES_TeN, AES_TdN host/include/aarch64/host/aes-round.h | 204 ++++++ host/include/aarch64/host/cpuinfo.h | 1 + host/include/generic/host/aes-round.h | 36 ++ host/include/i386/host/aes-round.h | 148 +++++ host/include/i386/host/cpuinfo.h | 1 + host/include/x86_64/host/aes-round.h | 1 + include/crypto/aes-round.h | 158 +++++ include/crypto/aes.h | 30 - target/arm/helper.h | 2 + target/i386/ops_sse.h | 64 +- target/arm/tcg/sve.decode | 4 +- crypto/aes.c | 808 ++++++++++++++++-------- target/arm/tcg/crypto_helper.c | 245 +++---- target/arm/tcg/translate-a64.c | 13 +- target/arm/tcg/translate-neon.c | 4 +- target/arm/tcg/translate-sve.c | 8 +- target/ppc/int_helper.c | 58 +- target/riscv/crypto_helper.c | 142 ++--- tests/tcg/aarch64/test-aes.c | 58 ++ tests/tcg/i386/test-aes.c | 68 ++ tests/tcg/ppc64/test-aes.c | 116 ++++ tests/tcg/riscv64/test-aes.c | 76 +++ util/cpuinfo-aarch64.c | 2 + util/cpuinfo-i386.c | 3 + tests/tcg/multiarch/test-aes-main.c.inc | 183 ++++++ tests/tcg/aarch64/Makefile.target | 4 + tests/tcg/i386/Makefile.target | 4 + tests/tcg/ppc64/Makefile.target | 1 + tests/tcg/riscv64/Makefile.target | 4 + 29 files changed, 1776 insertions(+), 670 deletions(-) create mode 100644 host/include/aarch64/host/aes-round.h create mode 100644 host/include/generic/host/aes-round.h create mode 100644 host/include/i386/host/aes-round.h create mode 100644 host/include/x86_64/host/aes-round.h create mode 100644 include/crypto/aes-round.h create mode 100644 tests/tcg/aarch64/test-aes.c create mode 100644 tests/tcg/i386/test-aes.c create mode 100644 tests/tcg/ppc64/test-aes.c create mode 100644 tests/tcg/riscv64/test-aes.c create mode 100644 tests/tcg/multiarch/test-aes-main.c.inc -- 2.34.1