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