xref: /dpdk/app/test/test_cpuflags.c (revision d9739192)
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 Richardson cpu_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 Richardson test_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