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)264418919fSjohnjiangcpu_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)494418919fSjohnjiangtest_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