aboutsummaryrefslogtreecommitdiff
path: root/spm/cactus
diff options
context:
space:
mode:
Diffstat (limited to 'spm/cactus')
-rw-r--r--spm/cactus/cactus_def.h14
-rw-r--r--spm/cactus/cactus_ffa_tests.c72
-rw-r--r--spm/cactus/cactus_main.c21
-rw-r--r--spm/cactus/cactus_tests.h4
4 files changed, 100 insertions, 11 deletions
diff --git a/spm/cactus/cactus_def.h b/spm/cactus/cactus_def.h
index a0adb234..0d3df2e4 100644
--- a/spm/cactus/cactus_def.h
+++ b/spm/cactus/cactus_def.h
@@ -28,4 +28,18 @@
#define CACTUS_TX_BASE CACTUS_RX_BASE + PAGE_SIZE
#define CACTUS_RX_TX_SIZE PAGE_SIZE * 2
+/*
+ * RX/TX buffer helpers.
+ */
+#define get_sp_rx_start(sp_id) (CACTUS_RX_BASE + ((sp_id - 1) * CACTUS_RX_TX_SIZE))
+#define get_sp_rx_end(sp_id) (CACTUS_RX_BASE + ((sp_id - 1) * CACTUS_RX_TX_SIZE) + PAGE_SIZE)
+#define get_sp_tx_start(sp_id) (CACTUS_TX_BASE + ((sp_id - 1) * CACTUS_RX_TX_SIZE))
+#define get_sp_tx_end(sp_id) (CACTUS_TX_BASE + ((sp_id - 1) * CACTUS_RX_TX_SIZE) + PAGE_SIZE)
+
+/*
+ * UUID of secure partition as defined in the respective manifests.
+ */
+#define PRIMARY_UUID {0xb4b5671e, 0x4a904fe1, 0xb81ffb13, 0xdae1dacb}
+#define SECONDARY_UUID {0xd1582309, 0xf02347b9, 0x827c4464, 0xf5578fc8}
+
#endif /* CACTUS_DEF_H */
diff --git a/spm/cactus/cactus_ffa_tests.c b/spm/cactus/cactus_ffa_tests.c
index 46813bbe..2e6e4460 100644
--- a/spm/cactus/cactus_ffa_tests.c
+++ b/spm/cactus/cactus_ffa_tests.c
@@ -6,6 +6,7 @@
#include <assert.h>
#include <debug.h>
#include <errno.h>
+#include <cactus_def.h>
#include <ffa_helpers.h>
#include <sp_helpers.h>
@@ -13,6 +14,10 @@
#define FFA_MAJOR 1U
#define FFA_MINOR 0U
+static const uint32_t primary_uuid[4] = PRIMARY_UUID;
+static const uint32_t secondary_uuid[4] = SECONDARY_UUID;
+static const uint32_t null_uuid[4] = {0};
+
struct feature_test {
const char *test_name;
unsigned int feature;
@@ -73,7 +78,71 @@ static void ffa_features_test(void)
announce_test_section_end(test_features);
}
-void ffa_tests(void)
+static void ffa_partition_info_helper(struct mailbox_buffers *mb, const uint32_t uuid[4],
+ const struct ffa_partition_info *expected,
+ const uint16_t expected_size)
+{
+ smc_ret_values ret = ffa_partition_info_get(uuid);
+ unsigned int i;
+ expect(ret.ret0, FFA_SUCCESS_SMC32);
+
+ struct ffa_partition_info *info = (struct ffa_partition_info *)(mb->recv);
+ for (i = 0U; i < expected_size; i++) {
+ expect(info[i].id, expected[i].id);
+ expect(info[i].exec_context, expected[i].exec_context);
+ expect(info[i].properties, expected[i].properties);
+ }
+
+ ret = ffa_rx_release();
+ expect(ret.ret0, FFA_SUCCESS_SMC32);
+}
+
+static void ffa_partition_info_wrong_test(void)
+{
+ const char *test_wrong_uuid = "Request wrong UUID";
+ uint32_t uuid[4] = {1};
+
+ announce_test_start(test_wrong_uuid);
+
+ smc_ret_values ret = ffa_partition_info_get(uuid);
+ expect(ret.ret0, FFA_ERROR);
+ expect(ret.ret2, FFA_ERROR_INVALID_PARAMETER);
+
+ announce_test_end(test_wrong_uuid);
+}
+
+static void ffa_partition_info_get_test(struct mailbox_buffers *mb)
+{
+ const char *test_partition_info = "FFA Partition info interface";
+ const char *test_primary = "Get primary partition info";
+ const char *test_secondary = "Get secondary partition info";
+ const char *test_all = "Get all partitions info";
+
+ const struct ffa_partition_info expected_info[] = {
+ {.id = SPM_VM_ID_FIRST, .exec_context = 8, .properties = 0}, /* Primary partition info */
+ {.id = 2, .exec_context = 2, .properties = 0} /* Secondary partition info */
+ };
+
+ announce_test_section_start(test_partition_info);
+
+ announce_test_start(test_secondary);
+ ffa_partition_info_helper(mb, secondary_uuid, &expected_info[1], 1);
+ announce_test_end(test_secondary);
+
+ announce_test_start(test_primary);
+ ffa_partition_info_helper(mb, primary_uuid, &expected_info[0], 1);
+ announce_test_end(test_primary);
+
+ announce_test_start(test_all);
+ ffa_partition_info_helper(mb, null_uuid, expected_info, 2);
+ announce_test_end(test_all);
+
+ ffa_partition_info_wrong_test();
+
+ announce_test_section_end(test_partition_info);
+}
+
+void ffa_tests(struct mailbox_buffers *mb)
{
const char *test_ffa = "FFA Interfaces";
const char *test_ffa_version = "FFA Version interface";
@@ -99,6 +168,7 @@ void ffa_tests(void)
announce_test_end(test_ffa_version);
ffa_features_test();
+ ffa_partition_info_get_test(mb);
announce_test_section_end(test_ffa);
}
diff --git a/spm/cactus/cactus_main.c b/spm/cactus/cactus_main.c
index 49764ecc..31906d59 100644
--- a/spm/cactus/cactus_main.c
+++ b/spm/cactus/cactus_main.c
@@ -102,12 +102,12 @@ static void cactus_print_memory_layout(unsigned int vm_id)
(void *)CACTUS_BSS_START, (void *)CACTUS_BSS_END);
NOTICE(" RX : %p - %p\n",
- (void *)(CACTUS_RX_BASE + ((vm_id - 1) * CACTUS_RX_TX_SIZE)),
- (void *)(CACTUS_TX_BASE + ((vm_id - 1) * CACTUS_RX_TX_SIZE)));
+ (void *)get_sp_rx_start(vm_id),
+ (void *)get_sp_rx_end(vm_id));
NOTICE(" TX : %p - %p\n",
- (void *)(CACTUS_TX_BASE + ((vm_id - 1) * CACTUS_RX_TX_SIZE)),
- (void *)(CACTUS_RX_BASE + (vm_id * CACTUS_RX_TX_SIZE)));
+ (void *)get_sp_tx_start(vm_id),
+ (void *)get_sp_tx_end(vm_id));
}
static void cactus_plat_configure_mmu(unsigned int vm_id)
@@ -129,13 +129,13 @@ static void cactus_plat_configure_mmu(unsigned int vm_id)
CACTUS_BSS_END - CACTUS_BSS_START,
MT_RW_DATA);
- mmap_add_region((CACTUS_RX_BASE + ((vm_id - 1) * CACTUS_RX_TX_SIZE)),
- (CACTUS_RX_BASE + ((vm_id - 1) * CACTUS_RX_TX_SIZE)),
+ mmap_add_region(get_sp_rx_start(vm_id),
+ get_sp_rx_start(vm_id),
(CACTUS_RX_TX_SIZE / 2),
MT_RO_DATA);
- mmap_add_region((CACTUS_TX_BASE + ((vm_id - 1) * CACTUS_RX_TX_SIZE)),
- (CACTUS_TX_BASE + ((vm_id - 1) * CACTUS_RX_TX_SIZE)),
+ mmap_add_region(get_sp_tx_start(vm_id),
+ get_sp_tx_start(vm_id),
(CACTUS_RX_TX_SIZE / 2),
MT_RW_DATA);
@@ -147,6 +147,7 @@ void __dead2 cactus_main(void)
{
assert(IS_IN_EL1() != 0);
+ struct mailbox_buffers mb;
/* Clear BSS */
memset((void *)CACTUS_BSS_START,
0, CACTUS_BSS_END - CACTUS_BSS_START);
@@ -159,6 +160,8 @@ void __dead2 cactus_main(void)
}
ffa_vm_id_t ffa_id = ffa_id_ret.ret2 & 0xffff;
+ mb.send = (void *) get_sp_tx_start(ffa_id);
+ mb.recv = (void *) get_sp_rx_start(ffa_id);
/* Configure and enable Stage-1 MMU, enable D-Cache */
cactus_plat_configure_mmu(ffa_id);
@@ -190,7 +193,7 @@ void __dead2 cactus_main(void)
cactus_print_memory_layout(ffa_id);
/* Invoking Tests */
- ffa_tests();
+ ffa_tests(&mb);
/* End up to message loop */
message_loop(ffa_id);
diff --git a/spm/cactus/cactus_tests.h b/spm/cactus/cactus_tests.h
index 23586f51..2e13a6f9 100644
--- a/spm/cactus/cactus_tests.h
+++ b/spm/cactus/cactus_tests.h
@@ -7,6 +7,8 @@
#ifndef CACTUS_TESTS_H
#define CACTUS_TESTS_H
+#include <ffa_helpers.h>
+
/*
* Test functions
*/
@@ -14,7 +16,7 @@
/*
* Test to FFA interfaces.
*/
-void ffa_tests(void);
+void ffa_tests(struct mailbox_buffers *mb);
/*
* Test other things like the version number returned by SPM.