blob: c808df15348ab05a1c11b6c2154739c9a8f0e431 [file] [log] [blame]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02001/*
Manish V Badarkhe82e1a252022-01-04 13:45:31 +00002 * Copyright (c) 2018-2022, 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-Alves7581c382020-05-07 18:34:20 +010011#include <ffa_svc.h>
J-Alvesd56c53c2021-07-01 16:32:16 +010012#include <events.h>
J-Alvesf7535f42021-07-30 11:58:41 +010013#include <plat_topology.h>
J-Alves8f08a052020-05-26 17:14:40 +010014#include <psci.h>
Max Shvetsov103e0562021-02-04 16:58:31 +000015#include <spm_common.h>
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020016#include <tftf_lib.h>
17#include <trusted_os.h>
18#include <tsp.h>
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020019#include <uuid_utils.h>
Max Shvetsov103e0562021-02-04 16:58:31 +000020#include <uuid.h>
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020021
22typedef struct {
23 uintptr_t addr;
24 size_t size;
25 unsigned int attr;
26 void *arg;
27} map_args_unmap_t;
28
29typedef test_result_t (*test_function_arg_t)(void *arg);
30
Deepika Bhavnanic249d5e2020-02-06 16:29:45 -060031#ifndef __aarch64__
Joel Hutton8790f022019-03-15 14:47:02 +000032#define SKIP_TEST_IF_AARCH32() \
33 do { \
34 tftf_testcase_printf("Test not supported on aarch32\n"); \
35 return TEST_RESULT_SKIPPED; \
36 } while (0)
37#else
38#define SKIP_TEST_IF_AARCH32()
39#endif
40
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020041#define SKIP_TEST_IF_LESS_THAN_N_CLUSTERS(n) \
42 do { \
43 unsigned int clusters_cnt; \
44 clusters_cnt = tftf_get_total_clusters_count(); \
45 if (clusters_cnt < (n)) { \
46 tftf_testcase_printf( \
47 "Need at least %u clusters, only found %u\n", \
48 (n), clusters_cnt); \
49 return TEST_RESULT_SKIPPED; \
50 } \
51 } while (0)
52
53#define SKIP_TEST_IF_LESS_THAN_N_CPUS(n) \
54 do { \
55 unsigned int cpus_cnt; \
56 cpus_cnt = tftf_get_total_cpus_count(); \
57 if (cpus_cnt < (n)) { \
58 tftf_testcase_printf( \
59 "Need at least %u CPUs, only found %u\n", \
60 (n), cpus_cnt); \
61 return TEST_RESULT_SKIPPED; \
62 } \
63 } while (0)
64
65#define SKIP_TEST_IF_TRUSTED_OS_NOT_PRESENT() \
66 do { \
67 uuid_t tos_uuid; \
68 \
69 if (!is_trusted_os_present(&tos_uuid)) { \
70 tftf_testcase_printf("No Trusted OS detected\n"); \
71 return TEST_RESULT_SKIPPED; \
72 } \
73 } while (0)
74
75#define SKIP_TEST_IF_TSP_NOT_PRESENT() \
76 do { \
77 uuid_t tos_uuid; \
78 char tos_uuid_str[UUID_STR_SIZE]; \
79 \
80 if (!is_trusted_os_present(&tos_uuid)) { \
81 tftf_testcase_printf("No Trusted OS detected\n"); \
82 return TEST_RESULT_SKIPPED; \
83 } \
84 \
85 if (!uuid_equal(&tos_uuid, &tsp_uuid)) { \
86 tftf_testcase_printf( \
87 "Trusted OS is not the TSP, its UUID is: %s\n", \
88 uuid_to_str(&tos_uuid, tos_uuid_str)); \
89 return TEST_RESULT_SKIPPED; \
90 } \
91 } while (0)
92
Daniel Boulby0e4629f2021-10-26 14:01:23 +010093#define SKIP_TEST_IF_DIT_NOT_SUPPORTED() \
94 do { \
95 if (!is_armv8_4_dit_present()) { \
96 tftf_testcase_printf( \
97 "DIT not supported\n"); \
98 return TEST_RESULT_SKIPPED; \
99 } \
100 } while (0)
101
Joel Hutton8790f022019-03-15 14:47:02 +0000102#define SKIP_TEST_IF_PAUTH_NOT_SUPPORTED() \
103 do { \
104 if (!is_armv8_3_pauth_present()) { \
105 tftf_testcase_printf( \
106 "Pointer Authentication not supported\n"); \
107 return TEST_RESULT_SKIPPED; \
108 } \
109 } while (0)
110
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500111#define SKIP_TEST_IF_FGT_NOT_SUPPORTED() \
112 do { \
113 if (!is_armv8_6_fgt_present()) { \
114 tftf_testcase_printf( \
115 "Fine Grained Traps not supported\n"); \
116 return TEST_RESULT_SKIPPED; \
117 } \
118 } while (0)
119
Max Shvetsov959be332021-03-16 14:18:13 +0000120#define SKIP_TEST_IF_SVE_NOT_SUPPORTED() \
121 do { \
122 if (!is_armv8_2_sve_present()) { \
123 tftf_testcase_printf("SVE not supported\n"); \
124 return TEST_RESULT_SKIPPED; \
125 } \
126 } while (0)
127
Jimmy Brisson945095a2020-04-16 10:54:59 -0500128#define SKIP_TEST_IF_ECV_NOT_SELF_SYNC() \
129 do { \
130 if (get_armv8_6_ecv_support() != \
131 ID_AA64MMFR0_EL1_ECV_SELF_SYNCH) { \
132 tftf_testcase_printf("ARMv8.6-ECV not supported\n"); \
133 return TEST_RESULT_SKIPPED; \
134 } \
135 } while (0)
136
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200137#define SKIP_TEST_IF_MM_NOT_PRESENT() \
138 do { \
139 smc_args version_smc = { MM_VERSION_AARCH32 }; \
140 smc_ret_values smc_ret = tftf_smc(&version_smc); \
141 uint32_t version = smc_ret.ret0; \
142 \
143 if (version == (uint32_t) SMC_UNKNOWN) { \
144 tftf_testcase_printf("SPM not detected.\n"); \
145 return TEST_RESULT_SKIPPED; \
146 } \
147 } while (0)
148
Sandrine Bailleux277fb762019-10-08 12:10:45 +0200149#define SKIP_TEST_IF_MTE_SUPPORT_LESS_THAN(n) \
150 do { \
151 if (get_armv8_5_mte_support() < (n)) { \
152 tftf_testcase_printf( \
153 "Memory Tagging Extension not supported\n"); \
154 return TEST_RESULT_SKIPPED; \
155 } \
156 } while (0)
157
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200158#define SKIP_TEST_IF_MM_VERSION_LESS_THAN(major, minor) \
159 do { \
160 smc_args version_smc = { MM_VERSION_AARCH32 }; \
161 smc_ret_values smc_ret = tftf_smc(&version_smc); \
162 uint32_t version = smc_ret.ret0; \
163 \
164 if (version == (uint32_t) SMC_UNKNOWN) { \
165 tftf_testcase_printf("SPM not detected.\n"); \
166 return TEST_RESULT_SKIPPED; \
167 } \
168 \
169 if (version < MM_VERSION_FORM(major, minor)) { \
J-Alves8f08a052020-05-26 17:14:40 +0100170 tftf_testcase_printf("MM_VERSION returned %u.%u\n" \
171 "The required version is %u.%u\n", \
172 version >> MM_VERSION_MAJOR_SHIFT, \
173 version & MM_VERSION_MINOR_MASK, \
174 major, minor); \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200175 return TEST_RESULT_SKIPPED; \
176 } \
177 \
J-Alves8f08a052020-05-26 17:14:40 +0100178 VERBOSE("MM_VERSION returned %u.%u\n", \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200179 version >> MM_VERSION_MAJOR_SHIFT, \
180 version & MM_VERSION_MINOR_MASK); \
181 } while (0)
182
J-Alves7581c382020-05-07 18:34:20 +0100183#define SKIP_TEST_IF_FFA_VERSION_LESS_THAN(major, minor) \
Antonio Nino Diaz652d20a2018-12-10 17:17:33 +0000184 do { \
J-Alves8f08a052020-05-26 17:14:40 +0100185 smc_ret_values smc_ret = ffa_version( \
186 MAKE_FFA_VERSION(major, minor)); \
187 uint32_t version = smc_ret.ret0; \
Antonio Nino Diaz652d20a2018-12-10 17:17:33 +0000188 \
J-Alves8f08a052020-05-26 17:14:40 +0100189 if (version == FFA_ERROR_NOT_SUPPORTED) { \
190 tftf_testcase_printf("FFA_VERSION not supported.\n"); \
Antonio Nino Diaz652d20a2018-12-10 17:17:33 +0000191 return TEST_RESULT_SKIPPED; \
192 } \
193 \
J-Alves8f08a052020-05-26 17:14:40 +0100194 if ((version & FFA_VERSION_BIT31_MASK) != 0U) { \
195 tftf_testcase_printf("FFA_VERSION bad response: %x\n", \
196 version); \
197 return TEST_RESULT_FAIL; \
198 } \
199 \
200 if (version < MAKE_FFA_VERSION(major, minor)) { \
201 tftf_testcase_printf("FFA_VERSION returned %u.%u\n" \
202 "The required version is %u.%u\n", \
203 version >> FFA_VERSION_MAJOR_SHIFT, \
204 version & FFA_VERSION_MINOR_MASK, \
205 major, minor); \
Antonio Nino Diaz652d20a2018-12-10 17:17:33 +0000206 return TEST_RESULT_SKIPPED; \
207 } \
208 } while (0)
209
Petre-Ionut Tudorf68ebdb2019-09-18 16:13:00 +0100210#define SKIP_TEST_IF_ARCH_DEBUG_VERSION_LESS_THAN(version) \
211 do { \
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100212 uint32_t debug_ver = arch_get_debug_version(); \
Petre-Ionut Tudorf68ebdb2019-09-18 16:13:00 +0100213 \
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100214 if (debug_ver < version) { \
Petre-Ionut Tudorf68ebdb2019-09-18 16:13:00 +0100215 tftf_testcase_printf("Debug version returned %d\n" \
216 "The required version is %d\n", \
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100217 debug_ver, \
Petre-Ionut Tudorf68ebdb2019-09-18 16:13:00 +0100218 version); \
219 return TEST_RESULT_SKIPPED; \
220 } \
221 } while (0)
222
J-Alvesd708c032020-11-19 12:14:21 +0000223#define SKIP_TEST_IF_FFA_ENDPOINT_NOT_DEPLOYED(mb, ffa_uuid) \
J-Alvesf4743062020-10-27 19:39:57 +0000224 do { \
J-Alvesf4743062020-10-27 19:39:57 +0000225 smc_ret_values smc_ret = ffa_partition_info_get(ffa_uuid); \
226 ffa_rx_release(); \
Olivier Deprez58757e82021-07-30 10:18:00 +0200227 if (ffa_func_id(smc_ret) == FFA_ERROR && \
228 ffa_error_code(smc_ret) == FFA_ERROR_INVALID_PARAMETER) { \
J-Alvesf4743062020-10-27 19:39:57 +0000229 tftf_testcase_printf("FFA endpoint not deployed!\n"); \
230 return TEST_RESULT_SKIPPED; \
231 } else if (smc_ret.ret0 != FFA_SUCCESS_SMC32) { \
232 ERROR("ffa_partition_info_get failed!\n"); \
233 return TEST_RESULT_FAIL; \
234 } \
235 } while (0)
236
J-Alvesd708c032020-11-19 12:14:21 +0000237#define GET_TFTF_MAILBOX(mb) \
238 do { \
239 if (!get_tftf_mailbox(&mb)) { \
240 ERROR("Mailbox not configured!\nThis test relies on" \
241 " test suite \"FF-A RXTX Mapping\" to map/configure" \
242 " RXTX buffers\n"); \
243 return TEST_RESULT_FAIL; \
244 } \
245 } while (false);
246
nabkah01d5c67b82022-03-22 22:54:23 +0000247#define INIT_TFTF_MAILBOX(mb) \
248 do { \
249 if (!mailbox_init(mb)) { \
250 ERROR("Mailbox not configured properly!\n"); \
251 return TEST_RESULT_FAIL; \
252 } \
253 } while (false);
254
J-Alves04469302021-01-21 14:48:13 +0000255#define CHECK_SPMC_TESTING_SETUP(ffa_major, ffa_minor, expected_uuids) \
J-Alvesd708c032020-11-19 12:14:21 +0000256 do { \
Max Shvetsov959be332021-03-16 14:18:13 +0000257 SKIP_TEST_IF_AARCH32(); \
J-Alvesd708c032020-11-19 12:14:21 +0000258 const size_t expected_uuids_size = \
259 sizeof(expected_uuids) / sizeof(struct ffa_uuid); \
J-Alves04469302021-01-21 14:48:13 +0000260 test_result_t ret = check_spmc_testing_set_up( \
J-Alvesd708c032020-11-19 12:14:21 +0000261 ffa_major, ffa_minor, expected_uuids, \
262 expected_uuids_size); \
263 if (ret != TEST_RESULT_SUCCESS) { \
264 return ret; \
265 } \
266 } while (false);
267
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100268#define SKIP_TEST_IF_TRBE_NOT_SUPPORTED() \
269 do { \
270 if (!get_armv9_0_trbe_support()) { \
271 tftf_testcase_printf("ARMv9-TRBE not supported\n"); \
272 return TEST_RESULT_SKIPPED; \
273 } \
274 } while (false)
275
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100276#define SKIP_TEST_IF_TRF_NOT_SUPPORTED() \
277 do { \
278 if (!get_armv8_4_trf_support()) { \
279 tftf_testcase_printf("ARMv8.4-TRF not supported\n"); \
280 return TEST_RESULT_SKIPPED; \
281 } \
282 } while (false)
283
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100284#define SKIP_TEST_IF_SYS_REG_TRACE_NOT_SUPPORTED() \
285 do { \
286 if (!get_armv8_0_sys_reg_trace_support()) { \
287 tftf_testcase_printf("ARMv8-system register" \
288 "trace not supported\n"); \
289 return TEST_RESULT_SKIPPED; \
290 } \
291 } while (false)
292
Manish V Badarkhe82e1a252022-01-04 13:45:31 +0000293#define SKIP_TEST_IF_AFP_NOT_SUPPORTED() \
294 do { \
295 if (!get_feat_afp_present()) { \
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000296 tftf_testcase_printf("ARMv8.7-afp not supported\n"); \
Manish V Badarkhe82e1a252022-01-04 13:45:31 +0000297 return TEST_RESULT_SKIPPED; \
298 } \
299 } while (false)
300
Federico Recanati6328fb02022-01-14 15:48:16 +0100301#ifdef __aarch64__
Federico Recanatid3749b02022-01-14 15:44:45 +0100302#define SKIP_TEST_IF_PA_SIZE_LESS_THAN(n) \
303 do { \
304 static const unsigned int pa_range_bits_arr[] = { \
305 PARANGE_0000, PARANGE_0001, PARANGE_0010, PARANGE_0011,\
306 PARANGE_0100, PARANGE_0101, PARANGE_0110 \
307 }; \
308 if (pa_range_bits_arr[get_pa_range()] < n) { \
309 tftf_testcase_printf("PA size less than %d bit\n", n); \
310 return TEST_RESULT_SKIPPED; \
311 } \
312 } while (false)
Federico Recanati6328fb02022-01-14 15:48:16 +0100313#else
314#define SKIP_TEST_IF_PA_SIZE_LESS_THAN(n) \
315 do { \
316 return TEST_RESULT_SKIPPED; \
317 } while (false)
318#endif
Federico Recanatid3749b02022-01-14 15:44:45 +0100319
johpow018c3da8b2022-01-31 18:14:41 -0600320#define SKIP_TEST_IF_BRBE_NOT_SUPPORTED() \
321 do { \
322 if (!get_feat_brbe_support()) { \
323 tftf_testcase_printf("FEAT_BRBE not supported\n"); \
324 return TEST_RESULT_SKIPPED; \
325 } \
326 } while (false)
327
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000328#define SKIP_TEST_IF_WFXT_NOT_SUPPORTED() \
329 do { \
330 if (!get_feat_wfxt_present()) { \
331 tftf_testcase_printf("ARMv8.7-WFxT not supported\n"); \
332 return TEST_RESULT_SKIPPED; \
333 } \
334 } while (false)
335
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200336/* Helper macro to verify if system suspend API is supported */
337#define is_psci_sys_susp_supported() \
J-Alves8f08a052020-05-26 17:14:40 +0100338 (tftf_get_psci_feature_info(SMC_PSCI_SYSTEM_SUSPEND) \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200339 == PSCI_E_SUCCESS)
340
341/* Helper macro to verify if PSCI_STAT_COUNT API is supported */
342#define is_psci_stat_count_supported() \
J-Alves8f08a052020-05-26 17:14:40 +0100343 (tftf_get_psci_feature_info(SMC_PSCI_STAT_COUNT) \
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200344 == PSCI_E_SUCCESS)
345
346/*
347 * Helper function to verify the system state is ready for system
348 * suspend. i.e., a single CPU is running and all other CPUs are powered off.
349 * Returns 1 if the system is ready to suspend, 0 otherwise.
350 */
351int is_sys_suspend_state_ready(void);
352
353/*
354 * Helper function to reset the system. This function shouldn't return.
355 * It is not marked with __dead to help the test to catch some error in
356 * TF
357 */
358void psci_system_reset(void);
359
360/*
361 * Helper function that enables/disables the mem_protect mechanism
362 */
363int psci_mem_protect(int val);
364
365
366/*
367 * Helper function to call PSCI MEM_PROTECT_CHECK
368 */
369int psci_mem_protect_check(uintptr_t addr, size_t size);
370
371
372/*
373 * Helper function to get a sentinel address that can be used to test mem_protect
374 */
375unsigned char *psci_mem_prot_get_sentinel(void);
376
377/*
378 * Helper function to memory map and unmap a region needed by a test.
379 *
380 * Return TEST_RESULT_FAIL if the memory could not be successfully mapped or
381 * unmapped. Otherwise, return the test functions's result.
382 */
383test_result_t map_test_unmap(const map_args_unmap_t *args,
384 test_function_arg_t test);
385
J-Alvesf1126f22020-11-02 17:28:20 +0000386/*
387 * Helper function to set TFTF global mailbox for SPM related tests.
388 * This function should be invoked by the first TFTF test that requires
389 * RX and/or TX buffers.
390 */
391void set_tftf_mailbox(const struct mailbox_buffers *mb);
392
393/*
394 * Helper function to get TFTF global mailbox for SPM related tests.
395 * This function should be called by all tests that require access to RX or TX
396 * buffers, after the function 'set_tftf_mailbox' has been used by the first
397 * test to rely on RX and TX buffers.
398 */
399bool get_tftf_mailbox(struct mailbox_buffers *mb);
400
J-Alves04469302021-01-21 14:48:13 +0000401test_result_t check_spmc_testing_set_up(uint32_t ffa_version_major,
J-Alvesd708c032020-11-19 12:14:21 +0000402 uint32_t ffa_version_minor, const struct ffa_uuid *ffa_uuids,
403 size_t ffa_uuids_size);
404
J-Alvesd56c53c2021-07-01 16:32:16 +0100405/**
406 * Turn on all cpus to execute a test in all.
407 * - 'cpu_on_handler' should have the code containing the test.
408 * - 'cpu_booted' is used for notifying which cores the test has been executed.
409 * This should be used in the test executed by cpu_on_handler at the end of
410 * processing to make sure it complies with this function's implementation.
411 */
412test_result_t spm_run_multi_core_test(uintptr_t cpu_on_handler,
413 event_t *cpu_booted);
414
J-Alves952e1f72021-07-30 17:19:09 +0100415/**
J-Alves79c08f12021-10-27 15:15:16 +0100416 * Call FFA_RUN in the designated SP to make it reach the message loop.
417 * Used within CPU_ON handlers, to bring up the SP in the current core.
418 */
419bool spm_core_sp_init(ffa_id_t sp_id);
420
421/**
J-Alves952e1f72021-07-30 17:19:09 +0100422 * Enable/Disable managed exit interrupt for the provided SP.
423 */
424bool spm_set_managed_exit_int(ffa_id_t sp_id, bool enable);
425
nabkah01d5c67b82022-03-22 22:54:23 +0000426/**
427 * Initializes the Mailbox for other SPM related tests that need to use
428 * RXTX buffers.
429 */
430bool mailbox_init(struct mailbox_buffers mb);
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200431#endif /* __TEST_HELPERS_H__ */