xref: /freebsd/lib/libmd/amd64/md5dispatch.c (revision d92e987421001c365216b039f8c3303939c195f7)
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