1*54fd6939SJiyong Park/* 2*54fd6939SJiyong Park * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park#include <common/bl_common.ld.h> 8*54fd6939SJiyong Park#include <lib/xlat_tables/xlat_tables_defs.h> 9*54fd6939SJiyong Park 10*54fd6939SJiyong ParkOUTPUT_FORMAT(PLATFORM_LINKER_FORMAT) 11*54fd6939SJiyong ParkOUTPUT_ARCH(PLATFORM_LINKER_ARCH) 12*54fd6939SJiyong ParkENTRY(bl31_entrypoint) 13*54fd6939SJiyong Park 14*54fd6939SJiyong Park 15*54fd6939SJiyong ParkMEMORY { 16*54fd6939SJiyong Park RAM (rwx): ORIGIN = BL31_BASE, LENGTH = BL31_LIMIT - BL31_BASE 17*54fd6939SJiyong Park#if SEPARATE_NOBITS_REGION 18*54fd6939SJiyong Park NOBITS (rw!a): ORIGIN = BL31_NOBITS_BASE, LENGTH = BL31_NOBITS_LIMIT - BL31_NOBITS_BASE 19*54fd6939SJiyong Park#else 20*54fd6939SJiyong Park#define NOBITS RAM 21*54fd6939SJiyong Park#endif 22*54fd6939SJiyong Park} 23*54fd6939SJiyong Park 24*54fd6939SJiyong Park#ifdef PLAT_EXTRA_LD_SCRIPT 25*54fd6939SJiyong Park#include <plat.ld.S> 26*54fd6939SJiyong Park#endif 27*54fd6939SJiyong Park 28*54fd6939SJiyong ParkSECTIONS 29*54fd6939SJiyong Park{ 30*54fd6939SJiyong Park . = BL31_BASE; 31*54fd6939SJiyong Park ASSERT(. == ALIGN(PAGE_SIZE), 32*54fd6939SJiyong Park "BL31_BASE address is not aligned on a page boundary.") 33*54fd6939SJiyong Park 34*54fd6939SJiyong Park __BL31_START__ = .; 35*54fd6939SJiyong Park 36*54fd6939SJiyong Park#if SEPARATE_CODE_AND_RODATA 37*54fd6939SJiyong Park .text . : { 38*54fd6939SJiyong Park __TEXT_START__ = .; 39*54fd6939SJiyong Park *bl31_entrypoint.o(.text*) 40*54fd6939SJiyong Park *(SORT_BY_ALIGNMENT(SORT(.text*))) 41*54fd6939SJiyong Park *(.vectors) 42*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 43*54fd6939SJiyong Park __TEXT_END__ = .; 44*54fd6939SJiyong Park } >RAM 45*54fd6939SJiyong Park 46*54fd6939SJiyong Park .rodata . : { 47*54fd6939SJiyong Park __RODATA_START__ = .; 48*54fd6939SJiyong Park *(SORT_BY_ALIGNMENT(.rodata*)) 49*54fd6939SJiyong Park 50*54fd6939SJiyong Park RODATA_COMMON 51*54fd6939SJiyong Park 52*54fd6939SJiyong Park /* Place pubsub sections for events */ 53*54fd6939SJiyong Park . = ALIGN(8); 54*54fd6939SJiyong Park#include <lib/el3_runtime/pubsub_events.h> 55*54fd6939SJiyong Park 56*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 57*54fd6939SJiyong Park __RODATA_END__ = .; 58*54fd6939SJiyong Park } >RAM 59*54fd6939SJiyong Park#else 60*54fd6939SJiyong Park ro . : { 61*54fd6939SJiyong Park __RO_START__ = .; 62*54fd6939SJiyong Park *bl31_entrypoint.o(.text*) 63*54fd6939SJiyong Park *(SORT_BY_ALIGNMENT(.text*)) 64*54fd6939SJiyong Park *(SORT_BY_ALIGNMENT(.rodata*)) 65*54fd6939SJiyong Park 66*54fd6939SJiyong Park RODATA_COMMON 67*54fd6939SJiyong Park 68*54fd6939SJiyong Park /* Place pubsub sections for events */ 69*54fd6939SJiyong Park . = ALIGN(8); 70*54fd6939SJiyong Park#include <lib/el3_runtime/pubsub_events.h> 71*54fd6939SJiyong Park 72*54fd6939SJiyong Park *(.vectors) 73*54fd6939SJiyong Park __RO_END_UNALIGNED__ = .; 74*54fd6939SJiyong Park /* 75*54fd6939SJiyong Park * Memory page(s) mapped to this section will be marked as read-only, 76*54fd6939SJiyong Park * executable. No RW data from the next section must creep in. 77*54fd6939SJiyong Park * Ensure the rest of the current memory page is unused. 78*54fd6939SJiyong Park */ 79*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 80*54fd6939SJiyong Park __RO_END__ = .; 81*54fd6939SJiyong Park } >RAM 82*54fd6939SJiyong Park#endif 83*54fd6939SJiyong Park 84*54fd6939SJiyong Park ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__, 85*54fd6939SJiyong Park "cpu_ops not defined for this platform.") 86*54fd6939SJiyong Park 87*54fd6939SJiyong Park#if SPM_MM 88*54fd6939SJiyong Park#ifndef SPM_SHIM_EXCEPTIONS_VMA 89*54fd6939SJiyong Park#define SPM_SHIM_EXCEPTIONS_VMA RAM 90*54fd6939SJiyong Park#endif 91*54fd6939SJiyong Park 92*54fd6939SJiyong Park /* 93*54fd6939SJiyong Park * Exception vectors of the SPM shim layer. They must be aligned to a 2K 94*54fd6939SJiyong Park * address, but we need to place them in a separate page so that we can set 95*54fd6939SJiyong Park * individual permissions to them, so the actual alignment needed is 4K. 96*54fd6939SJiyong Park * 97*54fd6939SJiyong Park * There's no need to include this into the RO section of BL31 because it 98*54fd6939SJiyong Park * doesn't need to be accessed by BL31. 99*54fd6939SJiyong Park */ 100*54fd6939SJiyong Park spm_shim_exceptions : ALIGN(PAGE_SIZE) { 101*54fd6939SJiyong Park __SPM_SHIM_EXCEPTIONS_START__ = .; 102*54fd6939SJiyong Park *(.spm_shim_exceptions) 103*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 104*54fd6939SJiyong Park __SPM_SHIM_EXCEPTIONS_END__ = .; 105*54fd6939SJiyong Park } >SPM_SHIM_EXCEPTIONS_VMA AT>RAM 106*54fd6939SJiyong Park 107*54fd6939SJiyong Park PROVIDE(__SPM_SHIM_EXCEPTIONS_LMA__ = LOADADDR(spm_shim_exceptions)); 108*54fd6939SJiyong Park . = LOADADDR(spm_shim_exceptions) + SIZEOF(spm_shim_exceptions); 109*54fd6939SJiyong Park#endif 110*54fd6939SJiyong Park 111*54fd6939SJiyong Park /* 112*54fd6939SJiyong Park * Define a linker symbol to mark start of the RW memory area for this 113*54fd6939SJiyong Park * image. 114*54fd6939SJiyong Park */ 115*54fd6939SJiyong Park __RW_START__ = . ; 116*54fd6939SJiyong Park 117*54fd6939SJiyong Park DATA_SECTION >RAM 118*54fd6939SJiyong Park RELA_SECTION >RAM 119*54fd6939SJiyong Park 120*54fd6939SJiyong Park#ifdef BL31_PROGBITS_LIMIT 121*54fd6939SJiyong Park ASSERT(. <= BL31_PROGBITS_LIMIT, "BL31 progbits has exceeded its limit.") 122*54fd6939SJiyong Park#endif 123*54fd6939SJiyong Park 124*54fd6939SJiyong Park#if SEPARATE_NOBITS_REGION 125*54fd6939SJiyong Park /* 126*54fd6939SJiyong Park * Define a linker symbol to mark end of the RW memory area for this 127*54fd6939SJiyong Park * image. 128*54fd6939SJiyong Park */ 129*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 130*54fd6939SJiyong Park __RW_END__ = .; 131*54fd6939SJiyong Park __BL31_END__ = .; 132*54fd6939SJiyong Park 133*54fd6939SJiyong Park ASSERT(. <= BL31_LIMIT, "BL31 image has exceeded its limit.") 134*54fd6939SJiyong Park 135*54fd6939SJiyong Park . = BL31_NOBITS_BASE; 136*54fd6939SJiyong Park ASSERT(. == ALIGN(PAGE_SIZE), 137*54fd6939SJiyong Park "BL31 NOBITS base address is not aligned on a page boundary.") 138*54fd6939SJiyong Park 139*54fd6939SJiyong Park __NOBITS_START__ = .; 140*54fd6939SJiyong Park#endif 141*54fd6939SJiyong Park 142*54fd6939SJiyong Park STACK_SECTION >NOBITS 143*54fd6939SJiyong Park BSS_SECTION >NOBITS 144*54fd6939SJiyong Park XLAT_TABLE_SECTION >NOBITS 145*54fd6939SJiyong Park 146*54fd6939SJiyong Park#if USE_COHERENT_MEM 147*54fd6939SJiyong Park /* 148*54fd6939SJiyong Park * The base address of the coherent memory section must be page-aligned (4K) 149*54fd6939SJiyong Park * to guarantee that the coherent data are stored on their own pages and 150*54fd6939SJiyong Park * are not mixed with normal data. This is required to set up the correct 151*54fd6939SJiyong Park * memory attributes for the coherent data page tables. 152*54fd6939SJiyong Park */ 153*54fd6939SJiyong Park coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) { 154*54fd6939SJiyong Park __COHERENT_RAM_START__ = .; 155*54fd6939SJiyong Park /* 156*54fd6939SJiyong Park * Bakery locks are stored in coherent memory 157*54fd6939SJiyong Park * 158*54fd6939SJiyong Park * Each lock's data is contiguous and fully allocated by the compiler 159*54fd6939SJiyong Park */ 160*54fd6939SJiyong Park *(bakery_lock) 161*54fd6939SJiyong Park *(tzfw_coherent_mem) 162*54fd6939SJiyong Park __COHERENT_RAM_END_UNALIGNED__ = .; 163*54fd6939SJiyong Park /* 164*54fd6939SJiyong Park * Memory page(s) mapped to this section will be marked 165*54fd6939SJiyong Park * as device memory. No other unexpected data must creep in. 166*54fd6939SJiyong Park * Ensure the rest of the current memory page is unused. 167*54fd6939SJiyong Park */ 168*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 169*54fd6939SJiyong Park __COHERENT_RAM_END__ = .; 170*54fd6939SJiyong Park } >NOBITS 171*54fd6939SJiyong Park#endif 172*54fd6939SJiyong Park 173*54fd6939SJiyong Park#if SEPARATE_NOBITS_REGION 174*54fd6939SJiyong Park /* 175*54fd6939SJiyong Park * Define a linker symbol to mark end of the NOBITS memory area for this 176*54fd6939SJiyong Park * image. 177*54fd6939SJiyong Park */ 178*54fd6939SJiyong Park __NOBITS_END__ = .; 179*54fd6939SJiyong Park 180*54fd6939SJiyong Park ASSERT(. <= BL31_NOBITS_LIMIT, "BL31 NOBITS region has exceeded its limit.") 181*54fd6939SJiyong Park#else 182*54fd6939SJiyong Park /* 183*54fd6939SJiyong Park * Define a linker symbol to mark end of the RW memory area for this 184*54fd6939SJiyong Park * image. 185*54fd6939SJiyong Park */ 186*54fd6939SJiyong Park __RW_END__ = .; 187*54fd6939SJiyong Park __BL31_END__ = .; 188*54fd6939SJiyong Park 189*54fd6939SJiyong Park /DISCARD/ : { 190*54fd6939SJiyong Park *(.dynsym .dynstr .hash .gnu.hash) 191*54fd6939SJiyong Park } 192*54fd6939SJiyong Park 193*54fd6939SJiyong Park ASSERT(. <= BL31_LIMIT, "BL31 image has exceeded its limit.") 194*54fd6939SJiyong Park#endif 195*54fd6939SJiyong Park} 196