On Mon, 21 Aug 2023 at 18:19, Richard Henderson <richard.hender...@linaro.org> wrote: > > Detect PCLMUL in cpuinfo; implement the accel hook. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
Reviewed-by: Ard Biesheuvel <a...@kernel.org> > --- > host/include/i386/host/cpuinfo.h | 1 + > host/include/i386/host/crypto/clmul.h | 29 +++++++++++++++++++++++++ > host/include/x86_64/host/crypto/clmul.h | 1 + > include/qemu/cpuid.h | 3 +++ > util/cpuinfo-i386.c | 1 + > 5 files changed, 35 insertions(+) > create mode 100644 host/include/i386/host/crypto/clmul.h > create mode 100644 host/include/x86_64/host/crypto/clmul.h > > diff --git a/host/include/i386/host/cpuinfo.h > b/host/include/i386/host/cpuinfo.h > index 073d0a426f..7ae21568f7 100644 > --- a/host/include/i386/host/cpuinfo.h > +++ b/host/include/i386/host/cpuinfo.h > @@ -27,6 +27,7 @@ > #define CPUINFO_ATOMIC_VMOVDQA (1u << 16) > #define CPUINFO_ATOMIC_VMOVDQU (1u << 17) > #define CPUINFO_AES (1u << 18) > +#define CPUINFO_PCLMUL (1u << 19) > > /* Initialized with a constructor. */ > extern unsigned cpuinfo; > diff --git a/host/include/i386/host/crypto/clmul.h > b/host/include/i386/host/crypto/clmul.h > new file mode 100644 > index 0000000000..dc3c814797 > --- /dev/null > +++ b/host/include/i386/host/crypto/clmul.h > @@ -0,0 +1,29 @@ > +/* > + * x86 specific clmul acceleration. > + * SPDX-License-Identifier: GPL-2.0-or-later > + */ > + > +#ifndef X86_HOST_CRYPTO_CLMUL_H > +#define X86_HOST_CRYPTO_CLMUL_H > + > +#include "host/cpuinfo.h" > +#include <immintrin.h> > + > +#if defined(__PCLMUL__) > +# define HAVE_CLMUL_ACCEL true > +# define ATTR_CLMUL_ACCEL > +#else > +# define HAVE_CLMUL_ACCEL likely(cpuinfo & CPUINFO_PCLMUL) > +# define ATTR_CLMUL_ACCEL __attribute__((target("pclmul"))) > +#endif > + > +static inline Int128 ATTR_CLMUL_ACCEL > +clmul_64_accel(uint64_t n, uint64_t m) > +{ > + union { __m128i v; Int128 s; } u; > + > + u.v = _mm_clmulepi64_si128(_mm_set_epi64x(0, n), _mm_set_epi64x(0, m), > 0); > + return u.s; > +} > + > +#endif /* X86_HOST_CRYPTO_CLMUL_H */ > diff --git a/host/include/x86_64/host/crypto/clmul.h > b/host/include/x86_64/host/crypto/clmul.h > new file mode 100644 > index 0000000000..f25eced416 > --- /dev/null > +++ b/host/include/x86_64/host/crypto/clmul.h > @@ -0,0 +1 @@ > +#include "host/include/i386/host/crypto/clmul.h" > diff --git a/include/qemu/cpuid.h b/include/qemu/cpuid.h > index 35325f1995..b11161555b 100644 > --- a/include/qemu/cpuid.h > +++ b/include/qemu/cpuid.h > @@ -25,6 +25,9 @@ > #endif > > /* Leaf 1, %ecx */ > +#ifndef bit_PCLMUL > +#define bit_PCLMUL (1 << 1) > +#endif > #ifndef bit_SSE4_1 > #define bit_SSE4_1 (1 << 19) > #endif > diff --git a/util/cpuinfo-i386.c b/util/cpuinfo-i386.c > index 3a7b7e0ad1..36783fd199 100644 > --- a/util/cpuinfo-i386.c > +++ b/util/cpuinfo-i386.c > @@ -39,6 +39,7 @@ unsigned __attribute__((constructor)) cpuinfo_init(void) > info |= (c & bit_SSE4_1 ? CPUINFO_SSE4 : 0); > info |= (c & bit_MOVBE ? CPUINFO_MOVBE : 0); > info |= (c & bit_POPCNT ? CPUINFO_POPCNT : 0); > + info |= (c & bit_PCLMUL ? CPUINFO_PCLMUL : 0); > > /* Our AES support requires PSHUFB as well. */ > info |= ((c & bit_AES) && (c & bit_SSSE3) ? CPUINFO_AES : 0); > -- > 2.34.1 >