Merge "Add test for Errata management firmware interface."
diff --git a/Makefile b/Makefile
index 4896ba9..54293b5 100644
--- a/Makefile
+++ b/Makefile
@@ -192,6 +192,7 @@
$(eval $(call add_define,TFTF_DEFINES,NEW_TEST_SESSION))
$(eval $(call add_define,TFTF_DEFINES,PLAT_${PLAT}))
$(eval $(call add_define,TFTF_DEFINES,USE_NVM))
+$(eval $(call add_define,TFTF_DEFINES,ENABLE_REALM_PAYLOAD_TESTS))
################################################################################
@@ -606,7 +607,7 @@
tftf: realm
@echo " PACK REALM PAYLOAD"
$(shell dd if=$(BUILD_PLAT)/realm.bin of=$(BUILD_PLAT)/tftf.bin obs=1 \
- seek=$(TFTF_MAX_IMAGE_SIZE))
+ oflag=append conv=notrunc)
endif
ifeq (${ARCH}-${PLAT},aarch64-fvp)
@@ -615,7 +616,7 @@
pack_realm: realm tftf
@echo " PACK REALM PAYLOAD"
$(shell dd if=$(BUILD_PLAT)/realm.bin of=$(BUILD_PLAT)/tftf.bin obs=1 \
- seek=$(TFTF_MAX_IMAGE_SIZE))
+ oflag=append conv=notrunc)
endif
ifeq (${ARCH}-${PLAT},aarch64-tc)
diff --git a/docs/getting_started/build-options.rst b/docs/getting_started/build-options.rst
index 8e62380..699b79d 100644
--- a/docs/getting_started/build-options.rst
+++ b/docs/getting_started/build-options.rst
@@ -152,10 +152,8 @@
Realm payload specific Build Options
------------------------------------
-- ``TFTF_MAX_IMAGE_SIZE``: The option needs to be either set by the user or
- by the platform makefile to specify the maximum size of TFTF binary. This
- is needed so that the Realm payload binary can be appended to TFTF binary
- via ``make ENABLE_REALM_PAYLOAD_TESTS=1 tftf`` build command.
+- ``ENABLE_REALM_PAYLOAD_TESTS=1`` This option builds and packs Realm payload tests
+ realm.bin to tftf.bin.
FWU-specific Build Options
--------------------------
diff --git a/include/runtime_services/host_realm_managment/host_realm_mem_layout.h b/include/runtime_services/host_realm_managment/host_realm_mem_layout.h
index 6e94b30..c895c71 100644
--- a/include/runtime_services/host_realm_managment/host_realm_mem_layout.h
+++ b/include/runtime_services/host_realm_managment/host_realm_mem_layout.h
@@ -10,17 +10,19 @@
#include <realm_def.h>
-#include <platform_def.h>
-
/*
- * Realm payload Memory Usage Layout
+ * Realm payload Memory Usage Layout in TFTF.bin.
+ * The realm.bin is appended to tftf.bin to create a unified
+ * tftf.bin.
+ * +---------------------------+
+ * | TFTF.bin |
+ * | |
+ * +---------------------------+
+ * | Realm Image |
+ * | (REALM_MAX_LOAD_IMG_SIZE |
+ * +---------------------------+
*
- * +--------------------------+ +---------------------------+
- * | | | Host Image |
- * | TFTF | | (TFTF_MAX_IMAGE_SIZE) |
- * | Normal World | ==> +---------------------------+
- * | Image | | Realm Image |
- * | (MAX_NS_IMAGE_SIZE) | | (REALM_MAX_LOAD_IMG_SIZE |
+ * The realm memory pool is a combination of PAGE_POOL and NS_SHARED_MEM
* +--------------------------+ +---------------------------+
* | Memory Pool | | Heap Memory |
* | (NS_REALM_SHARED_MEM_SIZE| | (PAGE_POOL_MAX_SIZE) |
@@ -31,30 +33,24 @@
* | | | (NS_REALM_SHARED_MEM_SIZE)|
* +--------------------------+ +---------------------------+
*
+ * Refer to tftf.lds for the layout.
*/
-/*
- * Default values defined in platform.mk, and can be provided as build arguments
- * TFTF_MAX_IMAGE_SIZE: 1MB
- */
-
-#ifdef TFTF_MAX_IMAGE_SIZE
-/* 1MB for shared buffer between Realm and Host */
- #define NS_REALM_SHARED_MEM_SIZE U(0x100000)
-/* 3MB of memory used as a pool for realm's objects creation */
- #define PAGE_POOL_MAX_SIZE U(0x300000)
-/* Base address of each section */
- #define REALM_IMAGE_BASE (TFTF_BASE + TFTF_MAX_IMAGE_SIZE)
- #define PAGE_POOL_BASE (REALM_IMAGE_BASE + REALM_MAX_LOAD_IMG_SIZE)
+#if !(defined(__LINKER__) || defined(__ASSEMBLY__))
+ /* Base address of each section */
+ IMPORT_SYM(uintptr_t, __REALM_PAYLOAD_START__, REALM_IMAGE_BASE);
+ IMPORT_SYM(uintptr_t, __REALM_POOL_START__, PAGE_POOL_BASE);
#define NS_REALM_SHARED_MEM_BASE (PAGE_POOL_BASE + PAGE_POOL_MAX_SIZE)
+#endif
+
+#ifdef ENABLE_REALM_PAYLOAD_TESTS
+ /* 1MB for shared buffer between Realm and Host */
+ #define NS_REALM_SHARED_MEM_SIZE U(0x100000)
+ /* 3MB of memory used as a pool for realm's objects creation */
+ #define PAGE_POOL_MAX_SIZE U(0x300000)
#else
- #define NS_REALM_SHARED_MEM_SIZE 0U
- #define PAGE_POOL_MAX_SIZE 0U
- #define TFTF_MAX_IMAGE_SIZE DRAM_SIZE
-/* Base address of each section */
- #define REALM_IMAGE_BASE 0U
- #define PAGE_POOL_BASE 0U
- #define NS_REALM_SHARED_MEM_BASE 0U
+ #define NS_REALM_SHARED_MEM_SIZE U(0x0)
+ #define PAGE_POOL_MAX_SIZE U(0x0)
#endif
#endif /* HOST_REALM_MEM_LAYOUT_H */
diff --git a/plat/arm/fvp/platform.mk b/plat/arm/fvp/platform.mk
index cb1a37b..99183ec 100644
--- a/plat/arm/fvp/platform.mk
+++ b/plat/arm/fvp/platform.mk
@@ -4,9 +4,6 @@
# SPDX-License-Identifier: BSD-3-Clause
#
-# If not specified as build arguments, set default to 10 MB
-TFTF_MAX_IMAGE_SIZE:=10485760
-
# Default number of threads per CPU on FVP
FVP_MAX_PE_PER_CPU := 1
@@ -82,7 +79,6 @@
$(eval $(call add_define,TFTF_DEFINES,FVP_CLUSTER_COUNT))
$(eval $(call add_define,TFTF_DEFINES,FVP_MAX_CPUS_PER_CLUSTER))
$(eval $(call add_define,TFTF_DEFINES,FVP_MAX_PE_PER_CPU))
-$(eval $(call add_define,TFTF_DEFINES,TFTF_MAX_IMAGE_SIZE))
# Default PA size for FVP platform
PA_SIZE := 34
diff --git a/tftf/framework/tftf.ld.S b/tftf/framework/tftf.ld.S
index e403af0..4559b03 100644
--- a/tftf/framework/tftf.ld.S
+++ b/tftf/framework/tftf.ld.S
@@ -6,17 +6,15 @@
#include <platform_def.h>
#include <xlat_tables_defs.h>
+#include <host_realm_mem_layout.h>
+
OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
ENTRY(tftf_entrypoint)
-#ifndef TFTF_MAX_IMAGE_SIZE
-#define TFTF_MAX_IMAGE_SIZE DRAM_SIZE
-#endif
-
MEMORY {
- RAM (rwx): ORIGIN = TFTF_BASE, LENGTH = TFTF_MAX_IMAGE_SIZE
+ RAM (rwx): ORIGIN = TFTF_BASE, LENGTH = DRAM_SIZE
}
@@ -49,10 +47,29 @@
.data : {
__DATA_START__ = .;
*(.data*)
+ . = NEXT(PAGE_SIZE); /* This ensures tftf.bin is aligned to page size. */
__DATA_END__ = .;
} >RAM
- stacks (NOLOAD) : {
+ /* End of LOAD Sections. NOLOAD sections begin here. */
+ /*
+ * Memory for Realm Image has to follow next as it will appended to end
+ * of tftf.bin.
+ */
+ realm_payload (NOLOAD) : {
+ __REALM_PAYLOAD_START__ = .;
+ . = __REALM_PAYLOAD_START__ + REALM_MAX_LOAD_IMG_SIZE;
+ __REALM_PAYLOAD_END__ = .;
+ } >RAM
+
+ /* Memory pool for Realm payload tests. */
+ realm_pool (NOLOAD) : ALIGN(PAGE_SIZE) {
+ __REALM_POOL_START__ = .;
+ . = __REALM_POOL_START__ + NS_REALM_SHARED_MEM_SIZE + PAGE_POOL_MAX_SIZE;
+ __REALM_POOL_END__ = .;
+ } >RAM
+
+ stacks (NOLOAD) : ALIGN(16) {
__STACKS_START__ = .;
*(tftf_normal_stacks)
__STACKS_END__ = .;
@@ -60,9 +77,9 @@
/*
* The .bss section gets initialised to 0 at runtime.
- * Its base address must be 16-byte aligned.
+ * Its base address is always PAGE_SIZE aligned.
*/
- .bss : ALIGN(16) {
+ .bss : {
__BSS_START__ = .;
*(SORT_BY_ALIGNMENT(.bss*))
*(COMMON)
@@ -71,10 +88,9 @@
/*
* The xlat_table section is for full, aligned page tables (4K).
- * Removing them from .bss avoids forcing 4K alignment on
- * the .bss section and eliminates the unecessary zero init
+ * Removing them from .bss eliminates the unecessary zero init
*/
- xlat_table (NOLOAD) : {
+ xlat_table (NOLOAD) : ALIGN(PAGE_SIZE) {
*(xlat_table)
} >RAM
@@ -109,7 +125,6 @@
__COHERENT_RAM_UNALIGNED_SIZE__ =
__COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
-
__TFTF_END__ = .;
__BSS_SIZE__ = SIZEOF(.bss);
diff --git a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
index fc18a75..09ac9a0 100644
--- a/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
+++ b/tftf/tests/runtime_services/host_realm_managment/host_realm_helper.c
@@ -24,17 +24,8 @@
static struct realm realm;
static bool realm_payload_created;
static bool shared_mem_created;
-static bool realm_payload_mmaped;
static volatile bool timer_enabled;
-/* From the TFTF_BASE offset, memory used by TFTF + Shared + Realm + POOL should
- * not exceed DRAM_END offset
- * NS_REALM_SHARED_MEM_BASE + NS_REALM_SHARED_MEM_SIZE is considered last offset
- */
-CASSERT((((uint64_t)NS_REALM_SHARED_MEM_BASE + (uint64_t)NS_REALM_SHARED_MEM_SIZE)\
- < ((uint64_t)DRAM_BASE + (uint64_t)DRAM_SIZE)),\
- error_ns_memory_and_realm_payload_exceed_DRAM_SIZE);
-
#define RMI_EXIT(id) \
[RMI_EXIT_##id] = #id
@@ -114,41 +105,6 @@
timer_enabled = true;
}
-/**
- * @brief - Add regions assigned to Host into its translation table data
- * structure.
- **/
-static test_result_t host_mmap_realm_payload(u_register_t realm_payload_adr,
- u_register_t plat_mem_pool_adr,
- u_register_t plat_mem_pool_size)
-{
- if (realm_payload_mmaped) {
- return REALM_SUCCESS;
- }
-
- /* Memory Pool region */
- int rc = mmap_add_dynamic_region(plat_mem_pool_adr,
- plat_mem_pool_adr,
- plat_mem_pool_size,
- MT_RW_DATA | MT_NS);
- if (rc != 0) {
- ERROR("%u: mmap_add_dynamic_region() %d\n", __LINE__, rc);
- return TEST_RESULT_FAIL;
- }
-
- /* Realm Image region */
- rc = mmap_add_dynamic_region(realm_payload_adr,
- realm_payload_adr,
- REALM_MAX_LOAD_IMG_SIZE,
- MT_RW_DATA | MT_NS);
- if (rc != 0) {
- ERROR("%u: mmap_add_dynamic_region() %d\n", __LINE__, rc);
- return TEST_RESULT_FAIL;
- }
- realm_payload_mmaped = true;
- return REALM_SUCCESS;
-}
-
static bool host_enter_realm(u_register_t *exit_reason,
unsigned int *host_call_result)
{
@@ -199,6 +155,8 @@
"plat_mem_pool_size or realm_pages_size is NULL\n");
return false;
}
+
+ INFO("Realm base adr=0x%lx\n", realm_payload_adr);
/* Initialize Host NS heap memory to be used in Realm creation*/
if (page_pool_init(plat_mem_pool_adr, realm_pages_size)
!= HEAP_INIT_SUCCESS) {
@@ -206,14 +164,6 @@
return false;
}
- /* Mmap Realm payload region */
- if (host_mmap_realm_payload(realm_payload_adr,
- plat_mem_pool_adr,
- plat_mem_pool_size) != REALM_SUCCESS) {
- ERROR("%s() failed\n", "host_mmap_realm_payload");
- return false;
- }
-
/* Read Realm Feature Reg 0 */
if (host_rmi_features(0UL, &realm.rmm_feat_reg0) != REALM_SUCCESS) {
ERROR("%s() failed\n", "host_rmi_features");
diff --git a/tftf/tests/xlat_lib_v2/xlat_lib_v2_tests.c b/tftf/tests/xlat_lib_v2/xlat_lib_v2_tests.c
index 519ff16..c4ffbf9 100644
--- a/tftf/tests/xlat_lib_v2/xlat_lib_v2_tests.c
+++ b/tftf/tests/xlat_lib_v2/xlat_lib_v2_tests.c
@@ -163,6 +163,9 @@
{
int ret;
+ if (size == 0U) {
+ return -EPERM;
+ }
VERBOSE("mmap_add_dynamic_region(0x%llx, 0x%lx, 0x%zx, 0x%x)\n",
base_pa, base_va, size, attr);