/* * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include #include #include #include #include #include #include "cactus.h" #include "cactus_helpers.h" #include "cactus_tests.h" /* Host machine information injected by the build system in the ELF file. */ extern const char build_message[]; extern const char version_string[]; /* * The ARM Trusted Firmware passes a description of the memory resources * allocated to the secure partition through the x0 register. This maps to * a secure_partition_boot_info_t structure type. * * This functions prints the information stored in this structure. */ static void cactus_print_memory_layout(const secure_partition_boot_info_t *boot_info) { NOTICE("Secure Partition memory layout:\n"); NOTICE(" Secure Partition image : %p - %p\n", (void *) boot_info->sp_image_base, (void *)(boot_info->sp_image_base + boot_info->sp_image_size)); NOTICE(" Text region : %p - %p\n", (void *) CACTUS_TEXT_START, (void *) CACTUS_TEXT_END); NOTICE(" Read-only data region : %p - %p\n", (void *) CACTUS_RODATA_START, (void *) CACTUS_RODATA_END); NOTICE(" Read-write data region : %p - %p\n", (void *) CACTUS_RWDATA_START, (void *) CACTUS_RWDATA_END); NOTICE(" BSS region : %p - %p\n", (void *) CACTUS_BSS_START, (void *) CACTUS_BSS_END); NOTICE(" Unused SP image space : %p - %p\n", (void *) CACTUS_BSS_END, (void *)(boot_info->sp_image_base + boot_info->sp_image_size)); NOTICE(" EL3-EL0 shared buffer : %p - %p\n", (void *) boot_info->sp_shared_buf_base, (void *)(boot_info->sp_shared_buf_base + boot_info->sp_shared_buf_size)); NOTICE(" S-NS shared buffer : %p - %p\n", (void *) boot_info->sp_ns_comm_buf_base, (void *)(boot_info->sp_ns_comm_buf_base + boot_info->sp_ns_comm_buf_size)); assert(boot_info->sp_ns_comm_buf_base == ARM_SECURE_SERVICE_BUFFER_BASE); assert(boot_info->sp_ns_comm_buf_size == ARM_SECURE_SERVICE_BUFFER_SIZE); NOTICE(" Stacks region (%u CPUS) : %p - %p\n", boot_info->num_cpus, (void *) boot_info->sp_stack_base, (void *)(boot_info->sp_stack_base + (boot_info->sp_pcpu_stack_size * boot_info->num_cpus))); NOTICE(" Heap region : %p - %p\n", (void *) boot_info->sp_heap_base, (void *)(boot_info->sp_heap_base + boot_info->sp_heap_size)); NOTICE("Total memory : %p - %p\n", (void *) boot_info->sp_mem_base, (void *) boot_info->sp_mem_limit); } void __dead2 cactus_main(void *el3_el0_buffer, size_t el3_el0_buffer_size) { console_init(PLAT_ARM_UART_BASE, PLAT_ARM_UART_CLK_IN_HZ, PL011_BAUDRATE); NOTICE("Booting test Secure Partition Cactus\n"); NOTICE("%s\n", build_message); NOTICE("%s\n", version_string); NOTICE("Running at S-EL0\n"); const secure_partition_boot_info_t *boot_info = (const secure_partition_boot_info_t *) el3_el0_buffer; if (el3_el0_buffer_size < sizeof(secure_partition_boot_info_t)) { ERROR("The memory buffer shared between EL3/S-EL0 is too small\n"); ERROR("It is %lu bytes, it should be at least %lu bytes\n", el3_el0_buffer_size, sizeof(secure_partition_boot_info_t)); panic(); } if ((CACTUS_TEXT_START != boot_info->sp_image_base) || (CACTUS_RWDATA_END > boot_info->sp_image_base + boot_info->sp_image_size)) { ERROR("Cactus does not fit in the buffer allocated for the secure partition\n"); panic(); } cactus_print_memory_layout(boot_info); /* * Run some initial tests. * * These are executed when the system is still booting, just after SPM * has handed over to Cactus. */ misc_tests(); system_setup_tests(); mem_attr_changes_tests(boot_info); /* * Handle secure service requests. */ secure_services_loop(); }