tidy(ci): organize ffa_secure_partitions test
Made some changes to help with code organization, and promote reuse
as much as possible:
- Split "partition_control.c" into smaller scoped files, per
functionality of test.
- Created "services" folder and moved secure service into it.
Change-Id: I82e3d91ac3a7f68462f7f2c9778834e1a19c1bf1
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/prebuilts b/prebuilts
index 9b5438c..4d08763 160000
--- a/prebuilts
+++ b/prebuilts
@@ -1 +1 @@
-Subproject commit 9b5438cd86a95de67461db9f53d6d1506dcfb0a7
+Subproject commit 4d0876375104e71b97da85567509875aba095a6a
diff --git a/test/vmapi/ffa_secure_partitions/BUILD.gn b/test/vmapi/ffa_secure_partitions/BUILD.gn
index aa609ef..e040c17 100644
--- a/test/vmapi/ffa_secure_partitions/BUILD.gn
+++ b/test/vmapi/ffa_secure_partitions/BUILD.gn
@@ -7,26 +7,15 @@
import("//build/image/image.gni")
import("//test/hftest/args.gni")
-config("config") {
- include_dirs = [ "inc" ]
-}
-
-source_set("partition_services") {
- testonly = true
- public_configs = [ ":config" ]
-
- sources = [
- "partition_services.c",
- ]
-}
-
# VM that will control execution of tests in a VM-to-SP set-up
vm_kernel("vm_primary") {
testonly = true
- public_configs = [ ":config" ]
+ public_configs = [ "services:config" ]
sources = [
- "partition_control.c",
+ "dir_msg.c",
+ "notifications.c",
+ "setup_and_discovery.c",
]
deps = [
@@ -39,14 +28,12 @@
# former SP
vm_kernel("secure_partitions_services") {
testonly = true
- public_configs = [ ":config" ]
-
- sources = [
- "secure_partition_services.c",
- ]
+ public_configs = [ "services:config" ]
deps = [
- ":partition_services",
+ "services:message_loop",
+ "services:notifications",
+ "services:partition_services",
"//test/hftest:hftest_secure_service",
]
}
diff --git a/test/vmapi/ffa_secure_partitions/dir_msg.c b/test/vmapi/ffa_secure_partitions/dir_msg.c
new file mode 100644
index 0000000..2934f48
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/dir_msg.c
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "hf/dlog.h"
+#include "hf/ffa.h"
+
+#include "vmapi/hf/call.h"
+
+#include "partition_services.h"
+#include "test/hftest.h"
+#include "test/vmapi/ffa.h"
+
+/**
+ * Communicates with partition via direct messaging to validate functioning of
+ * direct request/response interfaces.
+ */
+TEST(ffa_msg_send_direct_req, succeeds_nwd_to_sp_echo)
+{
+ const uint32_t msg[] = {0x22223333, 0x44445555, 0x66667777, 0x88889999};
+ const ffa_vm_id_t receiver_id = HF_OTHER_WORLD_ID + 1;
+ struct ffa_value res;
+ ffa_vm_id_t own_id = hf_vm_get_id();
+
+ res = sp_echo_cmd_send(own_id, receiver_id, msg[0], msg[1], msg[2],
+ msg[3]);
+
+ EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
+
+ EXPECT_EQ(res.arg4, msg[0]);
+ EXPECT_EQ(res.arg5, msg[1]);
+ EXPECT_EQ(res.arg6, msg[2]);
+ EXPECT_EQ(res.arg7, msg[3]);
+}
diff --git a/test/vmapi/ffa_secure_partitions/notifications.c b/test/vmapi/ffa_secure_partitions/notifications.c
new file mode 100644
index 0000000..c36fe88
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/notifications.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "hf/dlog.h"
+#include "hf/ffa.h"
+
+#include "vmapi/hf/call.h"
+
+#include "partition_services.h"
+#include "test/hftest.h"
+#include "test/vmapi/ffa.h"
+
+/**
+ * Test to validate notifications signaling from an SP to a VM.
+ */
+TEST(ffa_notifications, signaling_from_sp_to_vm)
+{
+ struct ffa_value res;
+ ffa_vm_id_t own_id = hf_vm_get_id();
+ const ffa_vm_id_t notification_sender = HF_OTHER_WORLD_ID + 1;
+ const ffa_notifications_bitmap_t bitmap = FFA_NOTIFICATION_MASK(20);
+
+ /* Arbitrarily bind notification 20 */
+ res = ffa_notification_bind(notification_sender, own_id, 0, bitmap);
+ EXPECT_EQ(res.func, FFA_SUCCESS_32);
+
+ /* Requesting sender to set notification. */
+ res = sp_notif_set_cmd_send(own_id, notification_sender, own_id,
+ FFA_NOTIFICATIONS_FLAG_DELAY_SRI, bitmap);
+
+ EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
+ EXPECT_EQ(sp_resp(res), SP_SUCCESS);
+
+ /* Retrieve FF-A endpoints with pending notifications. */
+ res = ffa_notification_info_get();
+ EXPECT_EQ(res.func, FFA_SUCCESS_64);
+
+ /* Retrieving pending notification */
+ res = ffa_notification_get(own_id, 0, FFA_NOTIFICATION_FLAG_BITMAP_SP);
+ EXPECT_EQ(res.func, FFA_SUCCESS_32);
+
+ EXPECT_EQ(ffa_notification_get_from_sp(res), bitmap);
+ EXPECT_EQ(res.arg4, 0);
+ EXPECT_EQ(res.arg5, 0);
+ EXPECT_EQ(res.arg6, 0);
+ EXPECT_EQ(res.arg7, 0);
+
+ res = ffa_notification_unbind(notification_sender, own_id, bitmap);
+ EXPECT_EQ(res.func, FFA_SUCCESS_32);
+}
+
+/**
+ * Validate notifications signaling from VM to an SP.
+ */
+TEST(ffa_notifications, signaling_from_vm_to_sp)
+{
+ struct ffa_value res;
+ ffa_vm_id_t own_id = hf_vm_get_id();
+ const ffa_vm_id_t notification_receiver = HF_OTHER_WORLD_ID + 1;
+ const ffa_notifications_bitmap_t bitmap = FFA_NOTIFICATION_MASK(35);
+
+ /* Request receiver to bind notifications. */
+ res = sp_notif_bind_cmd_send(own_id, notification_receiver, own_id, 0,
+ bitmap);
+ EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
+ EXPECT_EQ(sp_resp(res), SP_SUCCESS);
+
+ res = ffa_notification_set(own_id, notification_receiver,
+ FFA_NOTIFICATIONS_FLAG_DELAY_SRI, bitmap);
+ EXPECT_EQ(res.func, FFA_SUCCESS_32);
+
+ res = ffa_notification_info_get();
+ EXPECT_EQ(res.func, FFA_SUCCESS_64);
+
+ /* Request to get notifications pending */
+ res = sp_notif_get_cmd_send(own_id, notification_receiver, 0,
+ FFA_NOTIFICATION_FLAG_BITMAP_VM);
+
+ EXPECT_EQ(sp_resp(res), SP_SUCCESS);
+ EXPECT_EQ(sp_notif_get_from_sp(res), 0);
+ EXPECT_EQ(sp_notif_get_from_vm(res), bitmap);
+
+ /* Request to unbind notifications */
+ res = sp_notif_unbind_cmd_send(own_id, notification_receiver, own_id,
+ bitmap);
+ EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
+ EXPECT_EQ(sp_resp(res), SP_SUCCESS);
+}
diff --git a/test/vmapi/ffa_secure_partitions/partition_control.c b/test/vmapi/ffa_secure_partitions/partition_control.c
deleted file mode 100644
index 2bf032a..0000000
--- a/test/vmapi/ffa_secure_partitions/partition_control.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright 2021 The Hafnium Authors.
- *
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file or at
- * https://opensource.org/licenses/BSD-3-Clause.
- */
-
-#include "hf/dlog.h"
-#include "hf/ffa.h"
-
-#include "vmapi/hf/call.h"
-
-#include "partition_services.h"
-#include "test/hftest.h"
-#include "test/vmapi/ffa.h"
-
-TEAR_DOWN(ffa)
-{
- EXPECT_FFA_ERROR(ffa_rx_release(), FFA_DENIED);
-}
-
-/**
- * Communicates with partition via direct messaging to validate functioning of
- * direct message interfaces.
- */
-TEST(ffa_msg_send_direct_req, succeeds_nwd_to_sp_echo)
-{
- const uint32_t msg[] = {0x22223333, 0x44445555, 0x66667777, 0x88889999};
- const ffa_vm_id_t receiver_id = HF_OTHER_WORLD_ID + 1;
- struct ffa_value res;
- ffa_vm_id_t own_id = hf_vm_get_id();
-
- res = sp_echo_cmd_send(own_id, receiver_id, msg[0], msg[1], msg[2],
- msg[3]);
-
- EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
-
- EXPECT_EQ(res.arg4, msg[0]);
- EXPECT_EQ(res.arg5, msg[1]);
- EXPECT_EQ(res.arg6, msg[2]);
- EXPECT_EQ(res.arg7, msg[3]);
-}
-
-/**
- * Test to validate notifications signaling from an SP to a VM.
- */
-TEST(ffa_notifications, signaling_from_sp_to_vm)
-{
- struct ffa_value res;
- ffa_vm_id_t own_id = hf_vm_get_id();
- const ffa_vm_id_t notification_sender = HF_OTHER_WORLD_ID + 1;
- const ffa_notifications_bitmap_t bitmap = FFA_NOTIFICATION_MASK(20);
-
- /* Arbitrarily bind notification 20 */
- res = ffa_notification_bind(notification_sender, own_id, 0, bitmap);
- EXPECT_EQ(res.func, FFA_SUCCESS_32);
-
- /* Requesting sender to set notification. */
- res = sp_notif_set_cmd_send(own_id, notification_sender, own_id,
- FFA_NOTIFICATIONS_FLAG_DELAY_SRI, bitmap);
-
- EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
- EXPECT_EQ(sp_resp(res), SP_SUCCESS);
-
- /* Retrieve FF-A endpoints with pending notifications. */
- res = ffa_notification_info_get();
- EXPECT_EQ(res.func, FFA_SUCCESS_64);
-
- /* Retrieving pending notification */
- res = ffa_notification_get(own_id, 0, FFA_NOTIFICATION_FLAG_BITMAP_SP);
- EXPECT_EQ(res.func, FFA_SUCCESS_32);
-
- EXPECT_EQ(ffa_notification_get_from_sp(res), bitmap);
- EXPECT_EQ(res.arg4, 0);
- EXPECT_EQ(res.arg5, 0);
- EXPECT_EQ(res.arg6, 0);
- EXPECT_EQ(res.arg7, 0);
-
- res = ffa_notification_unbind(notification_sender, own_id, bitmap);
- EXPECT_EQ(res.func, FFA_SUCCESS_32);
-}
-
-/**
- * Validate notifications signaling from VM to an SP.
- */
-TEST(ffa_notifications, signaling_from_vm_to_sp)
-{
- struct ffa_value res;
- ffa_vm_id_t own_id = hf_vm_get_id();
- const ffa_vm_id_t notification_receiver = HF_OTHER_WORLD_ID + 1;
- const ffa_notifications_bitmap_t bitmap = FFA_NOTIFICATION_MASK(35);
-
- /* Request receiver to bind notifications. */
- res = sp_notif_bind_cmd_send(own_id, notification_receiver, own_id, 0,
- bitmap);
- EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
- EXPECT_EQ(sp_resp(res), SP_SUCCESS);
-
- res = ffa_notification_set(own_id, notification_receiver,
- FFA_NOTIFICATIONS_FLAG_DELAY_SRI, bitmap);
- EXPECT_EQ(res.func, FFA_SUCCESS_32);
-
- res = ffa_notification_info_get();
- EXPECT_EQ(res.func, FFA_SUCCESS_64);
-
- /* Request to get notifications pending */
- res = sp_notif_get_cmd_send(own_id, notification_receiver, 0,
- FFA_NOTIFICATION_FLAG_BITMAP_VM);
-
- EXPECT_EQ(sp_resp(res), SP_SUCCESS);
- EXPECT_EQ(sp_notif_get_from_sp(res), 0);
- EXPECT_EQ(sp_notif_get_from_vm(res), bitmap);
-
- /* Request to unbind notifications */
- res = sp_notif_unbind_cmd_send(own_id, notification_receiver, own_id,
- bitmap);
- EXPECT_EQ(res.func, FFA_MSG_SEND_DIRECT_RESP_32);
- EXPECT_EQ(sp_resp(res), SP_SUCCESS);
-}
-
-TEST(ffa, ffa_partition_info_get_uuid_null)
-{
- struct mailbox_buffers mb;
- struct ffa_value ret;
- const struct ffa_partition_info *partitions;
- struct ffa_uuid uuid;
-
- /* Setup the mailbox (which holds the RX buffer). */
- mb = set_up_mailbox();
- partitions = mb.recv;
-
- /*
- * A Null UUID requests information for all partitions
- * including VMs and SPs.
- */
- ffa_uuid_init(0, 0, 0, 0, &uuid);
-
- /* Check that expected partition information is returned. */
- ret = ffa_partition_info_get(&uuid);
- EXPECT_EQ(ret.func, FFA_SUCCESS_32);
-
- /* Expect two partitions. */
- EXPECT_EQ(ret.arg2, 2);
-
- /* Expect the PVM as first partition. */
- EXPECT_EQ(partitions[0].vm_id, hf_vm_get_id());
- EXPECT_EQ(partitions[0].vcpu_count, 8);
-
- /* Expect a SP as second partition. */
- EXPECT_EQ(partitions[1].vm_id, HF_SPMC_VM_ID + 1);
- EXPECT_EQ(partitions[1].vcpu_count, 8);
-
- EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
-}
-
-TEST(ffa, ffa_partition_info_get_uuid_fixed)
-{
- struct mailbox_buffers mb;
- struct ffa_value ret;
- const struct ffa_partition_info *partitions;
- struct ffa_uuid uuid;
-
- /* Setup the mailbox (which holds the RX buffer). */
- mb = set_up_mailbox();
- partitions = mb.recv;
-
- /* Search for a known secure partition UUID. */
- ffa_uuid_init(0xa609f132, 0x6b4f, 0x4c14, 0x9489, &uuid);
-
- /* Check that the expected partition information is returned. */
- ret = ffa_partition_info_get(&uuid);
- EXPECT_EQ(ret.func, FFA_SUCCESS_32);
-
- /* Expect one partition. */
- EXPECT_EQ(ret.arg2, 1);
-
- /* Expect a secure partition. */
- EXPECT_EQ(partitions[0].vm_id, HF_SPMC_VM_ID + 1);
- EXPECT_EQ(partitions[0].vcpu_count, 8);
-
- EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
-}
-
-TEST(ffa, ffa_partition_info_get_uuid_unknown)
-{
- struct ffa_value ret;
- struct ffa_uuid uuid;
-
- /* Search for a unknown partition UUID. */
- ffa_uuid_init(1, 1, 1, 1, &uuid);
-
- /* Expect no partition is found with such UUID. */
- ret = ffa_partition_info_get(&uuid);
- EXPECT_EQ(ret.func, FFA_ERROR_32);
-}
-
-/*
- * Check FFA_SPM_ID_GET response.
- * DEN0077A FF-A v1.1 Beta0 section 13.9 FFA_SPM_ID_GET.
- */
-TEST(ffa, ffa_spm_id_get)
-{
- struct ffa_value ret = ffa_spm_id_get();
-
- EXPECT_EQ(ret.func, FFA_SUCCESS_32);
-
- /* Expect the SPMC FF-A ID at NS virtual FF-A instance. */
- EXPECT_EQ(ret.arg2, HF_SPMC_VM_ID);
-}
diff --git a/test/vmapi/ffa_secure_partitions/services/BUILD.gn b/test/vmapi/ffa_secure_partitions/services/BUILD.gn
new file mode 100644
index 0000000..182bf4c
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/services/BUILD.gn
@@ -0,0 +1,52 @@
+# Copyright 2021 The Hafnium Authors.
+#
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file or at
+# https://opensource.org/licenses/BSD-3-Clause.
+
+config("config") {
+ include_dirs = [ "inc" ]
+}
+
+source_set("common") {
+ testonly = true
+ public_configs = [ ":config" ]
+ sources = [
+ "common.c",
+ ]
+}
+
+source_set("partition_services") {
+ testonly = true
+ public_configs = [ ":config" ]
+ sources = [
+ "partition_services.c",
+ ]
+
+ deps = [
+ ":common",
+ ]
+}
+
+source_set("notifications") {
+ testonly = true
+ public_configs = [ ":config" ]
+ sources = [
+ "notifications.c",
+ ]
+
+ deps = [
+ ":common",
+ ]
+}
+
+source_set("message_loop") {
+ testonly = true
+ public_configs = [
+ ":config",
+ "//test/hftest:hftest_config",
+ ]
+ sources = [
+ "message_loop.c",
+ ]
+}
diff --git a/test/vmapi/ffa_secure_partitions/services/common.c b/test/vmapi/ffa_secure_partitions/services/common.c
new file mode 100644
index 0000000..bf47a9a
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/services/common.c
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "hf/dlog.h"
+
+#include "vmapi/hf/call.h"
+
+#include "partition_services.h"
+
+struct ffa_value sp_check_ffa_return_resp(ffa_vm_id_t test_source,
+ ffa_vm_id_t own_id,
+ struct ffa_value res)
+{
+ if (res.func == FFA_ERROR_32) {
+ dlog_error("FF-A error returned %x\n", ffa_error_code(res));
+ return sp_error(own_id, test_source, ffa_error_code(res));
+ }
+
+ return sp_success(own_id, test_source);
+}
diff --git a/test/vmapi/ffa_secure_partitions/inc/partition_services.h b/test/vmapi/ffa_secure_partitions/services/inc/partition_services.h
similarity index 97%
rename from test/vmapi/ffa_secure_partitions/inc/partition_services.h
rename to test/vmapi/ffa_secure_partitions/services/inc/partition_services.h
index 65ce81b..b89af84 100644
--- a/test/vmapi/ffa_secure_partitions/inc/partition_services.h
+++ b/test/vmapi/ffa_secure_partitions/services/inc/partition_services.h
@@ -168,3 +168,7 @@
struct ffa_value sp_notif_unbind_cmd(ffa_vm_id_t test_source,
ffa_vm_id_t notif_sender,
ffa_notifications_bitmap_t bitmap);
+
+struct ffa_value sp_check_ffa_return_resp(ffa_vm_id_t test_source,
+ ffa_vm_id_t own_id,
+ struct ffa_value res);
diff --git a/test/vmapi/ffa_secure_partitions/secure_partition_services.c b/test/vmapi/ffa_secure_partitions/services/message_loop.c
similarity index 100%
rename from test/vmapi/ffa_secure_partitions/secure_partition_services.c
rename to test/vmapi/ffa_secure_partitions/services/message_loop.c
diff --git a/test/vmapi/ffa_secure_partitions/partition_services.c b/test/vmapi/ffa_secure_partitions/services/notifications.c
similarity index 75%
rename from test/vmapi/ffa_secure_partitions/partition_services.c
rename to test/vmapi/ffa_secure_partitions/services/notifications.c
index 2f7fd21..5ceb252 100644
--- a/test/vmapi/ffa_secure_partitions/partition_services.c
+++ b/test/vmapi/ffa_secure_partitions/services/notifications.c
@@ -6,31 +6,11 @@
* https://opensource.org/licenses/BSD-3-Clause.
*/
-#include "partition_services.h"
-
#include "hf/dlog.h"
#include "vmapi/hf/call.h"
-static struct ffa_value sp_check_ffa_return_resp(ffa_vm_id_t test_source,
- ffa_vm_id_t own_id,
- struct ffa_value res)
-{
- if (res.func == FFA_ERROR_32) {
- dlog_error("FF-A error returned %x", ffa_error_code(res));
- return sp_error(own_id, test_source, ffa_error_code(res));
- }
-
- return sp_success(own_id, test_source);
-}
-
-struct ffa_value sp_echo_cmd(ffa_vm_id_t receiver, uint32_t val1, uint32_t val2,
- uint32_t val3, uint32_t val4, uint32_t val5)
-{
- ffa_vm_id_t own_id = hf_vm_get_id();
- return ffa_msg_send_direct_resp(own_id, receiver, val1, val2, val3,
- val4, val5);
-}
+#include "partition_services.h"
struct ffa_value sp_notif_set_cmd(ffa_vm_id_t test_source,
ffa_vm_id_t notif_receiver, uint32_t flags,
diff --git a/test/vmapi/ffa_secure_partitions/services/partition_services.c b/test/vmapi/ffa_secure_partitions/services/partition_services.c
new file mode 100644
index 0000000..6f40fbb
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/services/partition_services.c
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "partition_services.h"
+
+#include "hf/dlog.h"
+
+#include "vmapi/hf/call.h"
+
+struct ffa_value sp_echo_cmd(ffa_vm_id_t receiver, uint32_t val1, uint32_t val2,
+ uint32_t val3, uint32_t val4, uint32_t val5)
+{
+ ffa_vm_id_t own_id = hf_vm_get_id();
+ return ffa_msg_send_direct_resp(own_id, receiver, val1, val2, val3,
+ val4, val5);
+}
diff --git a/test/vmapi/ffa_secure_partitions/setup_and_discovery.c b/test/vmapi/ffa_secure_partitions/setup_and_discovery.c
new file mode 100644
index 0000000..6617865
--- /dev/null
+++ b/test/vmapi/ffa_secure_partitions/setup_and_discovery.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2021 The Hafnium Authors.
+ *
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/BSD-3-Clause.
+ */
+
+#include "hf/dlog.h"
+#include "hf/ffa.h"
+
+#include "vmapi/hf/call.h"
+
+#include "partition_services.h"
+#include "test/hftest.h"
+#include "test/vmapi/ffa.h"
+
+TEAR_DOWN(ffa)
+{
+ EXPECT_FFA_ERROR(ffa_rx_release(), FFA_DENIED);
+}
+
+TEST(ffa, ffa_partition_info_get_uuid_null)
+{
+ struct mailbox_buffers mb;
+ struct ffa_value ret;
+ const struct ffa_partition_info *partitions;
+ struct ffa_uuid uuid;
+
+ /* Setup the mailbox (which holds the RX buffer). */
+ mb = set_up_mailbox();
+ partitions = mb.recv;
+
+ /*
+ * A Null UUID requests information for all partitions
+ * including VMs and SPs.
+ */
+ ffa_uuid_init(0, 0, 0, 0, &uuid);
+
+ /* Check that expected partition information is returned. */
+ ret = ffa_partition_info_get(&uuid);
+ EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+ /* Expect two partitions. */
+ EXPECT_EQ(ret.arg2, 2);
+
+ /* Expect the PVM as first partition. */
+ EXPECT_EQ(partitions[0].vm_id, hf_vm_get_id());
+ EXPECT_EQ(partitions[0].vcpu_count, 8);
+
+ /* Expect a SP as second partition. */
+ EXPECT_EQ(partitions[1].vm_id, HF_SPMC_VM_ID + 1);
+ EXPECT_EQ(partitions[1].vcpu_count, 8);
+
+ EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
+}
+
+TEST(ffa, ffa_partition_info_get_uuid_fixed)
+{
+ struct mailbox_buffers mb;
+ struct ffa_value ret;
+ const struct ffa_partition_info *partitions;
+ struct ffa_uuid uuid;
+
+ /* Setup the mailbox (which holds the RX buffer). */
+ mb = set_up_mailbox();
+ partitions = mb.recv;
+
+ /* Search for a known secure partition UUID. */
+ ffa_uuid_init(0xa609f132, 0x6b4f, 0x4c14, 0x9489, &uuid);
+
+ /* Check that the expected partition information is returned. */
+ ret = ffa_partition_info_get(&uuid);
+ EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+ /* Expect one partition. */
+ EXPECT_EQ(ret.arg2, 1);
+
+ /* Expect a secure partition. */
+ EXPECT_EQ(partitions[0].vm_id, HF_SPMC_VM_ID + 1);
+ EXPECT_EQ(partitions[0].vcpu_count, 8);
+
+ EXPECT_EQ(ffa_rx_release().func, FFA_SUCCESS_32);
+}
+
+TEST(ffa, ffa_partition_info_get_uuid_unknown)
+{
+ struct ffa_value ret;
+ struct ffa_uuid uuid;
+
+ /* Search for a unknown partition UUID. */
+ ffa_uuid_init(1, 1, 1, 1, &uuid);
+
+ /* Expect no partition is found with such UUID. */
+ ret = ffa_partition_info_get(&uuid);
+ EXPECT_EQ(ret.func, FFA_ERROR_32);
+}
+
+/*
+ * Check FFA_SPM_ID_GET response.
+ * DEN0077A FF-A v1.1 Beta0 section 13.9 FFA_SPM_ID_GET.
+ */
+TEST(ffa, ffa_spm_id_get)
+{
+ struct ffa_value ret = ffa_spm_id_get();
+
+ EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+ /* Expect the SPMC FF-A ID at NS virtual FF-A instance. */
+ EXPECT_EQ(ret.arg2, HF_SPMC_VM_ID);
+}