diff options
Diffstat (limited to 'spm/cactus/cactus_main.c')
-rw-r--r-- | spm/cactus/cactus_main.c | 104 |
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 */ } |