1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2014 Intel Corporation 3 */ 4 5 #include <stdio.h> 6 7 #include <errno.h> 8 #include <stdint.h> 9 #include <rte_cpuflags.h> 10 #include <rte_debug.h> 11 12 #include "test.h" 13 14 15 /* convenience define */ 16 #define CHECK_FOR_FLAG(x) \ 17 result = rte_cpu_get_flag_enabled(x); \ 18 printf("%s\n", cpu_flag_result(result)); \ 19 if (result == -ENOENT) \ 20 return -1; 21 22 /* 23 * Helper function to display result 24 */ 25 static inline const char * 26 cpu_flag_result(int result) 27 { 28 switch (result) { 29 case 0: 30 return "NOT PRESENT"; 31 case 1: 32 return "OK"; 33 default: 34 return "ERROR"; 35 } 36 } 37 38 39 40 /* 41 * CPUID test 42 * =========== 43 * 44 * - Check flags from different registers with rte_cpu_get_flag_enabled() 45 * - Check if register and CPUID functions fail properly 46 */ 47 48 static int 49 test_cpuflags(void) 50 { 51 int result; 52 printf("\nChecking for flags from different registers...\n"); 53 54 #ifdef RTE_ARCH_PPC_64 55 printf("Check for PPC64:\t\t"); 56 CHECK_FOR_FLAG(RTE_CPUFLAG_PPC64); 57 58 printf("Check for PPC32:\t\t"); 59 CHECK_FOR_FLAG(RTE_CPUFLAG_PPC32); 60 61 printf("Check for VSX:\t\t"); 62 CHECK_FOR_FLAG(RTE_CPUFLAG_VSX); 63 64 printf("Check for DFP:\t\t"); 65 CHECK_FOR_FLAG(RTE_CPUFLAG_DFP); 66 67 printf("Check for FPU:\t\t"); 68 CHECK_FOR_FLAG(RTE_CPUFLAG_FPU); 69 70 printf("Check for SMT:\t\t"); 71 CHECK_FOR_FLAG(RTE_CPUFLAG_SMT); 72 73 printf("Check for MMU:\t\t"); 74 CHECK_FOR_FLAG(RTE_CPUFLAG_MMU); 75 76 printf("Check for ALTIVEC:\t\t"); 77 CHECK_FOR_FLAG(RTE_CPUFLAG_ALTIVEC); 78 79 printf("Check for ARCH_2_06:\t\t"); 80 CHECK_FOR_FLAG(RTE_CPUFLAG_ARCH_2_06); 81 82 printf("Check for ARCH_2_07:\t\t"); 83 CHECK_FOR_FLAG(RTE_CPUFLAG_ARCH_2_07); 84 85 printf("Check for ICACHE_SNOOP:\t\t"); 86 CHECK_FOR_FLAG(RTE_CPUFLAG_ICACHE_SNOOP); 87 #endif 88 89 #if defined(RTE_ARCH_ARM) && defined(RTE_ARCH_32) 90 printf("Check for NEON:\t\t"); 91 CHECK_FOR_FLAG(RTE_CPUFLAG_NEON); 92 #endif 93 94 #if defined(RTE_ARCH_ARM64) 95 printf("Check for FP:\t\t"); 96 CHECK_FOR_FLAG(RTE_CPUFLAG_FP); 97 98 printf("Check for ASIMD:\t"); 99 CHECK_FOR_FLAG(RTE_CPUFLAG_NEON); 100 101 printf("Check for EVTSTRM:\t"); 102 CHECK_FOR_FLAG(RTE_CPUFLAG_EVTSTRM); 103 104 printf("Check for AES:\t\t"); 105 CHECK_FOR_FLAG(RTE_CPUFLAG_AES); 106 107 printf("Check for PMULL:\t"); 108 CHECK_FOR_FLAG(RTE_CPUFLAG_PMULL); 109 110 printf("Check for SHA1:\t\t"); 111 CHECK_FOR_FLAG(RTE_CPUFLAG_SHA1); 112 113 printf("Check for SHA2:\t\t"); 114 CHECK_FOR_FLAG(RTE_CPUFLAG_SHA2); 115 116 printf("Check for CRC32:\t"); 117 CHECK_FOR_FLAG(RTE_CPUFLAG_CRC32); 118 119 printf("Check for ATOMICS:\t"); 120 CHECK_FOR_FLAG(RTE_CPUFLAG_ATOMICS); 121 122 printf("Check for SVE:\t\t"); 123 CHECK_FOR_FLAG(RTE_CPUFLAG_SVE); 124 125 printf("Check for SVE2:\t\t"); 126 CHECK_FOR_FLAG(RTE_CPUFLAG_SVE2); 127 128 printf("Check for SVEAES:\t"); 129 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEAES); 130 131 printf("Check for SVEPMULL:\t"); 132 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEPMULL); 133 134 printf("Check for SVEBITPERM:\t"); 135 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEBITPERM); 136 137 printf("Check for SVESHA3:\t"); 138 CHECK_FOR_FLAG(RTE_CPUFLAG_SVESHA3); 139 140 printf("Check for SVESM4:\t"); 141 CHECK_FOR_FLAG(RTE_CPUFLAG_SVESM4); 142 143 printf("Check for FLAGM2:\t"); 144 CHECK_FOR_FLAG(RTE_CPUFLAG_FLAGM2); 145 146 printf("Check for FRINT:\t"); 147 CHECK_FOR_FLAG(RTE_CPUFLAG_FRINT); 148 149 printf("Check for SVEI8MM:\t"); 150 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEI8MM); 151 152 printf("Check for SVEF32MM:\t"); 153 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEF32MM); 154 155 printf("Check for SVEF64MM:\t"); 156 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEF64MM); 157 158 printf("Check for SVEBF16:\t"); 159 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEBF16); 160 #endif 161 162 #if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) 163 printf("Check for SSE:\t\t"); 164 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE); 165 166 printf("Check for SSE2:\t\t"); 167 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE2); 168 169 printf("Check for SSE3:\t\t"); 170 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE3); 171 172 printf("Check for SSE4.1:\t"); 173 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_1); 174 175 printf("Check for SSE4.2:\t"); 176 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_2); 177 178 printf("Check for AVX:\t\t"); 179 CHECK_FOR_FLAG(RTE_CPUFLAG_AVX); 180 181 printf("Check for AVX2:\t\t"); 182 CHECK_FOR_FLAG(RTE_CPUFLAG_AVX2); 183 184 printf("Check for AVX512F:\t"); 185 CHECK_FOR_FLAG(RTE_CPUFLAG_AVX512F); 186 187 printf("Check for TRBOBST:\t"); 188 CHECK_FOR_FLAG(RTE_CPUFLAG_TRBOBST); 189 190 printf("Check for ENERGY_EFF:\t"); 191 CHECK_FOR_FLAG(RTE_CPUFLAG_ENERGY_EFF); 192 193 printf("Check for LAHF_SAHF:\t"); 194 CHECK_FOR_FLAG(RTE_CPUFLAG_LAHF_SAHF); 195 196 printf("Check for 1GB_PG:\t"); 197 CHECK_FOR_FLAG(RTE_CPUFLAG_1GB_PG); 198 199 printf("Check for INVTSC:\t"); 200 CHECK_FOR_FLAG(RTE_CPUFLAG_INVTSC); 201 #endif 202 203 /* 204 * Check if invalid data is handled properly 205 */ 206 printf("\nCheck for invalid flag:\t"); 207 result = rte_cpu_get_flag_enabled(RTE_CPUFLAG_NUMFLAGS); 208 printf("%s\n", cpu_flag_result(result)); 209 if (result != -ENOENT) 210 return -1; 211 212 return 0; 213 } 214 215 REGISTER_TEST_COMMAND(cpuflags_autotest, test_cpuflags); 216