test(ff-a): check execution state property of partitions
FF-A Version 1.1 adds several additional flags to
the properties field of the partition information
descriptors. Test that execution state flag is set
when FF-A v1.1 is specified and zero when FF-A v1.0
descriptors are being used.
Currently only 64-bit execution state is supported for
FF-A compliant partitions.
Signed-off-by: Kathleen Capella <kathleen.capella@arm.com>
Change-Id: Ice1b9a5a417e89cb26dd642be49348e8bfa282b9
diff --git a/include/runtime_services/ffa_helpers.h b/include/runtime_services/ffa_helpers.h
index 1635bf8..3da5c18 100644
--- a/include/runtime_services/ffa_helpers.h
+++ b/include/runtime_services/ffa_helpers.h
@@ -133,21 +133,21 @@
#define FFA_FEATURE_MEI 0x3U
/** Partition property: partition supports receipt of direct requests. */
-#define FFA_PARTITION_DIRECT_REQ_RECV 0x1
+#define FFA_PARTITION_DIRECT_REQ_RECV (UINT32_C(1) << 0)
/** Partition property: partition can send direct requests. */
-#define FFA_PARTITION_DIRECT_REQ_SEND 0x2
+#define FFA_PARTITION_DIRECT_REQ_SEND (UINT32_C(1) << 1)
/** Partition property: partition can send and receive indirect messages. */
-#define FFA_PARTITION_INDIRECT_MSG 0x4
+#define FFA_PARTITION_INDIRECT_MSG (UINT32_C(1) << 2)
/** Partition property: partition can receive notifications. */
-#define FFA_PARTITION_NOTIFICATION 0x8
+#define FFA_PARTITION_NOTIFICATION (UINT32_C(1) << 3)
-/**
- * Partition info descriptor as defined in Table 13.34 of the v1.1 BETA0
- * FF-A Specification
- */
+/** Partition property: partition runs in the AArch64 execution state. */
+#define FFA_PARTITION_AARCH64_EXEC (UINT32_C(1) << 8)
+
+/** Partition info descriptor as defined in FF-A v1.1 EAC0 Table 13.37 */
struct ffa_partition_info {
/** The ID of the VM the information is about */
ffa_id_t id;
@@ -160,8 +160,15 @@
};
/**
+ * Bits[31:3] of partition properties must be zero for FF-A v1.0.
+ * This corresponds to table 8.25 "Partition information descriptor"
+ * in DEN0077A FF-A 1.0 REL specification.
+ */
+#define FFA_PARTITION_v1_0_RES_MASK (~(UINT32_C(0x7)))
+
+/**
* Partition info descriptor as defined in Table 8.25 of the v1.0
- * FF-A Specification
+ * FF-A Specification (DEN0077A).
*/
struct ffa_partition_info_v1_0 {
/** The ID of the VM the information is about */
diff --git a/spm/common/sp_tests/sp_test_ffa.c b/spm/common/sp_tests/sp_test_ffa.c
index dd98459..80211a8 100644
--- a/spm/common/sp_tests/sp_test_ffa.c
+++ b/spm/common/sp_tests/sp_test_ffa.c
@@ -30,7 +30,8 @@
{
.id = SP_ID(1),
.exec_context = PRIMARY_EXEC_CTX_COUNT,
- .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
+ .properties = (FFA_PARTITION_AARCH64_EXEC |
+ FFA_PARTITION_DIRECT_REQ_RECV |
FFA_PARTITION_DIRECT_REQ_SEND |
FFA_PARTITION_NOTIFICATION),
.uuid = sp_uuids[0]
@@ -39,7 +40,8 @@
{
.id = SP_ID(2),
.exec_context = SECONDARY_EXEC_CTX_COUNT,
- .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
+ .properties = (FFA_PARTITION_AARCH64_EXEC |
+ FFA_PARTITION_DIRECT_REQ_RECV |
FFA_PARTITION_DIRECT_REQ_SEND |
FFA_PARTITION_NOTIFICATION),
.uuid = sp_uuids[1]
@@ -48,7 +50,8 @@
{
.id = SP_ID(3),
.exec_context = TERTIARY_EXEC_CTX_COUNT,
- .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
+ .properties = (FFA_PARTITION_AARCH64_EXEC |
+ FFA_PARTITION_DIRECT_REQ_RECV |
FFA_PARTITION_DIRECT_REQ_SEND |
FFA_PARTITION_NOTIFICATION),
.uuid = sp_uuids[2]
@@ -57,7 +60,8 @@
{
.id = SP_ID(4),
.exec_context = IVY_EXEC_CTX_COUNT,
- .properties = (FFA_PARTITION_DIRECT_REQ_RECV |
+ .properties = (FFA_PARTITION_AARCH64_EXEC |
+ FFA_PARTITION_DIRECT_REQ_RECV |
FFA_PARTITION_DIRECT_REQ_SEND),
.uuid = sp_uuids[3]
}
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
index b80f9c4..1300f70 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
@@ -27,7 +27,8 @@
{
.id = SP_ID(1),
.exec_context = PRIMARY_EXEC_CTX_COUNT,
- .properties = FFA_PARTITION_DIRECT_REQ_RECV |
+ .properties = FFA_PARTITION_AARCH64_EXEC |
+ FFA_PARTITION_DIRECT_REQ_RECV |
FFA_PARTITION_NOTIFICATION,
.uuid = sp_uuids[0]
},
@@ -35,7 +36,8 @@
{
.id = SP_ID(2),
.exec_context = SECONDARY_EXEC_CTX_COUNT,
- .properties = FFA_PARTITION_DIRECT_REQ_RECV |
+ .properties = FFA_PARTITION_AARCH64_EXEC |
+ FFA_PARTITION_DIRECT_REQ_RECV |
FFA_PARTITION_NOTIFICATION,
.uuid = sp_uuids[1]
},
@@ -43,7 +45,8 @@
{
.id = SP_ID(3),
.exec_context = TERTIARY_EXEC_CTX_COUNT,
- .properties = FFA_PARTITION_DIRECT_REQ_RECV |
+ .properties = FFA_PARTITION_AARCH64_EXEC |
+ FFA_PARTITION_DIRECT_REQ_RECV |
FFA_PARTITION_NOTIFICATION,
.uuid = sp_uuids[2]
},
@@ -51,7 +54,8 @@
{
.id = SP_ID(4),
.exec_context = IVY_EXEC_CTX_COUNT,
- .properties = FFA_PARTITION_DIRECT_REQ_RECV,
+ .properties = FFA_PARTITION_AARCH64_EXEC |
+ FFA_PARTITION_DIRECT_REQ_RECV,
.uuid = sp_uuids[3]
}
};
@@ -399,6 +403,10 @@
(const struct ffa_partition_info_v1_0 *)(mb.recv);
for (unsigned int i = 0U; i < expected_size; i++) {
+ uint32_t expected_properties_v1_0 =
+ ffa_expected_partition_info[i].properties &
+ ~FFA_PARTITION_v1_0_RES_MASK;
+
if (info[i].id != ffa_expected_partition_info[i].id) {
ERROR("Wrong ID. Expected %x, got %x\n",
ffa_expected_partition_info[i].id,
@@ -413,9 +421,9 @@
result = TEST_RESULT_FAIL;
}
if (info[i].properties !=
- ffa_expected_partition_info[i].properties) {
+ expected_properties_v1_0) {
ERROR("Wrong properties. Expected %d, got %d\n",
- ffa_expected_partition_info[i].properties,
+ expected_properties_v1_0,
info[i].properties);
result = TEST_RESULT_FAIL;
}