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