Message ID | 20230821161854.419893-19-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | crypto: Provide clmul.h and host accel | expand |
On Mon, 21 Aug 2023 at 18:19, Richard Henderson <richard.henderson@linaro.org> wrote: > > Detect PCLMUL in cpuinfo; implement the accel hook. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Ard Biesheuvel <ardb@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 >
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);
Detect PCLMUL in cpuinfo; implement the accel hook. Signed-off-by: Richard Henderson <richard.henderson@linaro.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