blob: fe29ee554feca508e95ed8977c7357cfaf22c820 [file] [log] [blame]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02001/*
Arvind Ram Prakash13887ac2024-01-04 15:22:52 -06002 * Copyright (c) 2018-2024, Arm Limited. All rights reserved.
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
J-Alvesd708c032020-11-19 12:14:21 +00007#ifndef TEST_HELPERS_H__
8#define TEST_HELPERS_H__
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02009
Joel Hutton8790f022019-03-15 14:47:02 +000010#include <arch_features.h>
J-Alvesf7535f42021-07-30 11:58:41 +010011#include <plat_topology.h>
J-Alves8f08a052020-05-26 17:14:40 +010012#include <psci.h>
Jayanth Dodderi Chidanandb3ffd3c2023-02-13 12:15:11 +000013#include <sme.h>
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020014#include <tftf_lib.h>
15#include <trusted_os.h>
16#include <tsp.h>
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020017#include <uuid_utils.h>
Max Shvetsov103e0562021-02-04 16:58:31 +000018#include <uuid.h>
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020019
20typedef struct {
21 uintptr_t addr;
22 size_t size;
23 unsigned int attr;
24 void *arg;
25} map_args_unmap_t;
26
27typedef test_result_t (*test_function_arg_t)(void *arg);
28
Deepika Bhavnanic249d5e2020-02-06 16:29:45 -060029#ifndef __aarch64__
Joel Hutton8790f022019-03-15 14:47:02 +000030#define SKIP_TEST_IF_AARCH32() \
31 do { \
32 tftf_testcase_printf("Test not supported on aarch32\n"); \
33 return TEST_RESULT_SKIPPED; \
34 } while (0)
35#else
36#define SKIP_TEST_IF_AARCH32()
37#endif
38
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020039#define SKIP_TEST_IF_LESS_THAN_N_CLUSTERS(n) \
40 do { \
41 unsigned int clusters_cnt; \
42 clusters_cnt = tftf_get_total_clusters_count(); \
43 if (clusters_cnt < (n)) { \
44 tftf_testcase_printf( \
45 "Need at least %u clusters, only found %u\n", \
46 (n), clusters_cnt); \
47 return TEST_RESULT_SKIPPED; \
48 } \
49 } while (0)
50
51#define SKIP_TEST_IF_LESS_THAN_N_CPUS(n) \
52 do { \
53 unsigned int cpus_cnt; \
54 cpus_cnt = tftf_get_total_cpus_count(); \
55 if (cpus_cnt < (n)) { \
56 tftf_testcase_printf( \
57 "Need at least %u CPUs, only found %u\n", \
58 (n), cpus_cnt); \
59 return TEST_RESULT_SKIPPED; \
60 } \
61 } while (0)
62
63#define SKIP_TEST_IF_TRUSTED_OS_NOT_PRESENT() \
64 do { \
65 uuid_t tos_uuid; \
66 \
67 if (!is_trusted_os_present(&tos_uuid)) { \
68 tftf_testcase_printf("No Trusted OS detected\n"); \
69 return TEST_RESULT_SKIPPED; \
70 } \
71 } while (0)
72
73#define SKIP_TEST_IF_TSP_NOT_PRESENT() \
74 do { \
75 uuid_t tos_uuid; \
76 char tos_uuid_str[UUID_STR_SIZE]; \
77 \
78 if (!is_trusted_os_present(&tos_uuid)) { \
79 tftf_testcase_printf("No Trusted OS detected\n"); \
80 return TEST_RESULT_SKIPPED; \
81 } \
82 \
83 if (!uuid_equal(&tos_uuid, &tsp_uuid)) { \
84 tftf_testcase_printf( \
85 "Trusted OS is not the TSP, its UUID is: %s\n", \
86 uuid_to_str(&tos_uuid, tos_uuid_str)); \
87 return TEST_RESULT_SKIPPED; \
88 } \
89 } while (0)
90
Daniel Boulby0e4629f2021-10-26 14:01:23 +010091#define SKIP_TEST_IF_DIT_NOT_SUPPORTED() \
92 do { \
93 if (!is_armv8_4_dit_present()) { \
94 tftf_testcase_printf( \
95 "DIT not supported\n"); \
96 return TEST_RESULT_SKIPPED; \
97 } \
98 } while (0)
99
Joel Hutton8790f022019-03-15 14:47:02 +0000100#define SKIP_TEST_IF_PAUTH_NOT_SUPPORTED() \
101 do { \
102 if (!is_armv8_3_pauth_present()) { \
103 tftf_testcase_printf( \
104 "Pointer Authentication not supported\n"); \
105 return TEST_RESULT_SKIPPED; \
106 } \
107 } while (0)
108
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500109#define SKIP_TEST_IF_FGT_NOT_SUPPORTED() \
110 do { \
111 if (!is_armv8_6_fgt_present()) { \
112 tftf_testcase_printf( \
113 "Fine Grained Traps not supported\n"); \
114 return TEST_RESULT_SKIPPED; \
115 } \
116 } while (0)
117
Arvind Ram Prakash2f2c9592024-06-06 16:34:28 -0500118#define SKIP_TEST_IF_DEBUGV8P9_NOT_SUPPORTED() \
119 do { \
120 if (arch_get_debug_version() != \
121 ID_AA64DFR0_V8_9_DEBUG_ARCH_SUPPORTED) { \
122 tftf_testcase_printf( \
123 "Debugv8p9 not supported\n"); \
124 return TEST_RESULT_SKIPPED; \
125 } \
126 } while (0)
127
Arvind Ram Prakash94963d42024-06-13 17:19:56 -0500128#define SKIP_TEST_IF_FGT2_NOT_SUPPORTED() \
129 do { \
130 if (!is_armv8_9_fgt2_present()) { \
131 tftf_testcase_printf( \
132 "Fine Grained Traps 2 not supported\n"); \
133 return TEST_RESULT_SKIPPED; \
134 } \
135 } while (0)
136
Max Shvetsov959be332021-03-16 14:18:13 +0000137#define SKIP_TEST_IF_SVE_NOT_SUPPORTED() \
138 do { \
139 if (!is_armv8_2_sve_present()) { \
140 tftf_testcase_printf("SVE not supported\n"); \
141 return TEST_RESULT_SKIPPED; \
142 } \
143 } while (0)
144
Jimmy Brisson945095a2020-04-16 10:54:59 -0500145#define SKIP_TEST_IF_ECV_NOT_SELF_SYNC() \
146 do { \
147 if (get_armv8_6_ecv_support() != \
148 ID_AA64MMFR0_EL1_ECV_SELF_SYNCH) { \
149 tftf_testcase_printf("ARMv8.6-ECV not supported\n"); \
150 return TEST_RESULT_SKIPPED; \
151 } \
152 } while (0)
153
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200154#define SKIP_TEST_IF_MM_NOT_PRESENT() \
155 do { \
156 smc_args version_smc = { MM_VERSION_AARCH32 }; \
157 smc_ret_values smc_ret = tftf_smc(&version_smc); \
158 uint32_t version = smc_ret.ret0; \
159 \
160 if (version == (uint32_t) SMC_UNKNOWN) { \
161 tftf_testcase_printf("SPM not detected.\n"); \
162 return TEST_RESULT_SKIPPED; \
163 } \
164 } while (0)
165
Sandrine Bailleux277fb762019-10-08 12:10:45 +0200166#define SKIP_TEST_IF_MTE_SUPPORT_LESS_THAN(n) \
167 do { \
168 if (get_armv8_5_mte_support() < (n)) { \
169 tftf_testcase_printf( \
170 "Memory Tagging Extension not supported\n"); \
171 return TEST_RESULT_SKIPPED; \
172 } \
173 } while (0)
174
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200175#define SKIP_TEST_IF_MM_VERSION_LESS_THAN(major, minor) \
176 do { \
177 smc_args version_smc = { MM_VERSION_AARCH32 }; \
178 smc_ret_values smc_ret = tftf_smc(&version_smc); \
179 uint32_t version = smc_ret.ret0; \
180 \
181 if (version == (uint32_t) SMC_UNKNOWN) { \
182 tftf_testcase_printf("SPM not detected.\n"); \
183 return TEST_RESULT_SKIPPED; \
184 } \
185 \
186 if (version < MM_VERSION_FORM(major, minor)) { \
J-Alves8f08a052020-05-26 17:14:40 +0100187 tftf_testcase_printf("MM_VERSION returned %u.%u\n" \
188 "The required version is %u.%u\n", \
189 version >> MM_VERSION_MAJOR_SHIFT, \
190 version & MM_VERSION_MINOR_MASK, \
191 major, minor); \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200192 return TEST_RESULT_SKIPPED; \
193 } \
194 \
J-Alves8f08a052020-05-26 17:14:40 +0100195 VERBOSE("MM_VERSION returned %u.%u\n", \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200196 version >> MM_VERSION_MAJOR_SHIFT, \
197 version & MM_VERSION_MINOR_MASK); \
198 } while (0)
199
Petre-Ionut Tudorf68ebdb2019-09-18 16:13:00 +0100200#define SKIP_TEST_IF_ARCH_DEBUG_VERSION_LESS_THAN(version) \
201 do { \
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100202 uint32_t debug_ver = arch_get_debug_version(); \
Petre-Ionut Tudorf68ebdb2019-09-18 16:13:00 +0100203 \
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100204 if (debug_ver < version) { \
Petre-Ionut Tudorf68ebdb2019-09-18 16:13:00 +0100205 tftf_testcase_printf("Debug version returned %d\n" \
206 "The required version is %d\n", \
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100207 debug_ver, \
Petre-Ionut Tudorf68ebdb2019-09-18 16:13:00 +0100208 version); \
209 return TEST_RESULT_SKIPPED; \
210 } \
211 } while (0)
212
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100213#define SKIP_TEST_IF_TRBE_NOT_SUPPORTED() \
214 do { \
215 if (!get_armv9_0_trbe_support()) { \
216 tftf_testcase_printf("ARMv9-TRBE not supported\n"); \
217 return TEST_RESULT_SKIPPED; \
218 } \
219 } while (false)
220
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100221#define SKIP_TEST_IF_TRF_NOT_SUPPORTED() \
222 do { \
223 if (!get_armv8_4_trf_support()) { \
224 tftf_testcase_printf("ARMv8.4-TRF not supported\n"); \
225 return TEST_RESULT_SKIPPED; \
226 } \
227 } while (false)
228
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100229#define SKIP_TEST_IF_SYS_REG_TRACE_NOT_SUPPORTED() \
230 do { \
231 if (!get_armv8_0_sys_reg_trace_support()) { \
232 tftf_testcase_printf("ARMv8-system register" \
233 "trace not supported\n"); \
234 return TEST_RESULT_SKIPPED; \
235 } \
236 } while (false)
237
Manish V Badarkhe82e1a252022-01-04 13:45:31 +0000238#define SKIP_TEST_IF_AFP_NOT_SUPPORTED() \
239 do { \
240 if (!get_feat_afp_present()) { \
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000241 tftf_testcase_printf("ARMv8.7-afp not supported\n"); \
Manish V Badarkhe82e1a252022-01-04 13:45:31 +0000242 return TEST_RESULT_SKIPPED; \
243 } \
244 } while (false)
245
Arvind Ram Prakash13887ac2024-01-04 15:22:52 -0600246#define SKIP_TEST_IF_MPAM_NOT_SUPPORTED() \
247 do { \
248 if(!is_feat_mpam_supported()){ \
249 tftf_testcase_printf("ARMv8.4-mpam not supported\n"); \
250 return TEST_RESULT_SKIPPED; \
251 } \
252 } while (false)
253
Federico Recanati6328fb02022-01-14 15:48:16 +0100254#ifdef __aarch64__
Federico Recanatid3749b02022-01-14 15:44:45 +0100255#define SKIP_TEST_IF_PA_SIZE_LESS_THAN(n) \
256 do { \
257 static const unsigned int pa_range_bits_arr[] = { \
258 PARANGE_0000, PARANGE_0001, PARANGE_0010, PARANGE_0011,\
259 PARANGE_0100, PARANGE_0101, PARANGE_0110 \
260 }; \
261 if (pa_range_bits_arr[get_pa_range()] < n) { \
262 tftf_testcase_printf("PA size less than %d bit\n", n); \
263 return TEST_RESULT_SKIPPED; \
264 } \
265 } while (false)
Federico Recanati6328fb02022-01-14 15:48:16 +0100266#else
267#define SKIP_TEST_IF_PA_SIZE_LESS_THAN(n) \
268 do { \
269 return TEST_RESULT_SKIPPED; \
270 } while (false)
271#endif
Federico Recanatid3749b02022-01-14 15:44:45 +0100272
johpow018c3da8b2022-01-31 18:14:41 -0600273#define SKIP_TEST_IF_BRBE_NOT_SUPPORTED() \
274 do { \
275 if (!get_feat_brbe_support()) { \
276 tftf_testcase_printf("FEAT_BRBE not supported\n"); \
277 return TEST_RESULT_SKIPPED; \
278 } \
279 } while (false)
280
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000281#define SKIP_TEST_IF_WFXT_NOT_SUPPORTED() \
282 do { \
283 if (!get_feat_wfxt_present()) { \
284 tftf_testcase_printf("ARMv8.7-WFxT not supported\n"); \
285 return TEST_RESULT_SKIPPED; \
286 } \
287 } while (false)
288
Juan Pablo Conde9303f4d2022-07-25 16:38:01 -0400289#define SKIP_TEST_IF_RNG_TRAP_NOT_SUPPORTED() \
290 do { \
291 if (!is_feat_rng_trap_present()) { \
292 tftf_testcase_printf("ARMv8.5-RNG_TRAP not" \
293 "supported\n"); \
294 return TEST_RESULT_SKIPPED; \
295 } \
296 } while (false)
297
Boyan Karatotev35e3ca02022-10-10 16:39:45 +0100298#define SKIP_TEST_IF_PMUV3_NOT_SUPPORTED() \
299 do { \
300 if (!get_feat_pmuv3_supported()) { \
301 tftf_testcase_printf("FEAT_PMUv3 not supported\n"); \
302 return TEST_RESULT_SKIPPED; \
303 } \
304 } while (false)
305
Jayanth Dodderi Chidanandb3ffd3c2023-02-13 12:15:11 +0000306#define SKIP_TEST_IF_SME_NOT_SUPPORTED() \
307 do { \
308 if(!is_feat_sme_supported()) { \
309 tftf_testcase_printf("FEAT_SME not supported\n"); \
310 return TEST_RESULT_SKIPPED; \
311 } \
312 } while (false)
313
Jayanth Dodderi Chidanand95d5d272023-01-16 17:58:47 +0000314#define SKIP_TEST_IF_SME2_NOT_SUPPORTED() \
315 do { \
316 if(!is_feat_sme2_supported()) { \
317 tftf_testcase_printf("FEAT_SME2 not supported\n"); \
318 return TEST_RESULT_SKIPPED; \
319 } \
320 } while (false)
321
Arvind Ram Prakash1ab21e52024-11-12 10:52:08 -0600322#define SKIP_TEST_IF_FPMR_NOT_SUPPORTED() \
323 do { \
324 if(!is_feat_fpmr_present()) { \
325 tftf_testcase_printf("FEAT_FPMR not supported\n"); \
326 return TEST_RESULT_SKIPPED; \
327 } \
328 } while (false)
329
Igor Podgainõid1a7f4d2024-11-26 12:50:47 +0100330#define SKIP_TEST_IF_SCTLR2_NOT_SUPPORTED() \
331 do { \
332 if (!is_feat_sctlr2_supported()) { \
333 tftf_testcase_printf("FEAT_SCTLR2 not supported\n"); \
334 return TEST_RESULT_SKIPPED; \
335 } \
336 } while (false)
337
338#define SKIP_TEST_IF_THE_NOT_SUPPORTED() \
339 do { \
340 if (!is_feat_the_supported()) { \
341 tftf_testcase_printf("FEAT_THE not supported\n"); \
342 return TEST_RESULT_SKIPPED; \
343 } \
344 } while (false)
345
346#define SKIP_TEST_IF_D128_NOT_SUPPORTED() \
347 do { \
348 if (!is_feat_d128_supported()) { \
349 tftf_testcase_printf("FEAT_D128 not supported\n"); \
350 return TEST_RESULT_SKIPPED; \
351 } \
352 } while (false)
353
Arunachalam Ganapathy4b221112023-04-05 14:19:03 +0100354#define SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP() \
355 do { \
Shruti Gupta40de8ec2023-10-12 21:45:12 +0100356 u_register_t retrmm = 0U; \
Arunachalam Ganapathy4b221112023-04-05 14:19:03 +0100357 \
358 if (!get_armv9_2_feat_rme_support()) { \
359 tftf_testcase_printf("FEAT_RME not supported\n"); \
360 return TEST_RESULT_SKIPPED; \
361 } \
362 \
363 host_rmi_init_cmp_result(); \
Shruti Gupta40de8ec2023-10-12 21:45:12 +0100364 retrmm = host_rmi_version(RMI_ABI_VERSION_VAL); \
Arunachalam Ganapathy4b221112023-04-05 14:19:03 +0100365 \
366 VERBOSE("RMM version is: %lu.%lu\n", \
367 RMI_ABI_VERSION_GET_MAJOR(retrmm), \
368 RMI_ABI_VERSION_GET_MINOR(retrmm)); \
369 \
370 /* \
371 * TODO: Remove this once SMC_RMM_REALM_CREATE is implemented \
372 * in TRP. For the moment skip the test if RMM is TRP, TRP \
373 * version is always 0. \
374 */ \
375 if (retrmm == 0U) { \
376 tftf_testcase_printf("RMM is TRP\n"); \
377 return TEST_RESULT_SKIPPED; \
378 } \
379 } while (false)
380
Jayanth Dodderi Chidanandcd6c94b2022-02-15 17:19:05 +0000381#define SKIP_TEST_IF_LS64_NOT_SUPPORTED() \
382 do { \
383 if (get_feat_ls64_support() == \
384 ID_AA64ISAR1_LS64_NOT_SUPPORTED) { \
385 tftf_testcase_printf("ARMv8.7-ls64 not supported"); \
386 return TEST_RESULT_SKIPPED; \
387 } \
388 } while (false)
389
Andre Przywara72b7ce12024-11-04 13:44:39 +0000390#define SKIP_TEST_IF_LS64_ACCDATA_NOT_SUPPORTED() \
391 do { \
392 if (get_feat_ls64_support() < \
393 ID_AA64ISAR1_LS64_ACCDATA_SUPPORTED) { \
394 tftf_testcase_printf("ARMv8.7-ls64-accdata not supported"); \
395 return TEST_RESULT_SKIPPED; \
396 } \
397 } while (false)
398
Javier Almansa Sobrino7c78f7b2024-10-25 11:44:32 +0100399#define SKIP_TEST_IF_DOUBLE_FAULT2_NOT_SUPPORTED() \
400 do { \
401 if (is_feat_double_fault2_present() == false) { \
402 return TEST_RESULT_SKIPPED; \
403 } \
404 } while (false)
405
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200406/* Helper macro to verify if system suspend API is supported */
407#define is_psci_sys_susp_supported() \
J-Alves8f08a052020-05-26 17:14:40 +0100408 (tftf_get_psci_feature_info(SMC_PSCI_SYSTEM_SUSPEND) \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200409 == PSCI_E_SUCCESS)
410
411/* Helper macro to verify if PSCI_STAT_COUNT API is supported */
412#define is_psci_stat_count_supported() \
J-Alves8f08a052020-05-26 17:14:40 +0100413 (tftf_get_psci_feature_info(SMC_PSCI_STAT_COUNT) \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200414 == PSCI_E_SUCCESS)
415
416/*
417 * Helper function to verify the system state is ready for system
418 * suspend. i.e., a single CPU is running and all other CPUs are powered off.
419 * Returns 1 if the system is ready to suspend, 0 otherwise.
420 */
421int is_sys_suspend_state_ready(void);
422
423/*
424 * Helper function to reset the system. This function shouldn't return.
425 * It is not marked with __dead to help the test to catch some error in
426 * TF
427 */
428void psci_system_reset(void);
429
430/*
431 * Helper function that enables/disables the mem_protect mechanism
432 */
433int psci_mem_protect(int val);
434
435
436/*
437 * Helper function to call PSCI MEM_PROTECT_CHECK
438 */
439int psci_mem_protect_check(uintptr_t addr, size_t size);
440
441
442/*
443 * Helper function to get a sentinel address that can be used to test mem_protect
444 */
445unsigned char *psci_mem_prot_get_sentinel(void);
446
447/*
448 * Helper function to memory map and unmap a region needed by a test.
449 *
450 * Return TEST_RESULT_FAIL if the memory could not be successfully mapped or
451 * unmapped. Otherwise, return the test functions's result.
452 */
453test_result_t map_test_unmap(const map_args_unmap_t *args,
454 test_function_arg_t test);
455
J-Alvesf1126f22020-11-02 17:28:20 +0000456/*
nabkah019ea16642022-03-01 19:39:59 +0000457 * Utility function to wait for all CPUs other than the caller to be
458 * OFF.
459 */
460void wait_for_non_lead_cpus(void);
461
462/*
463 * Utility function to wait for a given CPU other than the caller to be
464 * OFF.
465 */
466void wait_for_core_to_turn_off(unsigned int mpidr);
AlexeiFedorov2f30f102023-03-13 19:37:46 +0000467
468/* Generate 64-bit random number */
469unsigned long long rand64(void);
470
Arvind Ram Prakash81916212024-08-15 15:08:23 -0500471/* TRBE Errata */
472#define CORTEX_A520_MIDR U(0x410FD800)
473#define CORTEX_X4_MIDR U(0x410FD821)
474#define RXPX_RANGE(x, y, z) (((x >= y) && (x <= z)) ? true : false)
475bool is_trbe_errata_affected_core(void);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200476#endif /* __TEST_HELPERS_H__ */