blob: 6008b7800a82aaea2658c5b6875c14db41436896 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/*
* Copyright (c) 2018-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch_helpers.h>
#include <cactus_def.h>
#include <platform.h>
#include <smccc.h>
#include <ffa_helpers.h>
#include <ffa_svc.h>
#include <test_helpers.h>
#define DIRECT_MSG_TEST_PATTERN1 (0xaaaa0000)
#define DIRECT_MSG_TEST_PATTERN2 (0xbbbb0000)
#define DIRECT_MSG_TEST_PATTERN3 (0xcccc0000)
static test_result_t send_receive_direct_msg(unsigned int sp_id,
unsigned int test_pattern)
{
smc_ret_values ret_values;
/* Send a message to SP through direct messaging */
ret_values = ffa_msg_send_direct_req(HYP_ID, SP_ID(sp_id),
test_pattern);
/*
* Return responses may be FFA_MSG_SEND_DIRECT_RESP or FFA_INTERRUPT,
* but only expect the former. Expect SMC32 convention from SP.
*/
if (ret_values.ret0 != FFA_MSG_SEND_DIRECT_RESP_SMC32) {
tftf_testcase_printf("ffa_msg_send_direct_req returned %lx\n",
(u_register_t)ret_values.ret0);
return TEST_RESULT_FAIL;
}
/*
* Message loop in SP returns initial message with the running VM id
* into the lower 16 bits of initial message.
*/
if (ret_values.ret3 != (test_pattern | sp_id)) {
return TEST_RESULT_FAIL;
}
return TEST_RESULT_SUCCESS;
}
test_result_t test_ffa_direct_messaging(void)
{
test_result_t result;
/**********************************************************************
* Verify that FFA is there and that it has the correct version.
**********************************************************************/
SKIP_TEST_IF_FFA_VERSION_LESS_THAN(1, 0);
/* Check if SPMC is OP-TEE at S-EL1 */
if (check_spmc_execution_level()) {
/* Direct messaging is successfully verified for OP-TEE */
return TEST_RESULT_SUCCESS;
}
/*
* From this point assume SPMC runs at S-EL2 and two Cactus instances
* are loaded at S-EL1.
*
*/
/**********************************************************************
* Send a message to SP1 through direct messaging
**********************************************************************/
result = send_receive_direct_msg(1, DIRECT_MSG_TEST_PATTERN1);
if (result != TEST_RESULT_SUCCESS) {
return result;
}
/**********************************************************************
* Send a message to SP2 through direct messaging
**********************************************************************/
result = send_receive_direct_msg(2, DIRECT_MSG_TEST_PATTERN2);
if (result != TEST_RESULT_SUCCESS) {
return result;
}
/**********************************************************************
* Send a message to SP1 through direct messaging
**********************************************************************/
result = send_receive_direct_msg(1, DIRECT_MSG_TEST_PATTERN3);
if (result != TEST_RESULT_SUCCESS) {
return result;
}
/**********************************************************************
* All tests passed.
**********************************************************************/
return TEST_RESULT_SUCCESS;
}
|