1 /*- 2 * Copyright (c) 2024 Robert Clausecker <fuz@FreeBSD.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7 #include <sys/types.h> 8 #include <sys/md5.h> 9 10 #include <machine/cpufunc.h> 11 #include <machine/specialreg.h> 12 #include <stdint.h> 13 #include <string.h> 14 #include <x86/ifunc.h> 15 16 extern void _libmd_md5block_baseline(MD5_CTX *, const void *, size_t); 17 extern void _libmd_md5block_bmi1(MD5_CTX *, const void *, size_t); 18 extern void _libmd_md5block_avx512(MD5_CTX *, const void *, size_t); 19 20 DEFINE_UIFUNC(, void, _libmd_md5block, (MD5_CTX *, const void *, size_t)) 21 { 22 if ((cpu_stdext_feature & (CPUID_STDEXT_AVX512F | CPUID_STDEXT_AVX512VL)) 23 == (CPUID_STDEXT_AVX512F | CPUID_STDEXT_AVX512VL)) { 24 u_int regs[4]; 25 char cpu_vendor[12]; 26 27 do_cpuid(0, regs); 28 ((u_int *)&cpu_vendor)[0] = regs[1]; 29 ((u_int *)&cpu_vendor)[1] = regs[3]; 30 ((u_int *)&cpu_vendor)[2] = regs[2]; 31 32 /* the AVX-512 kernel performs poorly on AMD */ 33 if (memcmp(cpu_vendor, AMD_VENDOR_ID, sizeof(cpu_vendor)) != 0) 34 return (_libmd_md5block_avx512); 35 } 36 37 if (cpu_stdext_feature & CPUID_STDEXT_BMI1) 38 return (_libmd_md5block_bmi1); 39 else 40 return (_libmd_md5block_baseline); 41 } 42