1*c2ad38ceSVarun Wadekar#! armclang -E -x c 2*c2ad38ceSVarun Wadekar 3*c2ad38ceSVarun Wadekar/* 4*c2ad38ceSVarun Wadekar * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved. 5*c2ad38ceSVarun Wadekar * 6*c2ad38ceSVarun Wadekar * SPDX-License-Identifier: BSD-3-Clause 7*c2ad38ceSVarun Wadekar */ 8*c2ad38ceSVarun Wadekar 9*c2ad38ceSVarun Wadekar#include <platform_def.h> 10*c2ad38ceSVarun Wadekar 11*c2ad38ceSVarun Wadekar#define PAGE_SIZE (1024 * 4) 12*c2ad38ceSVarun Wadekar 13*c2ad38ceSVarun WadekarLR_START BL31_BASE 14*c2ad38ceSVarun Wadekar{ 15*c2ad38ceSVarun Wadekar __BL31_START__ +0 FIXED EMPTY 0 16*c2ad38ceSVarun Wadekar { 17*c2ad38ceSVarun Wadekar /* placeholder */ 18*c2ad38ceSVarun Wadekar } 19*c2ad38ceSVarun Wadekar 20*c2ad38ceSVarun Wadekar /* BL31_BASE address must be aligned on a page boundary. */ 21*c2ad38ceSVarun Wadekar ScatterAssert((ImageBase(__BL31_START__) AND 0xFFF) == 0) 22*c2ad38ceSVarun Wadekar} 23*c2ad38ceSVarun Wadekar 24*c2ad38ceSVarun WadekarLR_TEXT BL31_BASE 25*c2ad38ceSVarun Wadekar{ 26*c2ad38ceSVarun Wadekar __TEXT__ +0 FIXED 27*c2ad38ceSVarun Wadekar { 28*c2ad38ceSVarun Wadekar *(:gdef:bl31_entrypoint, +FIRST) 29*c2ad38ceSVarun Wadekar *(.text*) 30*c2ad38ceSVarun Wadekar *(.vectors) 31*c2ad38ceSVarun Wadekar .ANY1(+RO-CODE) 32*c2ad38ceSVarun Wadekar } 33*c2ad38ceSVarun Wadekar 34*c2ad38ceSVarun Wadekar __TEXT_EPILOGUE__ AlignExpr(+0, PAGE_SIZE) FIXED EMPTY 0 35*c2ad38ceSVarun Wadekar { 36*c2ad38ceSVarun Wadekar /* section delimiter */ 37*c2ad38ceSVarun Wadekar } 38*c2ad38ceSVarun Wadekar} 39*c2ad38ceSVarun Wadekar 40*c2ad38ceSVarun WadekarLR_RO_DATA +0 41*c2ad38ceSVarun Wadekar{ 42*c2ad38ceSVarun Wadekar __RODATA__ AlignExpr(ImageLimit(LR_TEXT), 0) FIXED 43*c2ad38ceSVarun Wadekar { 44*c2ad38ceSVarun Wadekar *(.rodata*) 45*c2ad38ceSVarun Wadekar .ANY2(+RO-DATA) 46*c2ad38ceSVarun Wadekar } 47*c2ad38ceSVarun Wadekar 48*c2ad38ceSVarun Wadekar /* Ensure 8-byte alignment for descriptors and ensure inclusion */ 49*c2ad38ceSVarun Wadekar __RT_SVC_DESCS__ AlignExpr(ImageLimit(__RODATA__), 8) FIXED 50*c2ad38ceSVarun Wadekar { 51*c2ad38ceSVarun Wadekar *(rt_svc_descs) 52*c2ad38ceSVarun Wadekar } 53*c2ad38ceSVarun Wadekar 54*c2ad38ceSVarun Wadekar#if ENABLE_PMF 55*c2ad38ceSVarun Wadekar /* Ensure 8-byte alignment for descriptors and ensure inclusion */ 56*c2ad38ceSVarun Wadekar __PMF_SVC_DESCS__ AlignExpr(ImageLimit(__RT_SVC_DESCS__), 8) FIXED 57*c2ad38ceSVarun Wadekar { 58*c2ad38ceSVarun Wadekar *(pmf_svc_descs) 59*c2ad38ceSVarun Wadekar } 60*c2ad38ceSVarun Wadekar#endif /* ENABLE_PMF */ 61*c2ad38ceSVarun Wadekar 62*c2ad38ceSVarun Wadekar /* 63*c2ad38ceSVarun Wadekar * Ensure 8-byte alignment for cpu_ops so that its fields are also 64*c2ad38ceSVarun Wadekar * aligned. 65*c2ad38ceSVarun Wadekar */ 66*c2ad38ceSVarun Wadekar __CPU_OPS__ AlignExpr(+0, 8) FIXED 67*c2ad38ceSVarun Wadekar { 68*c2ad38ceSVarun Wadekar *(cpu_ops) 69*c2ad38ceSVarun Wadekar } 70*c2ad38ceSVarun Wadekar 71*c2ad38ceSVarun Wadekar /* 72*c2ad38ceSVarun Wadekar * Keep the .got section in the RO section as it is patched 73*c2ad38ceSVarun Wadekar * prior to enabling the MMU and having the .got in RO is better for 74*c2ad38ceSVarun Wadekar * security. GOT is a table of addresses so ensure 8-byte alignment. 75*c2ad38ceSVarun Wadekar */ 76*c2ad38ceSVarun Wadekar __GOT__ AlignExpr(ImageLimit(__CPU_OPS__), 8) FIXED 77*c2ad38ceSVarun Wadekar { 78*c2ad38ceSVarun Wadekar *(.got) 79*c2ad38ceSVarun Wadekar } 80*c2ad38ceSVarun Wadekar 81*c2ad38ceSVarun Wadekar /* Place pubsub sections for events */ 82*c2ad38ceSVarun Wadekar __PUBSUB_EVENTS__ AlignExpr(+0, 8) EMPTY 0 83*c2ad38ceSVarun Wadekar { 84*c2ad38ceSVarun Wadekar /* placeholder */ 85*c2ad38ceSVarun Wadekar } 86*c2ad38ceSVarun Wadekar 87*c2ad38ceSVarun Wadekar#include <lib/el3_runtime/pubsub_events.h> 88*c2ad38ceSVarun Wadekar 89*c2ad38ceSVarun Wadekar __RODATA_EPILOGUE__ AlignExpr(+0, PAGE_SIZE) FIXED EMPTY 0 90*c2ad38ceSVarun Wadekar { 91*c2ad38ceSVarun Wadekar /* section delimiter */ 92*c2ad38ceSVarun Wadekar } 93*c2ad38ceSVarun Wadekar} 94*c2ad38ceSVarun Wadekar 95*c2ad38ceSVarun Wadekar /* cpu_ops must always be defined */ 96*c2ad38ceSVarun Wadekar ScatterAssert(ImageLength(__CPU_OPS__) > 0) 97*c2ad38ceSVarun Wadekar 98*c2ad38ceSVarun Wadekar#if ENABLE_SPM 99*c2ad38ceSVarun WadekarLR_SPM +0 100*c2ad38ceSVarun Wadekar{ 101*c2ad38ceSVarun Wadekar /* 102*c2ad38ceSVarun Wadekar * Exception vectors of the SPM shim layer. They must be aligned to a 2K 103*c2ad38ceSVarun Wadekar * address, but we need to place them in a separate page so that we can set 104*c2ad38ceSVarun Wadekar * individual permissions to them, so the actual alignment needed is 4K. 105*c2ad38ceSVarun Wadekar * 106*c2ad38ceSVarun Wadekar * There's no need to include this into the RO section of BL31 because it 107*c2ad38ceSVarun Wadekar * doesn't need to be accessed by BL31. 108*c2ad38ceSVarun Wadekar */ 109*c2ad38ceSVarun Wadekar __SPM_SHIM_EXCEPTIONS__ AlignExpr(ImageLimit(LR_RO_DATA), PAGE_SIZE) FIXED 110*c2ad38ceSVarun Wadekar { 111*c2ad38ceSVarun Wadekar *(.spm_shim_exceptions) 112*c2ad38ceSVarun Wadekar } 113*c2ad38ceSVarun Wadekar 114*c2ad38ceSVarun Wadekar __SPM_SHIM_EXCEPTIONS_EPILOGUE__ AlignExpr(ImageLimit(__SPM_SHIM_EXCEPTIONS__), PAGE_SIZE) FIXED 115*c2ad38ceSVarun Wadekar { 116*c2ad38ceSVarun Wadekar /* placeholder */ 117*c2ad38ceSVarun Wadekar } 118*c2ad38ceSVarun Wadekar} 119*c2ad38ceSVarun Wadekar#endif 120*c2ad38ceSVarun Wadekar 121*c2ad38ceSVarun WadekarLR_RW_DATA +0 122*c2ad38ceSVarun Wadekar{ 123*c2ad38ceSVarun Wadekar __DATA__ AlignExpr(+0, 16) FIXED 124*c2ad38ceSVarun Wadekar { 125*c2ad38ceSVarun Wadekar *(.data*) 126*c2ad38ceSVarun Wadekar *(.constdata) 127*c2ad38ceSVarun Wadekar *(locale$$data) 128*c2ad38ceSVarun Wadekar } 129*c2ad38ceSVarun Wadekar} 130*c2ad38ceSVarun Wadekar 131*c2ad38ceSVarun WadekarLR_RELA +0 132*c2ad38ceSVarun Wadekar{ 133*c2ad38ceSVarun Wadekar /* 134*c2ad38ceSVarun Wadekar * .rela.dyn needs to come after .data for the read-elf utility to parse 135*c2ad38ceSVarun Wadekar * this section correctly. Ensure 8-byte alignment so that the fields of 136*c2ad38ceSVarun Wadekar * RELA data structure are aligned. 137*c2ad38ceSVarun Wadekar */ 138*c2ad38ceSVarun Wadekar __RELA__ AlignExpr(ImageLimit(LR_RW_DATA), 8) FIXED 139*c2ad38ceSVarun Wadekar { 140*c2ad38ceSVarun Wadekar *(.rela.dyn) 141*c2ad38ceSVarun Wadekar } 142*c2ad38ceSVarun Wadekar} 143*c2ad38ceSVarun Wadekar 144*c2ad38ceSVarun Wadekar#ifdef BL31_PROGBITS_LIMIT 145*c2ad38ceSVarun Wadekar /* BL31 progbits has exceeded its limit. */ 146*c2ad38ceSVarun Wadekar ScatterAssert(ImageLimit(LR_RELA) <= BL31_PROGBITS_LIMIT) 147*c2ad38ceSVarun Wadekar#endif 148*c2ad38ceSVarun Wadekar 149*c2ad38ceSVarun WadekarLR_STACKS +0 150*c2ad38ceSVarun Wadekar{ 151*c2ad38ceSVarun Wadekar __STACKS__ AlignExpr(+0, 64) FIXED 152*c2ad38ceSVarun Wadekar { 153*c2ad38ceSVarun Wadekar *(tzfw_normal_stacks) 154*c2ad38ceSVarun Wadekar } 155*c2ad38ceSVarun Wadekar} 156*c2ad38ceSVarun Wadekar 157*c2ad38ceSVarun Wadekar#define __BAKERY_LOCK_SIZE__ (ImageLimit(__BAKERY_LOCKS_EPILOGUE__) - \ 158*c2ad38ceSVarun Wadekar ImageBase(__BAKERY_LOCKS__)) 159*c2ad38ceSVarun Wadekar#define BAKERY_LOCK_SIZE (__BAKERY_LOCK_SIZE__ * (PLATFORM_CORE_COUNT - 1)) 160*c2ad38ceSVarun Wadekar#define __PMF_TIMESTAMP_SIZE__ (ImageLimit(__PMF_TIMESTAMP__) - \ 161*c2ad38ceSVarun Wadekar ImageBase(__PMF_TIMESTAMP__)) 162*c2ad38ceSVarun Wadekar#define PER_CPU_TIMESTAMP_SIZE (__PMF_TIMESTAMP_SIZE__ * (PLATFORM_CORE_COUNT - 1)) 163*c2ad38ceSVarun Wadekar 164*c2ad38ceSVarun WadekarLR_BSS +0 165*c2ad38ceSVarun Wadekar{ 166*c2ad38ceSVarun Wadekar __BSS__ AlignExpr(ImageLimit(LR_STACKS), 256) FIXED 167*c2ad38ceSVarun Wadekar { 168*c2ad38ceSVarun Wadekar *(.bss*) 169*c2ad38ceSVarun Wadekar *(COMDAT) 170*c2ad38ceSVarun Wadekar } 171*c2ad38ceSVarun Wadekar 172*c2ad38ceSVarun Wadekar#if !USE_COHERENT_MEM 173*c2ad38ceSVarun Wadekar /* 174*c2ad38ceSVarun Wadekar * Bakery locks are stored in normal .bss memory 175*c2ad38ceSVarun Wadekar * 176*c2ad38ceSVarun Wadekar * Each lock's data is spread across multiple cache lines, one per CPU, 177*c2ad38ceSVarun Wadekar * but multiple locks can share the same cache line. 178*c2ad38ceSVarun Wadekar * The compiler will allocate enough memory for one CPU's bakery locks, 179*c2ad38ceSVarun Wadekar * the remaining cache lines are allocated by the linker script 180*c2ad38ceSVarun Wadekar */ 181*c2ad38ceSVarun Wadekar __BAKERY_LOCKS__ AlignExpr(ImageLimit(__BSS__), CACHE_WRITEBACK_GRANULE) FIXED 182*c2ad38ceSVarun Wadekar { 183*c2ad38ceSVarun Wadekar *(bakery_lock) 184*c2ad38ceSVarun Wadekar } 185*c2ad38ceSVarun Wadekar 186*c2ad38ceSVarun Wadekar __BAKERY_LOCKS_EPILOGUE__ AlignExpr(ImageLimit(__BAKERY_LOCKS__), CACHE_WRITEBACK_GRANULE) FIXED EMPTY 0 187*c2ad38ceSVarun Wadekar { 188*c2ad38ceSVarun Wadekar /* section delimiter */ 189*c2ad38ceSVarun Wadekar } 190*c2ad38ceSVarun Wadekar 191*c2ad38ceSVarun Wadekar __PER_CPU_BAKERY_LOCKS__ ImageLimit(__BAKERY_LOCKS_EPILOGUE__) FIXED FILL 0 BAKERY_LOCK_SIZE 192*c2ad38ceSVarun Wadekar { 193*c2ad38ceSVarun Wadekar /* padded memory section to store per cpu bakery locks */ 194*c2ad38ceSVarun Wadekar } 195*c2ad38ceSVarun Wadekar 196*c2ad38ceSVarun Wadekar#ifdef PLAT_PERCPU_BAKERY_LOCK_SIZE 197*c2ad38ceSVarun Wadekar /* PLAT_PERCPU_BAKERY_LOCK_SIZE does not match bakery lock requirements */ 198*c2ad38ceSVarun Wadekar ScatterAssert(__PER_CPU_BAKERY_LOCK_SIZE__ == PLAT_PERCPU_BAKERY_LOCK_SIZE) 199*c2ad38ceSVarun Wadekar#endif 200*c2ad38ceSVarun Wadekar#endif 201*c2ad38ceSVarun Wadekar 202*c2ad38ceSVarun Wadekar#if ENABLE_PMF 203*c2ad38ceSVarun Wadekar /* 204*c2ad38ceSVarun Wadekar * Time-stamps are stored in normal .bss memory 205*c2ad38ceSVarun Wadekar * 206*c2ad38ceSVarun Wadekar * The compiler will allocate enough memory for one CPU's time-stamps, 207*c2ad38ceSVarun Wadekar * the remaining memory for other CPU's is allocated by the 208*c2ad38ceSVarun Wadekar * linker script 209*c2ad38ceSVarun Wadekar */ 210*c2ad38ceSVarun Wadekar __PMF_TIMESTAMP__ AlignExpr(+0, CACHE_WRITEBACK_GRANULE) FIXED EMPTY CACHE_WRITEBACK_GRANULE 211*c2ad38ceSVarun Wadekar { 212*c2ad38ceSVarun Wadekar /* store timestamps in this carved out memory */ 213*c2ad38ceSVarun Wadekar } 214*c2ad38ceSVarun Wadekar 215*c2ad38ceSVarun Wadekar __PMF_TIMESTAMP_EPILOGUE__ AlignExpr(ImageLimit(__PMF_TIMESTAMP__), CACHE_WRITEBACK_GRANULE) FIXED EMPTY 0 216*c2ad38ceSVarun Wadekar { 217*c2ad38ceSVarun Wadekar /* 218*c2ad38ceSVarun Wadekar * placeholder to make __PMF_TIMESTAMP_START__ end on a 219*c2ad38ceSVarun Wadekar * CACHE_WRITEBACK_GRANULE boundary 220*c2ad38ceSVarun Wadekar */ 221*c2ad38ceSVarun Wadekar } 222*c2ad38ceSVarun Wadekar 223*c2ad38ceSVarun Wadekar __PER_CPU_TIMESTAMPS__ +0 FIXED FILL 0 PER_CPU_TIMESTAMP_SIZE 224*c2ad38ceSVarun Wadekar { 225*c2ad38ceSVarun Wadekar /* padded memory section to store per cpu timestamps */ 226*c2ad38ceSVarun Wadekar } 227*c2ad38ceSVarun Wadekar#endif /* ENABLE_PMF */ 228*c2ad38ceSVarun Wadekar} 229*c2ad38ceSVarun Wadekar 230*c2ad38ceSVarun WadekarLR_XLAT_TABLE +0 231*c2ad38ceSVarun Wadekar{ 232*c2ad38ceSVarun Wadekar xlat_table +0 FIXED 233*c2ad38ceSVarun Wadekar { 234*c2ad38ceSVarun Wadekar *(xlat_table) 235*c2ad38ceSVarun Wadekar } 236*c2ad38ceSVarun Wadekar} 237*c2ad38ceSVarun Wadekar 238*c2ad38ceSVarun Wadekar#if USE_COHERENT_MEM 239*c2ad38ceSVarun WadekarLR_COHERENT_RAM +0 240*c2ad38ceSVarun Wadekar{ 241*c2ad38ceSVarun Wadekar /* 242*c2ad38ceSVarun Wadekar * The base address of the coherent memory section must be page-aligned (4K) 243*c2ad38ceSVarun Wadekar * to guarantee that the coherent data are stored on their own pages and 244*c2ad38ceSVarun Wadekar * are not mixed with normal data. This is required to set up the correct 245*c2ad38ceSVarun Wadekar * memory attributes for the coherent data page tables. 246*c2ad38ceSVarun Wadekar */ 247*c2ad38ceSVarun Wadekar __COHERENT_RAM__ AlignExpr(+0, PAGE_SIZE) FIXED 248*c2ad38ceSVarun Wadekar { 249*c2ad38ceSVarun Wadekar /* 250*c2ad38ceSVarun Wadekar * Bakery locks are stored in coherent memory 251*c2ad38ceSVarun Wadekar * 252*c2ad38ceSVarun Wadekar * Each lock's data is contiguous and fully allocated by the compiler 253*c2ad38ceSVarun Wadekar */ 254*c2ad38ceSVarun Wadekar *(bakery_lock) 255*c2ad38ceSVarun Wadekar *(tzfw_coherent_mem) 256*c2ad38ceSVarun Wadekar } 257*c2ad38ceSVarun Wadekar 258*c2ad38ceSVarun Wadekar __COHERENT_RAM_EPILOGUE_UNALIGNED__ +0 FIXED EMPTY 0 259*c2ad38ceSVarun Wadekar { 260*c2ad38ceSVarun Wadekar /* section delimiter */ 261*c2ad38ceSVarun Wadekar } 262*c2ad38ceSVarun Wadekar 263*c2ad38ceSVarun Wadekar /* 264*c2ad38ceSVarun Wadekar * Memory page(s) mapped to this section will be marked 265*c2ad38ceSVarun Wadekar * as device memory. No other unexpected data must creep in. 266*c2ad38ceSVarun Wadekar * Ensure the rest of the current memory page is unused. 267*c2ad38ceSVarun Wadekar */ 268*c2ad38ceSVarun Wadekar __COHERENT_RAM_EPILOGUE__ AlignExpr(ImageLimit(__COHERENT_RAM_START__), PAGE_SIZE) FIXED EMPTY 0 269*c2ad38ceSVarun Wadekar { 270*c2ad38ceSVarun Wadekar /* section delimiter */ 271*c2ad38ceSVarun Wadekar } 272*c2ad38ceSVarun Wadekar} 273*c2ad38ceSVarun Wadekar#endif 274*c2ad38ceSVarun Wadekar 275*c2ad38ceSVarun WadekarLR_END +0 276*c2ad38ceSVarun Wadekar{ 277*c2ad38ceSVarun Wadekar __BL31_END__ +0 FIXED EMPTY 0 278*c2ad38ceSVarun Wadekar { 279*c2ad38ceSVarun Wadekar /* placeholder */ 280*c2ad38ceSVarun Wadekar } 281*c2ad38ceSVarun Wadekar 282*c2ad38ceSVarun Wadekar /* BL31 image has exceeded its limit. */ 283*c2ad38ceSVarun Wadekar ScatterAssert(ImageLimit(__BL31_END__) <= BL31_LIMIT) 284*c2ad38ceSVarun Wadekar} 285