aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/arch/arm/kernel/generic_boot.c17
-rw-r--r--core/arch/arm/mm/core_mmu.c2
-rw-r--r--core/arch/arm/plat-vexpress/main.c2
3 files changed, 15 insertions, 6 deletions
diff --git a/core/arch/arm/kernel/generic_boot.c b/core/arch/arm/kernel/generic_boot.c
index 951eb2f1..4c7cc6d4 100644
--- a/core/arch/arm/kernel/generic_boot.c
+++ b/core/arch/arm/kernel/generic_boot.c
@@ -397,13 +397,11 @@ static void init_runtime(unsigned long pageable_part)
tee_pager_init(mm);
/*
- * Claim virtual memory which isn't paged, note that there migth be
- * a gap between tee_mm_vcore.lo and TEE_RAM_START which is also
- * claimed to avoid later allocations to get that memory.
+ * Claim virtual memory which isn't paged.
* Linear memory (flat map core memory) ends there.
*/
- mm = tee_mm_alloc2(&tee_mm_vcore, tee_mm_vcore.lo,
- (vaddr_t)(__pageable_start - tee_mm_vcore.lo));
+ mm = tee_mm_alloc2(&tee_mm_vcore, VCORE_UNPG_RX_PA,
+ (vaddr_t)(__pageable_start - VCORE_UNPG_RX_PA));
assert(mm);
/*
@@ -421,6 +419,15 @@ static void init_runtime(unsigned long pageable_part)
tee_pager_add_pages((vaddr_t)__pageable_start + init_size,
(pageable_size - init_size) / SMALL_PAGE_SIZE, true);
+ /*
+ * There may be physical pages in TZSRAM before the core load address.
+ * These pages can be added to the physical pages pool of the pager.
+ * This setup may happen when a the secure bootloader runs in TZRAM
+ * and its memory can be reused by OP-TEE once boot stages complete.
+ */
+ tee_pager_add_pages(tee_mm_vcore.lo,
+ (VCORE_UNPG_RX_PA - tee_mm_vcore.lo) / SMALL_PAGE_SIZE,
+ true);
}
#else
diff --git a/core/arch/arm/mm/core_mmu.c b/core/arch/arm/mm/core_mmu.c
index 7fa816cb..75b6e99d 100644
--- a/core/arch/arm/mm/core_mmu.c
+++ b/core/arch/arm/mm/core_mmu.c
@@ -90,6 +90,8 @@ register_sdp_mem(CFG_TEE_SDP_MEM_BASE, CFG_TEE_SDP_MEM_SIZE);
#endif
#ifdef CFG_CORE_RWDATA_NOEXEC
+register_phys_mem_ul(MEM_AREA_TEE_RAM_RO, CFG_TEE_RAM_START,
+ VCORE_UNPG_RX_PA - CFG_TEE_RAM_START);
register_phys_mem_ul(MEM_AREA_TEE_RAM_RX, VCORE_UNPG_RX_PA, VCORE_UNPG_RX_SZ);
register_phys_mem_ul(MEM_AREA_TEE_RAM_RO, VCORE_UNPG_RO_PA, VCORE_UNPG_RO_SZ);
register_phys_mem_ul(MEM_AREA_TEE_RAM_RW, VCORE_UNPG_RW_PA, VCORE_UNPG_RW_SZ);
diff --git a/core/arch/arm/plat-vexpress/main.c b/core/arch/arm/plat-vexpress/main.c
index ec952d8b..572e4296 100644
--- a/core/arch/arm/plat-vexpress/main.c
+++ b/core/arch/arm/plat-vexpress/main.c
@@ -217,7 +217,7 @@ int psci_cpu_on(uint32_t core_id, uint32_t entry, uint32_t context_id __unused)
ns_entry_addrs[pos] = entry;
dsb_ishst();
- sec_entry_addrs[pos] = CFG_TEE_RAM_START;
+ sec_entry_addrs[pos] = CFG_TEE_LOAD_ADDR;
dsb_ishst();
sev();