17 #define INVALID_NS_CLIENT_ID 0x49abcdef
18 #define INVERT_BUFFER_SIZE (16*4)
24 static int32_t caller_client_id_zi;
31 static int32_t* invalid_addresses [] = {(int32_t*)0x0, (int32_t*)0xFFF12000};
65 for (i = 0; i <
sizeof(invalid_addresses)/
sizeof(invalid_addresses[0]); ++i)
102 if (in_size/2 > *out_size) {
105 for (j = 1; j < in_size; j += 2) {
106 outbuf[j/2] = inbuf[j];
108 *out_size = in_size/2;
120 if (in_len != out_len) {
123 for (i = 0; i < in_len; ++i) {
125 in_vec[i].base, out_vec[i].base,
126 in_vec[i].len, &out_vec[i].len);
135 #define SFN_INVERT_MAX_LEN 128
136 static psa_status_t spm_core_test_2_sfn_invert_internal(uint32_t *in_ptr,
150 for (i = 0; i < len; i++) {
151 invert_buffer[i] = in_ptr[i];
153 for (i = 0; i < len; i++) {
154 invert_buffer[i] = ~invert_buffer[i];
156 for (i = 0; i < len; i++) {
157 out_ptr[i] = invert_buffer[i];
173 if ((in_len != 1) || (out_len != 2)) {
177 if ((out_vec[0].len < in_vec[0].len) || (in_vec[0].len%4 != 0) ||
178 (out_vec[1].len <
sizeof(int32_t))) {
182 len = in_vec[0].
len / 4;
184 in_ptr = (uint32_t *)in_vec[0].base;
185 out_ptr = (uint32_t *)out_vec[0].base;
186 res_ptr = (int32_t *)out_vec[1].base;
188 return spm_core_test_2_sfn_invert_internal(in_ptr, out_ptr, res_ptr, len);
191 static psa_status_t spm_core_test_2_prepare_test_scenario_internal(
195 current_execution_data = execution_data;
197 switch (irq_test_scenario) {
219 (in_vec[0].len !=
sizeof(uint32_t)) ||
230 return spm_core_test_2_prepare_test_scenario_internal(irq_test_scenario,
234 static psa_status_t spm_core_test_2_execute_test_scenario_internal(
237 switch (irq_test_scenario) {
277 return spm_core_test_2_execute_test_scenario_internal(irq_test_scenario);
285 static void core_test_2_signal_handle(
psa_signal_t signal,
286 core_test_2_func_t pfn)
291 status =
psa_get(signal, &msg);
349 (uint8_t *)outbuf, msg->
in_size[i], &out_len);
370 (msg->
out_size[1] <
sizeof(int32_t))) {
379 ret = spm_core_test_2_sfn_invert_internal(inbuf, outbuf,
380 &res_ptr, msg->
in_size[0] / 4);
393 uint32_t irq_test_scenario;
397 if ((msg->
in_size[0] !=
sizeof(uint32_t)) ||
402 num =
psa_read(msg->
handle, 0, &irq_test_scenario,
sizeof(irq_test_scenario));
420 uint32_t irq_test_scenario;
423 if (msg->
in_size[0] !=
sizeof(uint32_t)) {
427 num =
psa_read(msg->
handle, 0, &irq_test_scenario,
sizeof(irq_test_scenario));
450 core_test_2_signal_handle(SPM_CORE_TEST_2_SLAVE_SERVICE_SIGNAL,
451 spm_core_test_2_wrap_slave_service);
453 core_test_2_signal_handle(
454 SPM_CORE_TEST_2_CHECK_CALLER_CLIENT_ID_SIGNAL,
455 spm_core_test_2_wrap_check_caller_client_id);
457 core_test_2_signal_handle(
458 SPM_CORE_TEST_2_GET_EVERY_SECOND_BYTE_SIGNAL,
459 spm_core_test_2_wrap_get_every_second_byte);
461 core_test_2_signal_handle(SPM_CORE_TEST_2_INVERT_SIGNAL,
462 spm_core_test_2_wrap_sfn_invert);
464 core_test_2_signal_handle(
465 SPM_CORE_TEST_2_PREPARE_TEST_SCENARIO_SIGNAL,
466 spm_core_test_2_wrap_prepare_test_scenario);
468 core_test_2_signal_handle(
469 SPM_CORE_TEST_2_EXECUTE_TEST_SCENARIO_SIGNAL,
470 spm_core_test_2_wrap_execute_test_scenario);
#define INVALID_NS_CLIENT_ID
psa_status_t spm_core_test_2_execute_test_scenario(struct psa_invec *in_vec, size_t in_len, struct psa_outvec *out_vec, size_t out_size)
psa_status_t spm_core_test_2_prepare_test_scenario(struct psa_invec *in_vec, size_t in_len, struct psa_outvec *out_vec, size_t out_size)
#define SPM_CORE_TEST_2_GET_EVERY_SECOND_BYTE_SIGNAL
volatile int32_t timer1_triggered
#define INVERT_BUFFER_SIZE
#define SPM_CORE_TEST_2_CHECK_CALLER_CLIENT_ID_SIGNAL
psa_status_t spm_core_test_2_get_every_second_byte(struct psa_invec *in_vec, size_t in_len, struct psa_outvec *out_vec, size_t out_len)
#define SPM_CORE_TEST_2_INVERT_SIGNAL
psa_status_t spm_core_test_2_sfn_invert(struct psa_invec *in_vec, size_t in_len, struct psa_outvec *out_vec, size_t out_len)
Bitwise inverts the buffer received as input.
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 SFN_INVERT_MAX_LEN
#define PSA_IPC_DISCONNECT
psa_status_t spm_core_test_2_get_every_second_byte_internal(const uint8_t *inbuf, uint8_t *outbuf, size_t in_size, size_t *out_size)
psa_status_t spm_core_test_2_check_caller_client_id(struct psa_invec *in_vec, size_t in_len, struct psa_outvec *out_vec, size_t out_len)
A minimal test secure function to be called from another partition.
size_t in_size[PSA_MAX_IOVEC]
int32_t tfm_core_get_caller_client_id(int32_t *caller_client_id)
void psa_write(psa_handle_t msg_handle, uint32_t outvec_idx, const void *buffer, size_t num_bytes)
Write a message response to a client output vector.
#define SPM_CORE_TEST_2_EXECUTE_TEST_SCENARIO_SIGNAL
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...
#define SPM_CORE_TEST_2_PREPARE_TEST_SCENARIO_SIGNAL
size_t out_size[PSA_MAX_IOVEC]
psa_status_t spm_core_test_2_slave_service(struct psa_invec *in_vec, size_t in_len, struct psa_outvec *out_vec, size_t out_len)
A minimal test service to be called from another service.
psa_status_t core_test_2_init(void)
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
#define SPM_CORE_TEST_2_SLAVE_SERVICE_SIGNAL