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