1*54fd6939SJiyong Park/* 2*54fd6939SJiyong Park * Copyright (c) 2016-2021, 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(elf32-littlearm) 11*54fd6939SJiyong ParkOUTPUT_ARCH(arm) 12*54fd6939SJiyong ParkENTRY(sp_min_vector_table) 13*54fd6939SJiyong Park 14*54fd6939SJiyong ParkMEMORY { 15*54fd6939SJiyong Park RAM (rwx): ORIGIN = BL32_BASE, LENGTH = BL32_LIMIT - BL32_BASE 16*54fd6939SJiyong Park} 17*54fd6939SJiyong Park 18*54fd6939SJiyong Park#ifdef PLAT_SP_MIN_EXTRA_LD_SCRIPT 19*54fd6939SJiyong Park#include <plat_sp_min.ld.S> 20*54fd6939SJiyong Park#endif 21*54fd6939SJiyong Park 22*54fd6939SJiyong ParkSECTIONS 23*54fd6939SJiyong Park{ 24*54fd6939SJiyong Park . = BL32_BASE; 25*54fd6939SJiyong Park ASSERT(. == ALIGN(PAGE_SIZE), 26*54fd6939SJiyong Park "BL32_BASE address is not aligned on a page boundary.") 27*54fd6939SJiyong Park 28*54fd6939SJiyong Park#if SEPARATE_CODE_AND_RODATA 29*54fd6939SJiyong Park .text . : { 30*54fd6939SJiyong Park __TEXT_START__ = .; 31*54fd6939SJiyong Park *entrypoint.o(.text*) 32*54fd6939SJiyong Park *(SORT_BY_ALIGNMENT(.text*)) 33*54fd6939SJiyong Park *(.vectors) 34*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 35*54fd6939SJiyong Park __TEXT_END__ = .; 36*54fd6939SJiyong Park } >RAM 37*54fd6939SJiyong Park 38*54fd6939SJiyong Park /* .ARM.extab and .ARM.exidx are only added because Clang need them */ 39*54fd6939SJiyong Park .ARM.extab . : { 40*54fd6939SJiyong Park *(.ARM.extab* .gnu.linkonce.armextab.*) 41*54fd6939SJiyong Park } >RAM 42*54fd6939SJiyong Park 43*54fd6939SJiyong Park .ARM.exidx . : { 44*54fd6939SJiyong Park *(.ARM.exidx* .gnu.linkonce.armexidx.*) 45*54fd6939SJiyong Park } >RAM 46*54fd6939SJiyong Park 47*54fd6939SJiyong Park .rodata . : { 48*54fd6939SJiyong Park __RODATA_START__ = .; 49*54fd6939SJiyong Park *(SORT_BY_ALIGNMENT(.rodata*)) 50*54fd6939SJiyong Park 51*54fd6939SJiyong Park RODATA_COMMON 52*54fd6939SJiyong Park 53*54fd6939SJiyong Park /* Place pubsub sections for events */ 54*54fd6939SJiyong Park . = ALIGN(8); 55*54fd6939SJiyong Park#include <lib/el3_runtime/pubsub_events.h> 56*54fd6939SJiyong Park 57*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 58*54fd6939SJiyong Park __RODATA_END__ = .; 59*54fd6939SJiyong Park } >RAM 60*54fd6939SJiyong Park#else 61*54fd6939SJiyong Park ro . : { 62*54fd6939SJiyong Park __RO_START__ = .; 63*54fd6939SJiyong Park *entrypoint.o(.text*) 64*54fd6939SJiyong Park *(SORT_BY_ALIGNMENT(.text*)) 65*54fd6939SJiyong Park *(SORT_BY_ALIGNMENT(.rodata*)) 66*54fd6939SJiyong Park 67*54fd6939SJiyong Park RODATA_COMMON 68*54fd6939SJiyong Park 69*54fd6939SJiyong Park /* Place pubsub sections for events */ 70*54fd6939SJiyong Park . = ALIGN(8); 71*54fd6939SJiyong Park#include <lib/el3_runtime/pubsub_events.h> 72*54fd6939SJiyong Park 73*54fd6939SJiyong Park *(.vectors) 74*54fd6939SJiyong Park __RO_END_UNALIGNED__ = .; 75*54fd6939SJiyong Park 76*54fd6939SJiyong Park /* 77*54fd6939SJiyong Park * Memory page(s) mapped to this section will be marked as 78*54fd6939SJiyong Park * read-only, executable. No RW data from the next section must 79*54fd6939SJiyong Park * creep in. Ensure the rest of the current memory page is unused. 80*54fd6939SJiyong Park */ 81*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 82*54fd6939SJiyong Park __RO_END__ = .; 83*54fd6939SJiyong Park } >RAM 84*54fd6939SJiyong Park#endif 85*54fd6939SJiyong Park 86*54fd6939SJiyong Park ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__, 87*54fd6939SJiyong Park "cpu_ops not defined for this platform.") 88*54fd6939SJiyong Park /* 89*54fd6939SJiyong Park * Define a linker symbol to mark start of the RW memory area for this 90*54fd6939SJiyong Park * image. 91*54fd6939SJiyong Park */ 92*54fd6939SJiyong Park __RW_START__ = . ; 93*54fd6939SJiyong Park 94*54fd6939SJiyong Park DATA_SECTION >RAM 95*54fd6939SJiyong Park RELA_SECTION >RAM 96*54fd6939SJiyong Park 97*54fd6939SJiyong Park#ifdef BL32_PROGBITS_LIMIT 98*54fd6939SJiyong Park ASSERT(. <= BL32_PROGBITS_LIMIT, "BL32 progbits has exceeded its limit.") 99*54fd6939SJiyong Park#endif 100*54fd6939SJiyong Park 101*54fd6939SJiyong Park STACK_SECTION >RAM 102*54fd6939SJiyong Park BSS_SECTION >RAM 103*54fd6939SJiyong Park XLAT_TABLE_SECTION >RAM 104*54fd6939SJiyong Park 105*54fd6939SJiyong Park __BSS_SIZE__ = SIZEOF(.bss); 106*54fd6939SJiyong Park 107*54fd6939SJiyong Park#if USE_COHERENT_MEM 108*54fd6939SJiyong Park /* 109*54fd6939SJiyong Park * The base address of the coherent memory section must be page-aligned (4K) 110*54fd6939SJiyong Park * to guarantee that the coherent data are stored on their own pages and 111*54fd6939SJiyong Park * are not mixed with normal data. This is required to set up the correct 112*54fd6939SJiyong Park * memory attributes for the coherent data page tables. 113*54fd6939SJiyong Park */ 114*54fd6939SJiyong Park coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) { 115*54fd6939SJiyong Park __COHERENT_RAM_START__ = .; 116*54fd6939SJiyong Park /* 117*54fd6939SJiyong Park * Bakery locks are stored in coherent memory 118*54fd6939SJiyong Park * 119*54fd6939SJiyong Park * Each lock's data is contiguous and fully allocated by the compiler 120*54fd6939SJiyong Park */ 121*54fd6939SJiyong Park *(bakery_lock) 122*54fd6939SJiyong Park *(tzfw_coherent_mem) 123*54fd6939SJiyong Park __COHERENT_RAM_END_UNALIGNED__ = .; 124*54fd6939SJiyong Park /* 125*54fd6939SJiyong Park * Memory page(s) mapped to this section will be marked 126*54fd6939SJiyong Park * as device memory. No other unexpected data must creep in. 127*54fd6939SJiyong Park * Ensure the rest of the current memory page is unused. 128*54fd6939SJiyong Park */ 129*54fd6939SJiyong Park . = ALIGN(PAGE_SIZE); 130*54fd6939SJiyong Park __COHERENT_RAM_END__ = .; 131*54fd6939SJiyong Park } >RAM 132*54fd6939SJiyong Park 133*54fd6939SJiyong Park __COHERENT_RAM_UNALIGNED_SIZE__ = 134*54fd6939SJiyong Park __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__; 135*54fd6939SJiyong Park#endif 136*54fd6939SJiyong Park 137*54fd6939SJiyong Park /* 138*54fd6939SJiyong Park * Define a linker symbol to mark the end of the RW memory area for this 139*54fd6939SJiyong Park * image. 140*54fd6939SJiyong Park */ 141*54fd6939SJiyong Park __RW_END__ = .; 142*54fd6939SJiyong Park 143*54fd6939SJiyong Park __BL32_END__ = .; 144*54fd6939SJiyong Park 145*54fd6939SJiyong Park /DISCARD/ : { 146*54fd6939SJiyong Park *(.dynsym .dynstr .hash .gnu.hash) 147*54fd6939SJiyong Park } 148*54fd6939SJiyong Park 149*54fd6939SJiyong Park ASSERT(. <= BL32_LIMIT, "BL32 image has exceeded its limit.") 150*54fd6939SJiyong Park} 151