1;/* 2; * Copyright (c) 2009-2023 Arm Limited 3; * Copyright (c) 2022 Cypress Semiconductor Corporation (an Infineon company) 4; * or an affiliate of Cypress Semiconductor Corporation. All rights reserved. 5; * 6; * Licensed under the Apache License, Version 2.0 (the "License"); 7; * you may not use this file except in compliance with the License. 8; * You may obtain a copy of the License at 9; * 10; * http://www.apache.org/licenses/LICENSE-2.0 11; * 12; * Unless required by applicable law or agreed to in writing, software 13; * distributed under the License is distributed on an "AS IS" BASIS, 14; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15; * See the License for the specific language governing permissions and 16; * limitations under the License. 17; * 18; * 19; * This file is derivative of CMSIS V5.00 gcc_arm.ld 20; */ 21 22/***********{{utilities.donotedit_warning}}***********/ 23 24/* Linker script to configure memory regions. */ 25/* This file will be run trough the pre-processor. */ 26 27#include "region_defs.h" 28 29/* Include file with definitions for section alignments. 30 * Note: it should be included after region_defs.h to let platform define 31 * default values if needed. */ 32#include "tfm_s_linker_alignments.h" 33 34MEMORY 35{ 36 FLASH (rx) : ORIGIN = S_CODE_START, LENGTH = S_CODE_SIZE 37 RAM (rwx) : ORIGIN = S_DATA_START, LENGTH = S_DATA_SIZE 38#if defined(S_RAM_CODE_START) 39 CODE_RAM (rwx) : ORIGIN = S_RAM_CODE_START, LENGTH = S_RAM_CODE_SIZE 40#endif 41} 42 43__msp_stack_size__ = S_MSP_STACK_SIZE; 44 45/* Library configurations */ 46GROUP(libgcc.a libc.a libm.a libnosys.a libc_nano.a) 47 48ENTRY(Reset_Handler) 49 50SECTIONS 51{ 52 /* Start address of the code. */ 53 Image$$PT_RO_START$$Base = ADDR(.TFM_VECTORS); 54 55 .TFM_VECTORS : ALIGN(4) 56 { 57 __vectors_start__ = .; 58 KEEP(*(.vectors)) 59 __vectors_end__ = .; 60 . = ALIGN(4); 61 } > FLASH 62 63#ifdef CONFIG_TFM_USE_TRUSTZONE 64 ASSERT(. <= ADDR(.TFM_VECTORS) + S_CODE_VECTOR_TABLE_SIZE, ".TFM_VECTORS section size overflow.") 65 . = ADDR(.TFM_VECTORS) + S_CODE_VECTOR_TABLE_SIZE; 66 /* 67 * Place the CMSE Veneers (containing the SG instruction) after the code, in 68 * a separate at least 32 bytes aligned region so that the SAU can 69 * programmed to just set this region as Non-Secure Callable. 70 */ 71 .gnu.sgstubs ALIGN(TFM_LINKER_VENEERS_ALIGNMENT) : 72 { 73 *(.gnu.sgstubs*) 74 } > FLASH 75 Image$$ER_VENEER$$Base = ADDR(.gnu.sgstubs); 76 Image$$VENEER_ALIGN$$Limit = ALIGN(TFM_LINKER_VENEERS_ALIGNMENT); 77 78 /* GCC always places veneers at the end of .gnu.sgstubs section, so the only 79 * way to align the end of .gnu.sgstubs section is to align start of the 80 * next section */ 81 .copy.table : ALIGN(TFM_LINKER_VENEERS_ALIGNMENT) 82#else 83 .copy.table : ALIGN(4) 84#endif 85 { 86 __copy_table_start__ = .; 87#ifdef RAM_VECTORS_SUPPORT 88 /* Copy interrupt vectors from flash to RAM */ 89 LONG (__vectors_start__) /* From */ 90 LONG (__ram_vectors_start__) /* To */ 91 LONG ((__vectors_end__ - __vectors_start__) / 4) /* Size */ 92#endif 93 LONG (LOADADDR(.spm_data)) 94 LONG (ADDR(.spm_data)) 95 LONG (SIZEOF(.spm_data) / 4) 96 LONG (LOADADDR(.TFM_DATA)) 97 LONG (ADDR(.TFM_DATA)) 98 LONG (SIZEOF(.TFM_DATA) / 4) 99{% for partition in partitions %} 100 LONG (LOADADDR(.ER_{{partition.manifest.name}}_RWZI)) 101 LONG (ADDR(.ER_{{partition.manifest.name}}_RWZI)) 102 LONG (SIZEOF(.ER_{{partition.manifest.name}}_RWZI) / 4) 103{% endfor %} 104#if defined(S_RAM_CODE_START) 105 LONG (LOADADDR(.ER_CODE_SRAM)) 106 LONG (ADDR(.ER_CODE_SRAM)) 107 LONG (SIZEOF(.ER_CODE_SRAM) / 4) 108#endif 109 110 __copy_table_end__ = .; 111 } > FLASH 112 113 .zero.table : ALIGN(4) 114 { 115 __zero_table_start__ = .; 116 LONG (ADDR(.spm_bss)) 117 LONG (SIZEOF(.spm_bss) / 4) 118#if defined(CONFIG_TFM_PARTITION_META) 119 LONG (ADDR(.TFM_SP_META_PTR)) 120 LONG (SIZEOF(.TFM_SP_META_PTR) / 4) 121#endif 122 LONG (ADDR(.TFM_BSS)) 123 LONG (SIZEOF(.TFM_BSS) / 4) 124{% for partition in partitions %} 125 LONG (ADDR(.{{partition.manifest.name}}_RWZI_BSS)) 126 LONG (SIZEOF(.{{partition.manifest.name}}_RWZI_BSS) / 4) 127{% endfor %} 128 __zero_table_end__ = .; 129 } > FLASH 130 131 /**** Section for holding partition RO load data */ 132 /* 133 * Sort the partition info by priority to guarantee the initing order. 134 * The first loaded partition will be inited at last in SFN model. 135 */ 136 .TFM_SP_LOAD_LIST : ALIGN(4) 137 { 138 KEEP(*(.part_load_priority_lowest)) 139 KEEP(*(.part_load_priority_low)) 140 KEEP(*(.part_load_priority_normal)) 141 KEEP(*(.part_load_priority_high)) 142 } > FLASH 143 Image$$TFM_SP_LOAD_LIST$$RO$$Base = ADDR(.TFM_SP_LOAD_LIST); 144 Image$$TFM_SP_LOAD_LIST$$RO$$Limit = ADDR(.TFM_SP_LOAD_LIST) + SIZEOF(.TFM_SP_LOAD_LIST); 145 146 /**** PSA RoT RO CODE + RO-data starts here */ 147 . = ALIGN(TFM_LINKER_PSA_ROT_LINKER_CODE_ALIGNMENT); 148{% for partition in partitions %} 149 {% if partition.manifest.type == 'PSA-ROT' %} 150 .{{partition.manifest.name}}_RO : ALIGN(TFM_LINKER_PSA_ROT_LINKER_CODE_ALIGNMENT) 151 { 152 {% if partition.attr.linker_pattern.library_list %} 153 {% for pattern in partition.attr.linker_pattern.library_list %} 154 {{pattern}}:*(.text*) 155 {{pattern}}:*(.rodata*) 156 {% endfor %} 157 {% endif %} 158 {% if partition.attr.linker_pattern.object_list %} 159 {% for pattern in partition.attr.linker_pattern.object_list %} 160 {{pattern}}(.text*) 161 {{pattern}}:*(.rodata*) 162 {% endfor %} 163 {% endif %} 164 *({{partition.manifest.name}}_PSA-ROT_ATTR_FN) 165 . = ALIGN(TFM_LINKER_PSA_ROT_LINKER_CODE_ALIGNMENT); 166 } > FLASH 167 Image$${{partition.manifest.name}}_RO$$Base = ADDR(.{{partition.manifest.name}}_RO); 168 Image$${{partition.manifest.name}}_RO$$Limit = ADDR(.{{partition.manifest.name}}_RO) + SIZEOF(.{{partition.manifest.name}}_RO); 169 170 {% endif %} 171{% endfor %} 172 /**** PSA RoT RO CODE + data ends here */ 173 174 /**** APPLICATION RoT RO CODE + data starts here */ 175{% for partition in partitions %} 176 {% if partition.manifest.type == 'APPLICATION-ROT' %} 177 .{{partition.manifest.name}}_RO : ALIGN(TFM_LINKER_APP_ROT_LINKER_CODE_ALIGNMENT) 178 { 179 {% if partition.attr.linker_pattern.library_list %} 180 {% for pattern in partition.attr.linker_pattern.library_list %} 181 {{pattern}}:*(.text*) 182 {{pattern}}:*(.rodata*) 183 {% endfor %} 184 {% endif %} 185 {% if partition.attr.linker_pattern.object_list %} 186 {% for pattern in partition.attr.linker_pattern.object_list %} 187 {{pattern}}(.text*) 188 {{pattern}}:*(.rodata*) 189 {% endfor %} 190 {% endif %} 191 *({{partition.manifest.name}}_APP-ROT_ATTR_FN) 192 . = ALIGN(TFM_LINKER_APP_ROT_LINKER_CODE_ALIGNMENT); 193 } > FLASH 194 Image$${{partition.manifest.name}}_CODE$$Base = ADDR(.{{partition.manifest.name}}_RO); 195 Image$${{partition.manifest.name}}_CODE$$Limit = ADDR(.{{partition.manifest.name}}_RO) + SIZEOF(.{{partition.manifest.name}}_RO); 196 197 {% endif %} 198{% endfor %} 199 /**** APPLICATION RoT RO CODE + data ends here */ 200 201#if defined(S_RAM_CODE_START) 202 /* Flash drivers code that gets copied from Flash */ 203 .ER_CODE_SRAM : ALIGN(4) 204 { 205 *libflash_drivers*:*(.text*) 206 *libflash_drivers*:*(.rodata*) 207 KEEP(*(.ramfunc)) 208 . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ 209 } > CODE_RAM AT > FLASH 210 Image$$ER_CODE_SRAM$$Base = ADDR(.ER_CODE_SRAM); 211 Image$$ER_CODE_SRAM$$Limit = ADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); 212#endif 213 214 .ER_TFM_CODE : ALIGN(4) 215 { 216 *startup*(.text*) 217 *libplatform_s*:*(.text*) 218 *libtfm_spm*:*(.text*) 219 220 *libplatform_s*:*(.rodata*) 221 *libtfm_spm*:*(.rodata*) 222 } > FLASH 223 224 /**** Unprivileged Secure code starts here */ 225 .ER_UNPRIV_CODE : ALIGN(TFM_LINKER_UNPRIV_CODE_ALIGNMENT) 226 { 227 *(SFN) 228 *(.text*) 229 230 KEEP(*(.init)) 231 KEEP(*(.fini)) 232 233 /* .ctors */ 234 *crtbegin.o(.ctors) 235 *crtbegin?.o(.ctors) 236 *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) 237 *(SORT(.ctors.*)) 238 *(.ctors) 239 240 /* .dtors */ 241 *crtbegin.o(.dtors) 242 *crtbegin?.o(.dtors) 243 *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) 244 *(SORT(.dtors.*)) 245 *(.dtors) 246 247 *(.rodata*) 248 249 KEEP(*(.eh_frame*)) 250 251 . = ALIGN(TFM_LINKER_UNPRIV_CODE_ALIGNMENT); 252 } > FLASH 253 Image$$TFM_UNPRIV_CODE$$RO$$Base = ADDR(.ER_UNPRIV_CODE); 254 Image$$TFM_UNPRIV_CODE$$RO$$Limit = ADDR(.ER_UNPRIV_CODE) + SIZEOF(.ER_UNPRIV_CODE); 255 256 /* Position tag */ 257 . = ALIGN(TFM_LINKER_PT_RO_ALIGNMENT); 258 Image$$PT_RO_END$$Base = .; 259 260 .ARM.extab : 261 { 262 *(.ARM.extab* .gnu.linkonce.armextab.*) 263 } > FLASH 264 265 __exidx_start = .; 266 .ARM.exidx : 267 { 268 *(.ARM.exidx* .gnu.linkonce.armexidx.*) 269 } > FLASH 270 __exidx_end = .; 271 272 /**** Base address of secure data area */ 273 .tfm_secure_data_start : 274 { 275 . = ABSOLUTE(S_DATA_START) ; 276 } > RAM 277 278 /* Position tag */ 279 . = ALIGN(TFM_LINKER_PT_PRIV_RWZI_ALIGNMENT); 280 Image$$PT_PRIV_RWZI_START$$Base = .; 281 282 /* shared_data and msp_stack are overlapping on purpose when 283 * msp_stack is extended until the beginning of RAM, when shared_date 284 * was read out by partitions 285 */ 286 .tfm_bl2_shared_data : ALIGN(TFM_LINKER_BL2_SHARED_DATA_ALIGNMENT) 287 { 288 . += BOOT_TFM_SHARED_DATA_SIZE; 289 } > RAM 290 291 .msp_stack : ALIGN(TFM_LINKER_MSP_STACK_ALIGNMENT) 292 { 293 . += __msp_stack_size__ - 0x8; 294 } > RAM 295 Image$$ARM_LIB_STACK$$ZI$$Base = ADDR(.msp_stack); 296 Image$$ARM_LIB_STACK$$ZI$$Limit = ADDR(.msp_stack) + SIZEOF(.msp_stack); 297 298 .msp_stack_seal_res : 299 { 300 . += 0x8; 301 } > RAM 302 __StackSeal = ADDR(.msp_stack_seal_res); 303 304#if defined(ENABLE_HEAP) 305 __heap_size__ = S_HEAP_SIZE; 306 .heap : ALIGN(8) 307 { 308 __end__ = .; 309 PROVIDE(end = .); 310 __HeapBase = .; 311 . += __heap_size__; 312 __HeapLimit = .; 313 __heap_limit = .; /* Add for _sbrk */ 314 } > RAM 315#endif 316 317 .spm_data : 318 { 319 *libtfm_spm*:*(.data*); 320 } > RAM AT> FLASH 321 .spm_bss : 322 { 323 *libtfm_spm*:*(.bss*); 324 } > RAM AT> RAM 325 326 /**** PSA RoT DATA start here */ 327{% for partition in partitions %} 328 {% if partition.manifest.type == 'PSA-ROT' %} 329 330 /* Position tag */ 331 . = ALIGN(TFM_LINKER_PSA_ROT_LINKER_DATA_ALIGNMENT); 332 Image$$PT_{{partition.manifest.name}}_PRIVATE_DATA_START$$Base = .; 333 334 .ER_{{partition.manifest.name}}_RWZI : ALIGN(TFM_LINKER_PSA_ROT_LINKER_DATA_ALIGNMENT) 335 { 336 {% if partition.attr.linker_pattern.library_list %} 337 {% for pattern in partition.attr.linker_pattern.library_list %} 338 {{pattern}}:*(.data*) 339 {% endfor %} 340 {% endif %} 341 {% if partition.attr.linker_pattern.object_list %} 342 {% for pattern in partition.attr.linker_pattern.object_list %} 343 {{pattern}}(.data*) 344 {% endfor %} 345 {% endif %} 346 *({{partition.manifest.name}}_PSA-ROT_ATTR_RW) 347 . = ALIGN(4); 348 } > RAM AT> FLASH 349 Image$$ER_{{partition.manifest.name}}_RWZI$$RW$$Base = ADDR(.ER_{{partition.manifest.name}}_RWZI); 350 Image$$ER_{{partition.manifest.name}}_RWZI$$RW$$Limit = ADDR(.ER_{{partition.manifest.name}}_RWZI) + SIZEOF(.ER_{{partition.manifest.name}}_RWZI); 351 352 .{{partition.manifest.name}}_RWZI_BSS : ALIGN(4) 353 { 354 start_of_{{partition.manifest.name}}_RWZI = .; 355 {% if partition.attr.linker_pattern.library_list %} 356 {% for pattern in partition.attr.linker_pattern.library_list %} 357 {{pattern}}:*(.bss*) 358 {{pattern}}:*(COMMON) 359 {% endfor %} 360 {% endif %} 361 {% if partition.attr.linker_pattern.object_list %} 362 {% for pattern in partition.attr.linker_pattern.object_list %} 363 {{pattern}}(.bss*) 364 {{pattern}}(COMMON) 365 {% endfor %} 366 {% endif %} 367 *({{partition.manifest.name}}_PSA-ROT_ATTR_ZI) 368 . += (. - start_of_{{partition.manifest.name}}_RWZI) ? 0 : 4; 369 . = ALIGN(TFM_LINKER_PSA_ROT_LINKER_DATA_ALIGNMENT); 370 } > RAM AT> RAM 371 Image$$ER_{{partition.manifest.name}}_RWZI$$ZI$$Base = ADDR(.{{partition.manifest.name}}_RWZI_BSS); 372 Image$$ER_{{partition.manifest.name}}_RWZI$$ZI$$Limit = ADDR(.{{partition.manifest.name}}_RWZI_BSS) + SIZEOF(.{{partition.manifest.name}}_RWZI_BSS); 373 374 /* Position tag */ 375 . = ALIGN(TFM_LINKER_PSA_ROT_LINKER_DATA_ALIGNMENT); 376 Image$$PT_{{partition.manifest.name}}_PRIVATE_DATA_END$$Base = .; 377 378 {% endif %} 379{% endfor %} 380 /**** PSA RoT DATA end here */ 381 . = ALIGN(TFM_LINKER_PT_PRIV_RWZI_ALIGNMENT); 382 383 /* Position tag */ 384 Image$$PT_PRIV_RWZI_END$$Base = .; 385 386 /**** APPLICATION RoT DATA start here */ 387{% for partition in partitions %} 388 {% if partition.manifest.type == 'APPLICATION-ROT' %} 389 /* Position tag */ 390 . = ALIGN(TFM_LINKER_APP_ROT_LINKER_DATA_ALIGNMENT); 391 Image$$PT_{{partition.manifest.name}}_PRIVATE_DATA_START$$Base = .; 392 393 .ER_{{partition.manifest.name}}_RWZI : ALIGN(TFM_LINKER_APP_ROT_LINKER_DATA_ALIGNMENT) 394 { 395 {% if partition.attr.linker_pattern.library_list %} 396 {% for pattern in partition.attr.linker_pattern.library_list %} 397 {{pattern}}:*(.data*) 398 {% endfor %} 399 {% endif %} 400 {% if partition.attr.linker_pattern.object_list %} 401 {% for pattern in partition.attr.linker_pattern.object_list %} 402 {{pattern}}(.data*) 403 {% endfor %} 404 {% endif %} 405 *({{partition.manifest.name}}_APP-ROT_ATTR_RW) 406 . = ALIGN(4); 407 } > RAM AT> FLASH 408 Image$$.ER_{{partition.manifest.name}}_RWZI$$RW$$Base = ADDR(.ER_{{partition.manifest.name}}_RWZI); 409 Image$$.ER_{{partition.manifest.name}}_RWZI$$RW$$Limit = ADDR(.ER_{{partition.manifest.name}}_RWZI) + SIZEOF(.ER_{{partition.manifest.name}}_RWZI); 410 411 .{{partition.manifest.name}}_RWZI_BSS : ALIGN(4) 412 { 413 start_of_{{partition.manifest.name}}_RWZI = .; 414 {% if partition.attr.linker_pattern.library_list %} 415 {% for pattern in partition.attr.linker_pattern.library_list %} 416 {{pattern}}:*(.bss*) 417 {{pattern}}:*(COMMON) 418 {% endfor %} 419 {% endif %} 420 {% if partition.attr.linker_pattern.object_list %} 421 {% for pattern in partition.attr.linker_pattern.object_list %} 422 {{pattern}}(.bss*) 423 {{pattern}}(COMMON) 424 {% endfor %} 425 {% endif %} 426 *({{partition.manifest.name}}_APP-ROT_ATTR_ZI) 427 . += (. - start_of_{{partition.manifest.name}}_RWZI) ? 0 : 4; 428 . = ALIGN(TFM_LINKER_APP_ROT_LINKER_DATA_ALIGNMENT); 429 } > RAM AT> RAM 430 Image$$ER_{{partition.manifest.name}}_RWZI$$ZI$$Base = ADDR(.{{partition.manifest.name}}_RWZI_BSS); 431 Image$$ER_{{partition.manifest.name}}_RWZI$$ZI$$Limit = ADDR(.{{partition.manifest.name}}_RWZI_BSS) + SIZEOF(.{{partition.manifest.name}}_RWZI_BSS); 432 433 /* Position tag */ 434 . = ALIGN(TFM_LINKER_APP_ROT_LINKER_DATA_ALIGNMENT); 435 Image$$PT_{{partition.manifest.name}}_PRIVATE_DATA_END$$Base = .; 436 437 {% endif %} 438{% endfor %} 439 /**** APPLICATION RoT DATA end here */ 440 441 /* Position tag */ 442 . = ALIGN(TFM_LINKER_APP_ROT_LINKER_DATA_ALIGNMENT); 443 Image$$PT_APP_RWZI_END$$Base = .; 444 445#ifdef RAM_VECTORS_SUPPORT 446 .ramVectors (NOLOAD) : ALIGN(TFM_LINKER_RAM_VECTORS_ALIGNMENT) 447 { 448 __ram_vectors_start__ = .; 449 KEEP(*(.ram_vectors)) 450 __ram_vectors_end__ = .; 451 } > RAM 452 .TFM_DATA __ram_vectors_end__ : ALIGN(4) 453#else 454 455 .TFM_DATA : ALIGN(4) 456#endif 457 { 458 *(.data*) 459 460 . = ALIGN(4); 461 /* preinit data */ 462 PROVIDE_HIDDEN (__preinit_array_start = .); 463 KEEP(*(.preinit_array)) 464 PROVIDE_HIDDEN (__preinit_array_end = .); 465 466 . = ALIGN(4); 467 /* init data */ 468 PROVIDE_HIDDEN (__init_array_start = .); 469 KEEP(*(SORT(.init_array.*))) 470 KEEP(*(.init_array)) 471 PROVIDE_HIDDEN (__init_array_end = .); 472 473 . = ALIGN(4); 474 /* finit data */ 475 PROVIDE_HIDDEN (__fini_array_start = .); 476 KEEP(*(SORT(.fini_array.*))) 477 KEEP(*(.fini_array)) 478 PROVIDE_HIDDEN (__fini_array_end = .); 479 480 KEEP(*(.jcr*)) 481 . = ALIGN(4); 482 483 } > RAM AT> FLASH 484 Image$$ER_TFM_DATA$$RW$$Base = ADDR(.TFM_DATA); 485 Image$$ER_TFM_DATA$$RW$$Limit = ADDR(.TFM_DATA) + SIZEOF(.TFM_DATA); 486 487#if defined(CONFIG_TFM_PARTITION_META) 488 .TFM_SP_META_PTR : ALIGN(TFM_LINKER_SP_META_PTR_ALIGNMENT) 489 { 490 *(.bss.SP_META_PTR_SPRTL_INST) 491 . = ALIGN(TFM_LINKER_SP_META_PTR_ALIGNMENT); 492 } > RAM AT> RAM 493 Image$$TFM_SP_META_PTR$$ZI$$Base = ADDR(.TFM_SP_META_PTR); 494 Image$$TFM_SP_META_PTR$$ZI$$Limit = ADDR(.TFM_SP_META_PTR) + SIZEOF(.TFM_SP_META_PTR); 495#endif 496 497 .TFM_BSS : ALIGN(4) 498 { 499 __bss_start__ = .; 500 501 /* The runtime partition placed order is same as load partition */ 502 __partition_runtime_start__ = .; 503 KEEP(*(.bss.part_runtime_priority_lowest)) 504 KEEP(*(.bss.part_runtime_priority_low)) 505 KEEP(*(.bss.part_runtime_priority_normal)) 506 KEEP(*(.bss.part_runtime_priority_high)) 507 __partition_runtime_end__ = .; 508 . = ALIGN(4); 509 510 /* The runtime service placed order is same as load partition */ 511 __service_runtime_start__ = .; 512 KEEP(*(.bss.serv_runtime_priority_lowest)) 513 KEEP(*(.bss.serv_runtime_priority_low)) 514 KEEP(*(.bss.serv_runtime_priority_normal)) 515 KEEP(*(.bss.serv_runtime_priority_high)) 516 __service_runtime_end__ = .; 517 *(.bss*) 518 *(COMMON) 519 . = ALIGN(4); 520 __bss_end__ = .; 521 } > RAM AT> RAM 522 Image$$ER_TFM_DATA$$ZI$$Base = ADDR(.TFM_BSS); 523 Image$$ER_TFM_DATA$$ZI$$Limit = ADDR(.TFM_BSS) + SIZEOF(.TFM_BSS); 524 Image$$ER_PART_RT_POOL$$ZI$$Base = __partition_runtime_start__; 525 Image$$ER_PART_RT_POOL$$ZI$$Limit = __partition_runtime_end__; 526 Image$$ER_SERV_RT_POOL$$ZI$$Base = __service_runtime_start__; 527 Image$$ER_SERV_RT_POOL$$ZI$$Limit = __service_runtime_end__; 528 529 Image$$ER_TFM_DATA$$Base = ADDR(.TFM_DATA); 530 Image$$ER_TFM_DATA$$Limit = ADDR(.TFM_DATA) + SIZEOF(.TFM_DATA) + SIZEOF(.TFM_BSS); 531 532 Load$$LR$$LR_NS_PARTITION$$Base = NS_PARTITION_START; 533 534#ifdef BL2 535 Load$$LR$$LR_SECONDARY_PARTITION$$Base = SECONDARY_PARTITION_START; 536#endif /* BL2 */ 537 538 PROVIDE(__stack = Image$$ARM_LIB_STACK$$ZI$$Limit); 539} 540