aboutsummaryrefslogtreecommitdiff
path: root/spm/cactus/cactus_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'spm/cactus/cactus_main.c')
-rw-r--r--spm/cactus/cactus_main.c104
1 files changed, 55 insertions, 49 deletions
diff --git a/spm/cactus/cactus_main.c b/spm/cactus/cactus_main.c
index be137adcd..d5d923d16 100644
--- a/spm/cactus/cactus_main.c
+++ b/spm/cactus/cactus_main.c
@@ -19,7 +19,7 @@
#include "cactus.h"
#include "cactus_def.h"
-#include "spci_helpers.h"
+#include "ffa_helpers.h"
/* Host machine information injected by the build system in the ELF file. */
extern const char build_message[];
@@ -33,9 +33,9 @@ extern const char version_string[];
* but rather through Hafnium print hypercall.
*
*/
-static void __dead2 message_loop(spci_vm_id_t vm_id)
+static void __dead2 message_loop(ffa_vm_id_t vm_id)
{
- smc_ret_values spci_ret;
+ smc_ret_values ffa_ret;
uint32_t sp_response;
/*
@@ -43,22 +43,22 @@ static void __dead2 message_loop(spci_vm_id_t vm_id)
* SP initialization has completed. It blocks until receiving
* a direct message request.
*/
- spci_ret = spci_msg_wait();
+ ffa_ret = ffa_msg_wait();
for (;;) {
- if (spci_ret.ret0 != SPCI_MSG_SEND_DIRECT_REQ_SMC32) {
- spci_ret = spci_error(-1);
+ if (ffa_ret.ret0 != FFA_MSG_SEND_DIRECT_REQ_SMC32) {
+ ffa_ret = ffa_error(-1);
continue;
}
- if (spci_ret.ret1 != SP_ID(vm_id)) {
- spci_ret = spci_error(-2);
+ if (ffa_ret.ret1 != SP_ID(vm_id)) {
+ ffa_ret = ffa_error(-2);
continue;
}
- if (spci_ret.ret2 != HYP_ID) {
- spci_ret = spci_error(-3);
+ if (ffa_ret.ret2 != HYP_ID) {
+ ffa_ret = ffa_error(-3);
continue;
}
@@ -66,13 +66,13 @@ static void __dead2 message_loop(spci_vm_id_t vm_id)
* For the sake of testing, add the vm id to the
* received message.
*/
- sp_response = spci_ret.ret3 | vm_id;
+ sp_response = ffa_ret.ret3 | vm_id;
/*
* Send a response through direct messaging then block
* until receiving a new message request.
*/
- spci_ret = spci_msg_send_direct_resp(SP_ID(vm_id),
+ ffa_ret = ffa_msg_send_direct_resp(SP_ID(vm_id),
HYP_ID, sp_response);
}
}
@@ -83,36 +83,32 @@ static const mmap_region_t cactus_mmap[] __attribute__((used)) = {
{0}
};
-static void cactus_print_memory_layout(void)
+static void cactus_print_memory_layout(unsigned int vm_id)
{
NOTICE("Secure Partition memory layout:\n");
- NOTICE(" Image regions\n");
- NOTICE(" Text region : %p - %p\n",
+ NOTICE(" Text region : %p - %p\n",
(void *)CACTUS_TEXT_START, (void *)CACTUS_TEXT_END);
- NOTICE(" Read-only data region : %p - %p\n",
+
+ NOTICE(" Read-only data region : %p - %p\n",
(void *)CACTUS_RODATA_START, (void *)CACTUS_RODATA_END);
- NOTICE(" Data region : %p - %p\n",
+
+ NOTICE(" Data region : %p - %p\n",
(void *)CACTUS_DATA_START, (void *)CACTUS_DATA_END);
- NOTICE(" BSS region : %p - %p\n",
+
+ NOTICE(" BSS region : %p - %p\n",
(void *)CACTUS_BSS_START, (void *)CACTUS_BSS_END);
- NOTICE(" Total image memory : %p - %p\n",
- (void *)CACTUS_IMAGE_BASE,
- (void *)(CACTUS_IMAGE_BASE + CACTUS_IMAGE_SIZE));
- NOTICE(" SPM regions\n");
- NOTICE(" SPM <-> SP buffer : %p - %p\n",
- (void *)CACTUS_SPM_BUF_BASE,
- (void *)(CACTUS_SPM_BUF_BASE + CACTUS_SPM_BUF_SIZE));
- NOTICE(" NS <-> SP buffer : %p - %p\n",
- (void *)CACTUS_NS_BUF_BASE,
- (void *)(CACTUS_NS_BUF_BASE + CACTUS_NS_BUF_SIZE));
- NOTICE(" Test regions\n");
- NOTICE(" Test region : %p - %p\n",
- (void *)CACTUS_TEST_MEM_BASE,
- (void *)(CACTUS_TEST_MEM_BASE + CACTUS_TEST_MEM_SIZE));
+
+ 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)));
+
+ 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)));
}
-static void cactus_plat_configure_mmu(void)
+static void cactus_plat_configure_mmu(unsigned int vm_id)
{
mmap_add_region(CACTUS_TEXT_START,
CACTUS_TEXT_START,
@@ -131,6 +127,16 @@ static void cactus_plat_configure_mmu(void)
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)),
+ (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)),
+ (CACTUS_RX_TX_SIZE / 2),
+ MT_RW_DATA);
+
mmap_add(cactus_mmap);
init_xlat_tables();
}
@@ -143,20 +149,20 @@ void __dead2 cactus_main(void)
memset((void *)CACTUS_BSS_START,
0, CACTUS_BSS_END - CACTUS_BSS_START);
- /* Configure and enable Stage-1 MMU, enable D-Cache */
- cactus_plat_configure_mmu();
- enable_mmu_el1(0);
-
- /* Get current SPCI id */
- smc_ret_values spci_id_ret = spci_id_get();
- if (spci_id_ret.ret0 != SPCI_SUCCESS_SMC32) {
- ERROR("SPCI_ID_GET failed.\n");
+ /* Get current FFA id */
+ smc_ret_values ffa_id_ret = ffa_id_get();
+ if (ffa_id_ret.ret0 != FFA_SUCCESS_SMC32) {
+ ERROR("FFA_ID_GET failed.\n");
panic();
}
- spci_vm_id_t spci_id = spci_id_ret.ret2 & 0xffff;
+ ffa_vm_id_t ffa_id = ffa_id_ret.ret2 & 0xffff;
+
+ /* Configure and enable Stage-1 MMU, enable D-Cache */
+ cactus_plat_configure_mmu(ffa_id);
+ enable_mmu_el1(0);
- if (spci_id == SPM_VM_ID_FIRST) {
+ if (ffa_id == SPM_VM_ID_FIRST) {
console_init(PL011_UART2_BASE,
PL011_UART2_CLK_IN_HZ,
PL011_BAUDRATE);
@@ -166,23 +172,23 @@ void __dead2 cactus_main(void)
NOTICE("Booting Primary Cactus Secure Partition\n%s\n%s\n",
build_message, version_string);
- cactus_print_memory_layout();
-
- NOTICE("SPCI id: %u\n", spci_id); /* Expect VM id 1 */
-
/* Get number of VMs */
NOTICE("VM count: %u\n", spm_vm_get_count());
/* Get virtual CPU count for current VM */
- NOTICE("vCPU count: %u\n", spm_vcpu_get_count(spci_id));
+ NOTICE("vCPU count: %u\n", spm_vcpu_get_count(ffa_id));
} else {
set_putc_impl(HVC_CALL_AS_STDOUT);
NOTICE("Booting Secondary Cactus Secure Partition\n%s\n%s\n",
build_message, version_string);
}
+
+ NOTICE("FFA id: %u\n", ffa_id);
+ cactus_print_memory_layout(ffa_id);
+
/* End up to message loop */
- message_loop(spci_id);
+ message_loop(ffa_id);
/* Not reached */
}