xref: /f-stack/dpdk/app/test/test_cpuflags.c (revision 2d9fd380)
14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang  * Copyright(c) 2010-2014 Intel Corporation
34418919fSjohnjiang  */
44418919fSjohnjiang 
54418919fSjohnjiang #include <stdio.h>
64418919fSjohnjiang 
74418919fSjohnjiang #include <errno.h>
84418919fSjohnjiang #include <stdint.h>
94418919fSjohnjiang #include <rte_cpuflags.h>
104418919fSjohnjiang #include <rte_debug.h>
114418919fSjohnjiang 
124418919fSjohnjiang #include "test.h"
134418919fSjohnjiang 
144418919fSjohnjiang 
154418919fSjohnjiang /* convenience define */
164418919fSjohnjiang #define CHECK_FOR_FLAG(x) \
174418919fSjohnjiang 			result = rte_cpu_get_flag_enabled(x);    \
184418919fSjohnjiang 			printf("%s\n", cpu_flag_result(result)); \
194418919fSjohnjiang 			if (result == -ENOENT)                   \
204418919fSjohnjiang 				return -1;
214418919fSjohnjiang 
224418919fSjohnjiang /*
234418919fSjohnjiang  * Helper function to display result
244418919fSjohnjiang  */
254418919fSjohnjiang static inline const char *
cpu_flag_result(int result)264418919fSjohnjiang cpu_flag_result(int result)
274418919fSjohnjiang {
284418919fSjohnjiang 	switch (result) {
294418919fSjohnjiang 	case 0:
304418919fSjohnjiang 		return "NOT PRESENT";
314418919fSjohnjiang 	case 1:
324418919fSjohnjiang 		return "OK";
334418919fSjohnjiang 	default:
344418919fSjohnjiang 		return "ERROR";
354418919fSjohnjiang 	}
364418919fSjohnjiang }
374418919fSjohnjiang 
384418919fSjohnjiang 
394418919fSjohnjiang 
404418919fSjohnjiang /*
414418919fSjohnjiang  * CPUID test
424418919fSjohnjiang  * ===========
434418919fSjohnjiang  *
444418919fSjohnjiang  * - Check flags from different registers with rte_cpu_get_flag_enabled()
454418919fSjohnjiang  * - Check if register and CPUID functions fail properly
464418919fSjohnjiang  */
474418919fSjohnjiang 
484418919fSjohnjiang static int
test_cpuflags(void)494418919fSjohnjiang test_cpuflags(void)
504418919fSjohnjiang {
514418919fSjohnjiang 	int result;
524418919fSjohnjiang 	printf("\nChecking for flags from different registers...\n");
534418919fSjohnjiang 
544418919fSjohnjiang #ifdef RTE_ARCH_PPC_64
554418919fSjohnjiang 	printf("Check for PPC64:\t\t");
564418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_PPC64);
574418919fSjohnjiang 
584418919fSjohnjiang 	printf("Check for PPC32:\t\t");
594418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_PPC32);
604418919fSjohnjiang 
614418919fSjohnjiang 	printf("Check for VSX:\t\t");
624418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_VSX);
634418919fSjohnjiang 
644418919fSjohnjiang 	printf("Check for DFP:\t\t");
654418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_DFP);
664418919fSjohnjiang 
674418919fSjohnjiang 	printf("Check for FPU:\t\t");
684418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_FPU);
694418919fSjohnjiang 
704418919fSjohnjiang 	printf("Check for SMT:\t\t");
714418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_SMT);
724418919fSjohnjiang 
734418919fSjohnjiang 	printf("Check for MMU:\t\t");
744418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_MMU);
754418919fSjohnjiang 
764418919fSjohnjiang 	printf("Check for ALTIVEC:\t\t");
774418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_ALTIVEC);
784418919fSjohnjiang 
794418919fSjohnjiang 	printf("Check for ARCH_2_06:\t\t");
804418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_ARCH_2_06);
814418919fSjohnjiang 
824418919fSjohnjiang 	printf("Check for ARCH_2_07:\t\t");
834418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_ARCH_2_07);
844418919fSjohnjiang 
854418919fSjohnjiang 	printf("Check for ICACHE_SNOOP:\t\t");
864418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_ICACHE_SNOOP);
874418919fSjohnjiang #endif
884418919fSjohnjiang 
89*2d9fd380Sjfb8856606 #if defined(RTE_ARCH_ARM) && defined(RTE_ARCH_32)
904418919fSjohnjiang 	printf("Check for NEON:\t\t");
914418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_NEON);
924418919fSjohnjiang #endif
934418919fSjohnjiang 
944418919fSjohnjiang #if defined(RTE_ARCH_ARM64)
954418919fSjohnjiang 	printf("Check for FP:\t\t");
964418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_FP);
974418919fSjohnjiang 
984418919fSjohnjiang 	printf("Check for ASIMD:\t");
994418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_NEON);
1004418919fSjohnjiang 
1014418919fSjohnjiang 	printf("Check for EVTSTRM:\t");
1024418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_EVTSTRM);
1034418919fSjohnjiang 
1044418919fSjohnjiang 	printf("Check for AES:\t\t");
1054418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_AES);
1064418919fSjohnjiang 
1074418919fSjohnjiang 	printf("Check for PMULL:\t");
1084418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_PMULL);
1094418919fSjohnjiang 
1104418919fSjohnjiang 	printf("Check for SHA1:\t\t");
1114418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_SHA1);
1124418919fSjohnjiang 
1134418919fSjohnjiang 	printf("Check for SHA2:\t\t");
1144418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_SHA2);
1154418919fSjohnjiang 
1164418919fSjohnjiang 	printf("Check for CRC32:\t");
1174418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_CRC32);
1184418919fSjohnjiang 
1194418919fSjohnjiang 	printf("Check for ATOMICS:\t");
1204418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_ATOMICS);
121*2d9fd380Sjfb8856606 
122*2d9fd380Sjfb8856606 	printf("Check for SVE:\t\t");
123*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVE);
124*2d9fd380Sjfb8856606 
125*2d9fd380Sjfb8856606 	printf("Check for SVE2:\t\t");
126*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVE2);
127*2d9fd380Sjfb8856606 
128*2d9fd380Sjfb8856606 	printf("Check for SVEAES:\t");
129*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEAES);
130*2d9fd380Sjfb8856606 
131*2d9fd380Sjfb8856606 	printf("Check for SVEPMULL:\t");
132*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEPMULL);
133*2d9fd380Sjfb8856606 
134*2d9fd380Sjfb8856606 	printf("Check for SVEBITPERM:\t");
135*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEBITPERM);
136*2d9fd380Sjfb8856606 
137*2d9fd380Sjfb8856606 	printf("Check for SVESHA3:\t");
138*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVESHA3);
139*2d9fd380Sjfb8856606 
140*2d9fd380Sjfb8856606 	printf("Check for SVESM4:\t");
141*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVESM4);
142*2d9fd380Sjfb8856606 
143*2d9fd380Sjfb8856606 	printf("Check for FLAGM2:\t");
144*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_FLAGM2);
145*2d9fd380Sjfb8856606 
146*2d9fd380Sjfb8856606 	printf("Check for FRINT:\t");
147*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_FRINT);
148*2d9fd380Sjfb8856606 
149*2d9fd380Sjfb8856606 	printf("Check for SVEI8MM:\t");
150*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEI8MM);
151*2d9fd380Sjfb8856606 
152*2d9fd380Sjfb8856606 	printf("Check for SVEF32MM:\t");
153*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEF32MM);
154*2d9fd380Sjfb8856606 
155*2d9fd380Sjfb8856606 	printf("Check for SVEF64MM:\t");
156*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEF64MM);
157*2d9fd380Sjfb8856606 
158*2d9fd380Sjfb8856606 	printf("Check for SVEBF16:\t");
159*2d9fd380Sjfb8856606 	CHECK_FOR_FLAG(RTE_CPUFLAG_SVEBF16);
1604418919fSjohnjiang #endif
1614418919fSjohnjiang 
1624418919fSjohnjiang #if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686)
1634418919fSjohnjiang 	printf("Check for SSE:\t\t");
1644418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE);
1654418919fSjohnjiang 
1664418919fSjohnjiang 	printf("Check for SSE2:\t\t");
1674418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE2);
1684418919fSjohnjiang 
1694418919fSjohnjiang 	printf("Check for SSE3:\t\t");
1704418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE3);
1714418919fSjohnjiang 
1724418919fSjohnjiang 	printf("Check for SSE4.1:\t");
1734418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_1);
1744418919fSjohnjiang 
1754418919fSjohnjiang 	printf("Check for SSE4.2:\t");
1764418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_2);
1774418919fSjohnjiang 
1784418919fSjohnjiang 	printf("Check for AVX:\t\t");
1794418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_AVX);
1804418919fSjohnjiang 
1814418919fSjohnjiang 	printf("Check for AVX2:\t\t");
1824418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_AVX2);
1834418919fSjohnjiang 
1844418919fSjohnjiang 	printf("Check for AVX512F:\t");
1854418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_AVX512F);
1864418919fSjohnjiang 
1874418919fSjohnjiang 	printf("Check for TRBOBST:\t");
1884418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_TRBOBST);
1894418919fSjohnjiang 
1904418919fSjohnjiang 	printf("Check for ENERGY_EFF:\t");
1914418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_ENERGY_EFF);
1924418919fSjohnjiang 
1934418919fSjohnjiang 	printf("Check for LAHF_SAHF:\t");
1944418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_LAHF_SAHF);
1954418919fSjohnjiang 
1964418919fSjohnjiang 	printf("Check for 1GB_PG:\t");
1974418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_1GB_PG);
1984418919fSjohnjiang 
1994418919fSjohnjiang 	printf("Check for INVTSC:\t");
2004418919fSjohnjiang 	CHECK_FOR_FLAG(RTE_CPUFLAG_INVTSC);
2014418919fSjohnjiang #endif
2024418919fSjohnjiang 
2034418919fSjohnjiang 	/*
2044418919fSjohnjiang 	 * Check if invalid data is handled properly
2054418919fSjohnjiang 	 */
2064418919fSjohnjiang 	printf("\nCheck for invalid flag:\t");
2074418919fSjohnjiang 	result = rte_cpu_get_flag_enabled(RTE_CPUFLAG_NUMFLAGS);
2084418919fSjohnjiang 	printf("%s\n", cpu_flag_result(result));
2094418919fSjohnjiang 	if (result != -ENOENT)
2104418919fSjohnjiang 		return -1;
2114418919fSjohnjiang 
2124418919fSjohnjiang 	return 0;
2134418919fSjohnjiang }
2144418919fSjohnjiang 
2154418919fSjohnjiang REGISTER_TEST_COMMAND(cpuflags_autotest, test_cpuflags);
216