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 */ 46 47 static int 48 test_cpuflags(void) 49 { 50 int result; 51 printf("\nChecking for flags from different registers...\n"); 52 53 #ifdef RTE_ARCH_PPC_64 54 printf("Check for PPC64:\t\t"); 55 CHECK_FOR_FLAG(RTE_CPUFLAG_PPC64); 56 57 printf("Check for PPC32:\t\t"); 58 CHECK_FOR_FLAG(RTE_CPUFLAG_PPC32); 59 60 printf("Check for VSX:\t\t"); 61 CHECK_FOR_FLAG(RTE_CPUFLAG_VSX); 62 63 printf("Check for DFP:\t\t"); 64 CHECK_FOR_FLAG(RTE_CPUFLAG_DFP); 65 66 printf("Check for FPU:\t\t"); 67 CHECK_FOR_FLAG(RTE_CPUFLAG_FPU); 68 69 printf("Check for SMT:\t\t"); 70 CHECK_FOR_FLAG(RTE_CPUFLAG_SMT); 71 72 printf("Check for MMU:\t\t"); 73 CHECK_FOR_FLAG(RTE_CPUFLAG_MMU); 74 75 printf("Check for ALTIVEC:\t\t"); 76 CHECK_FOR_FLAG(RTE_CPUFLAG_ALTIVEC); 77 78 printf("Check for ARCH_2_06:\t\t"); 79 CHECK_FOR_FLAG(RTE_CPUFLAG_ARCH_2_06); 80 81 printf("Check for ARCH_2_07:\t\t"); 82 CHECK_FOR_FLAG(RTE_CPUFLAG_ARCH_2_07); 83 84 printf("Check for ICACHE_SNOOP:\t\t"); 85 CHECK_FOR_FLAG(RTE_CPUFLAG_ICACHE_SNOOP); 86 #endif 87 88 #if defined(RTE_ARCH_ARM) && defined(RTE_ARCH_32) 89 printf("Check for NEON:\t\t"); 90 CHECK_FOR_FLAG(RTE_CPUFLAG_NEON); 91 #endif 92 93 #if defined(RTE_ARCH_ARM64) 94 printf("Check for FP:\t\t"); 95 CHECK_FOR_FLAG(RTE_CPUFLAG_FP); 96 97 printf("Check for ASIMD:\t"); 98 CHECK_FOR_FLAG(RTE_CPUFLAG_NEON); 99 100 printf("Check for EVTSTRM:\t"); 101 CHECK_FOR_FLAG(RTE_CPUFLAG_EVTSTRM); 102 103 printf("Check for AES:\t\t"); 104 CHECK_FOR_FLAG(RTE_CPUFLAG_AES); 105 106 printf("Check for PMULL:\t"); 107 CHECK_FOR_FLAG(RTE_CPUFLAG_PMULL); 108 109 printf("Check for SHA1:\t\t"); 110 CHECK_FOR_FLAG(RTE_CPUFLAG_SHA1); 111 112 printf("Check for SHA2:\t\t"); 113 CHECK_FOR_FLAG(RTE_CPUFLAG_SHA2); 114 115 printf("Check for CRC32:\t"); 116 CHECK_FOR_FLAG(RTE_CPUFLAG_CRC32); 117 118 printf("Check for ATOMICS:\t"); 119 CHECK_FOR_FLAG(RTE_CPUFLAG_ATOMICS); 120 121 printf("Check for SVE:\t\t"); 122 CHECK_FOR_FLAG(RTE_CPUFLAG_SVE); 123 124 printf("Check for SVE2:\t\t"); 125 CHECK_FOR_FLAG(RTE_CPUFLAG_SVE2); 126 127 printf("Check for SVEAES:\t"); 128 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEAES); 129 130 printf("Check for SVEPMULL:\t"); 131 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEPMULL); 132 133 printf("Check for SVEBITPERM:\t"); 134 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEBITPERM); 135 136 printf("Check for SVESHA3:\t"); 137 CHECK_FOR_FLAG(RTE_CPUFLAG_SVESHA3); 138 139 printf("Check for SVESM4:\t"); 140 CHECK_FOR_FLAG(RTE_CPUFLAG_SVESM4); 141 142 printf("Check for FLAGM2:\t"); 143 CHECK_FOR_FLAG(RTE_CPUFLAG_FLAGM2); 144 145 printf("Check for FRINT:\t"); 146 CHECK_FOR_FLAG(RTE_CPUFLAG_FRINT); 147 148 printf("Check for SVEI8MM:\t"); 149 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEI8MM); 150 151 printf("Check for SVEF32MM:\t"); 152 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEF32MM); 153 154 printf("Check for SVEF64MM:\t"); 155 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEF64MM); 156 157 printf("Check for SVEBF16:\t"); 158 CHECK_FOR_FLAG(RTE_CPUFLAG_SVEBF16); 159 160 printf("Check for WFXT:\t"); 161 CHECK_FOR_FLAG(RTE_CPUFLAG_WFXT); 162 #endif 163 164 #if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) 165 printf("Check for SSE:\t\t"); 166 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE); 167 168 printf("Check for SSE2:\t\t"); 169 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE2); 170 171 printf("Check for SSE3:\t\t"); 172 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE3); 173 174 printf("Check for SSE4.1:\t"); 175 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_1); 176 177 printf("Check for SSE4.2:\t"); 178 CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_2); 179 180 printf("Check for AVX:\t\t"); 181 CHECK_FOR_FLAG(RTE_CPUFLAG_AVX); 182 183 printf("Check for AVX2:\t\t"); 184 CHECK_FOR_FLAG(RTE_CPUFLAG_AVX2); 185 186 printf("Check for AVX512F:\t"); 187 CHECK_FOR_FLAG(RTE_CPUFLAG_AVX512F); 188 189 printf("Check for TRBOBST:\t"); 190 CHECK_FOR_FLAG(RTE_CPUFLAG_TRBOBST); 191 192 printf("Check for ENERGY_EFF:\t"); 193 CHECK_FOR_FLAG(RTE_CPUFLAG_ENERGY_EFF); 194 195 printf("Check for LAHF_SAHF:\t"); 196 CHECK_FOR_FLAG(RTE_CPUFLAG_LAHF_SAHF); 197 198 printf("Check for 1GB_PG:\t"); 199 CHECK_FOR_FLAG(RTE_CPUFLAG_1GB_PG); 200 201 printf("Check for INVTSC:\t"); 202 CHECK_FOR_FLAG(RTE_CPUFLAG_INVTSC); 203 #endif 204 205 #if defined(RTE_ARCH_RISCV) 206 207 printf("Check for RISCV_ISA_A:\t"); 208 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_A); 209 210 printf("Check for RISCV_ISA_B:\t"); 211 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_B); 212 213 printf("Check for RISCV_ISA_C:\t"); 214 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_C); 215 216 printf("Check for RISCV_ISA_D:\t"); 217 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_D); 218 219 printf("Check for RISCV_ISA_E:\t"); 220 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_E); 221 222 printf("Check for RISCV_ISA_F:\t"); 223 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_F); 224 225 printf("Check for RISCV_ISA_G:\t"); 226 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_G); 227 228 printf("Check for RISCV_ISA_H:\t"); 229 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_H); 230 231 printf("Check for RISCV_ISA_I:\t"); 232 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_I); 233 234 printf("Check for RISCV_ISA_J:\t"); 235 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_J); 236 237 printf("Check for RISCV_ISA_K:\t"); 238 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_K); 239 240 printf("Check for RISCV_ISA_L:\t"); 241 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_L); 242 243 printf("Check for RISCV_ISA_M:\t"); 244 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_M); 245 246 printf("Check for RISCV_ISA_N:\t"); 247 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_N); 248 249 printf("Check for RISCV_ISA_O:\t"); 250 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_O); 251 252 printf("Check for RISCV_ISA_P:\t"); 253 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_P); 254 255 printf("Check for RISCV_ISA_Q:\t"); 256 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_Q); 257 258 printf("Check for RISCV_ISA_R:\t"); 259 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_R); 260 261 printf("Check for RISCV_ISA_S:\t"); 262 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_S); 263 264 printf("Check for RISCV_ISA_T:\t"); 265 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_T); 266 267 printf("Check for RISCV_ISA_U:\t"); 268 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_U); 269 270 printf("Check for RISCV_ISA_V:\t"); 271 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_V); 272 273 printf("Check for RISCV_ISA_W:\t"); 274 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_W); 275 276 printf("Check for RISCV_ISA_X:\t"); 277 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_X); 278 279 printf("Check for RISCV_ISA_Y:\t"); 280 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_Y); 281 282 printf("Check for RISCV_ISA_Z:\t"); 283 CHECK_FOR_FLAG(RTE_CPUFLAG_RISCV_ISA_Z); 284 #endif 285 286 #if defined(RTE_ARCH_LOONGARCH) 287 printf("Check for CPUCFG:\t"); 288 CHECK_FOR_FLAG(RTE_CPUFLAG_CPUCFG); 289 290 printf("Check for LAM:\t\t"); 291 CHECK_FOR_FLAG(RTE_CPUFLAG_LAM); 292 293 printf("Check for UAL:\t\t"); 294 CHECK_FOR_FLAG(RTE_CPUFLAG_UAL); 295 296 printf("Check for FPU:\t\t"); 297 CHECK_FOR_FLAG(RTE_CPUFLAG_FPU); 298 299 printf("Check for LSX:\t\t"); 300 CHECK_FOR_FLAG(RTE_CPUFLAG_LSX); 301 302 printf("Check for LASX:\t\t"); 303 CHECK_FOR_FLAG(RTE_CPUFLAG_LASX); 304 305 printf("Check for CRC32:\t"); 306 CHECK_FOR_FLAG(RTE_CPUFLAG_CRC32); 307 308 printf("Check for COMPLEX:\t"); 309 CHECK_FOR_FLAG(RTE_CPUFLAG_COMPLEX); 310 311 printf("Check for CRYPTO:\t"); 312 CHECK_FOR_FLAG(RTE_CPUFLAG_CRYPTO); 313 314 printf("Check for LVZ:\t\t"); 315 CHECK_FOR_FLAG(RTE_CPUFLAG_LVZ); 316 317 printf("Check for LBT_X86:\t"); 318 CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_X86); 319 320 printf("Check for LBT_ARM:\t"); 321 CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_ARM); 322 323 printf("Check for LBT_MIPS:\t"); 324 CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_MIPS); 325 #endif 326 327 return 0; 328 } 329 330 REGISTER_FAST_TEST(cpuflags_autotest, true, true, test_cpuflags); 331