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