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