Branch data Line data Source code
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 [ + - - + : 13 : switch (result) { - - + - - + - - + - - + - - + - - + - - - - + - - + + - - + - - + - - ] 29 : : case 0: 30 : : return "NOT PRESENT"; 31 : 11 : case 1: 32 : 11 : return "OK"; 33 : 0 : default: 34 : 0 : 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 : 1 : 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 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_SSE); 167 : : 168 : : printf("Check for SSE2:\t\t"); 169 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_SSE2); 170 : : 171 : : printf("Check for SSE3:\t\t"); 172 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_SSE3); 173 : : 174 : : printf("Check for SSE4.1:\t"); 175 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_1); 176 : : 177 : : printf("Check for SSE4.2:\t"); 178 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_2); 179 : : 180 : : printf("Check for AVX:\t\t"); 181 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_AVX); 182 : : 183 : : printf("Check for AVX2:\t\t"); 184 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_AVX2); 185 : : 186 : : printf("Check for AVX512F:\t"); 187 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_AVX512F); 188 : : 189 : : printf("Check for TRBOBST:\t"); 190 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_TRBOBST); 191 : : 192 : : printf("Check for ENERGY_EFF:\t"); 193 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_ENERGY_EFF); 194 : : 195 : : printf("Check for LAHF_SAHF:\t"); 196 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_LAHF_SAHF); 197 : : 198 : : printf("Check for 1GB_PG:\t"); 199 [ + - ]: 2 : CHECK_FOR_FLAG(RTE_CPUFLAG_1GB_PG); 200 : : 201 : : printf("Check for INVTSC:\t"); 202 [ - + ]: 2 : 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 : 252 : REGISTER_FAST_TEST(cpuflags_autotest, true, true, test_cpuflags);