1 /*
2  * Copyright 2023 The Hafnium Authors.
3  *
4  * Use of this source code is governed by a BSD-style
5  * license that can be found in the LICENSE file or at
6  * https://opensource.org/licenses/BSD-3-Clause.
7  */
8 
9 #include "hf/dlog.h"
10 #include "hf/ffa.h"
11 
12 #include "vmapi/hf/call.h"
13 
14 #include "partition_services.h"
15 #include "test/hftest.h"
16 #include "test/vmapi/ffa.h"
17 
18 /**
19  * Communicates with partition via direct messaging to validate functioning of
20  * direct request/response interfaces.
21  */
TEST(ffa_msg_send_direct_req,succeeds_nwd_to_sp_echo)22 TEST(ffa_msg_send_direct_req, succeeds_nwd_to_sp_echo)
23 {
24 	const uint32_t msg[] = {0x22223333, 0x44445555, 0x66667777, 0x88889999};
25 	const ffa_id_t receiver_id = SP_ID(1);
26 	struct ffa_value res;
27 	ffa_id_t own_id = hf_vm_get_id();
28 
29 	res = sp_echo_cmd_send(own_id, receiver_id, msg[0], msg[1], msg[2],
30 			       msg[3]);
31 
32 	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
33 
34 	EXPECT_EQ(res.arg4, msg[0]);
35 	EXPECT_EQ(res.arg5, msg[1]);
36 	EXPECT_EQ(res.arg6, msg[2]);
37 	EXPECT_EQ(res.arg7, msg[3]);
38 }
39 
40 /**
41  * Validate SP to SP direct messaging is functioning as expected.
42  */
TEST(ffa_msg_send_direct_req,succeeds_sp_to_sp_echo)43 TEST(ffa_msg_send_direct_req, succeeds_sp_to_sp_echo)
44 {
45 	const uint32_t msg[] = {0x22223333, 0x44445555, 0x66667777, 0x88889999};
46 	const ffa_id_t receiver_id = SP_ID(1);
47 	struct ffa_value res;
48 	ffa_id_t own_id = hf_vm_get_id();
49 
50 	res = sp_req_echo_cmd_send(own_id, receiver_id, msg[0], msg[1], msg[2],
51 				   msg[3]);
52 
53 	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
54 	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
55 }
56 
57 /**
58  * Test that if a direct message request is sent to an SP that is already
59  * waiting for a direct message response an DENIED error code is returned.
60  */
TEST(ffa_msg_send_direct_req,fails_direct_req_to_waiting_sp)61 TEST(ffa_msg_send_direct_req, fails_direct_req_to_waiting_sp)
62 {
63 	const ffa_id_t receiver_id = SP_ID(1);
64 	struct ffa_value res;
65 	ffa_id_t own_id = hf_vm_get_id();
66 
67 	res = sp_req_echo_denied_cmd_send(own_id, receiver_id);
68 
69 	EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
70 	EXPECT_EQ(sp_resp(res), SP_SUCCESS);
71 }
72