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