17 #include "tfm_plat_test.h"
19 #define IRQ_TEST_TOOL_CODE_LOCATION(name)
34 static void halt_test_execution(
void)
44 static void stop_timer(
void)
47 tfm_plat_test_secure_timer_stop();
54 current_scenario = irq_test_scenario;
55 current_execution_data = execution_data;
59 switch (irq_test_scenario) {
66 tfm_plat_test_secure_timer_start();
86 if (irq_test_scenario != current_scenario) {
90 switch (irq_test_scenario) {
111 signals =
psa_wait(SPM_CORE_IRQ_TEST_1_SIGNAL_TIMER_0_IRQ,
117 psa_eoi(SPM_CORE_IRQ_TEST_1_SIGNAL_TIMER_0_IRQ);
136 if ((in_len != 2) || (out_len != 0)) {
140 if ((in_vec[0].len !=
sizeof(uint32_t)) ||
161 if ((current_execution_data == NULL) ||
163 halt_test_execution();
168 switch (current_scenario) {
181 halt_test_execution();
185 halt_test_execution();
196 static void spm_irq_test_1_signal_handle(
psa_signal_t signal,
197 irq_test_1_func_t pfn)
202 status =
psa_get(signal, &msg);
223 void TIMER_0_isr_ipc(
void)
229 switch (current_scenario) {
239 if (execute_msg_handle <= 0) {
240 halt_test_execution();
244 execute_msg_handle = -1;
253 halt_test_execution();
257 halt_test_execution();
260 halt_test_execution();
267 uint32_t irq_test_scenario;
271 if ((msg->
in_size[0] !=
sizeof(uint32_t)) ||
277 num =
psa_read(msg->
handle, 0, &irq_test_scenario,
sizeof(uint32_t));
293 static void spm_irq_test_1_execute_test_scenario_ipc_call(
psa_msg_t *msg)
296 uint32_t irq_test_scenario;
299 num =
psa_read(msg->
handle, 0, &irq_test_scenario,
sizeof(uint32_t));
300 if ((num != msg->
in_size[0]) ||
301 (irq_test_scenario != current_scenario)) {
306 switch (irq_test_scenario) {
326 if (execute_msg_handle > 0) {
331 execute_msg_handle = msg->
handle;
333 signals =
psa_wait(SPM_CORE_IRQ_TEST_1_SIGNAL_TIMER_0_IRQ,
338 while (!(signals & SPM_CORE_IRQ_TEST_1_SIGNAL_TIMER_0_IRQ)) {
339 signals =
psa_wait(SPM_CORE_IRQ_TEST_1_SIGNAL_TIMER_0_IRQ,
346 psa_eoi(SPM_CORE_IRQ_TEST_1_SIGNAL_TIMER_0_IRQ);
355 static void spm_irq_test_1_execute_test_scenario_ipc(
psa_signal_t signal)
360 status =
psa_get(signal, &msg);
374 spm_irq_test_1_execute_test_scenario_ipc_call(&msg);
393 if (signals & SPM_CORE_IRQ_TEST_1_SIGNAL_TIMER_0_IRQ) {
396 spm_irq_test_1_signal_handle(
397 SPM_CORE_IRQ_TEST_1_PREPARE_TEST_SCENARIO_SIGNAL,
398 spm_irq_test_1_wrap_prepare_test_scenario);
400 spm_irq_test_1_execute_test_scenario_ipc(
401 SPM_CORE_IRQ_TEST_1_EXECUTE_TEST_SCENARIO_SIGNAL);
#define SPM_CORE_IRQ_TEST_1_PREPARE_TEST_SCENARIO_SIGNAL
#define SPM_CORE_IRQ_TEST_1_SIGNAL_TIMER_0_IRQ
int32_t tfm_irq_test_1_init(void)
int32_t spm_irq_test_1_prepare_test_scenario_internal(enum irq_test_scenario_t irq_test_scenario, struct irq_test_execution_data_t *execution_data)
int32_t spm_irq_test_1_execute_test_scenario(struct psa_invec *in_vec, size_t in_len, struct psa_outvec *out_vec, size_t out_len)
#define IRQ_TEST_TOOL_CODE_LOCATION(name)
void tfm_enable_irq(psa_signal_t irq_signal)
size_t psa_read(psa_handle_t msg_handle, uint32_t invec_idx, void *buffer, size_t num_bytes)
Read a message parameter or part of a message parameter from a client input vector.
#define SPM_CORE_IRQ_TEST_1_EXECUTE_TEST_SCENARIO_SIGNAL
void SPM_CORE_IRQ_TEST_1_SIGNAL_TIMER_0_IRQ_isr(void)
#define PSA_IPC_DISCONNECT
uint32_t spm_irq_test_1_prepare_test_scenario(struct psa_invec *in_vec, size_t in_len, struct psa_outvec *out_vec, size_t out_len)
size_t in_size[PSA_MAX_IOVEC]
void psa_reply(psa_handle_t msg_handle, psa_status_t status)
Complete handling of a specific message and unblock the client.
psa_signal_t psa_wait(psa_signal_t signal_mask, uint32_t timeout)
Return the Secure Partition interrupt signals that have been asserted from a subset of signals provid...
void psa_eoi(psa_signal_t irq_signal)
Inform the SPM that an interrupt has been handled (end of interrupt).
psa_status_t psa_get(psa_signal_t signal, psa_msg_t *msg)
Retrieve the message which corresponds to a given RoT Service signal and remove the message from the ...
int32_t psa_status_t
Function return status.
volatile int32_t timer0_triggered