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