bl1.ld.S 5.1 KB
Newer Older
1
/*
2
 * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
3
 *
dp-arm's avatar
dp-arm committed
4
 * SPDX-License-Identifier: BSD-3-Clause
5
6
 */

7
#include <platform_def.h>
8
9
10

OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
11
ENTRY(bl1_entrypoint)
12
13

MEMORY {
14
15
    ROM (rx): ORIGIN = BL1_RO_BASE, LENGTH = BL1_RO_LIMIT - BL1_RO_BASE
    RAM (rwx): ORIGIN = BL1_RW_BASE, LENGTH = BL1_RW_LIMIT - BL1_RW_BASE
16
17
18
19
}

SECTIONS
{
20
21
22
23
    . = BL1_RO_BASE;
    ASSERT(. == ALIGN(4096),
           "BL1_RO_BASE address is not aligned on a page boundary.")

24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#if SEPARATE_CODE_AND_RODATA
    .text . : {
        __TEXT_START__ = .;
        *bl1_entrypoint.o(.text*)
        *(.text*)
        *(.vectors)
        . = NEXT(4096);
        __TEXT_END__ = .;
     } >ROM

    .rodata . : {
        __RODATA_START__ = .;
        *(.rodata*)

        /* Ensure 8-byte alignment for descriptors and ensure inclusion */
        . = ALIGN(8);
        __PARSER_LIB_DESCS_START__ = .;
        KEEP(*(.img_parser_lib_descs))
        __PARSER_LIB_DESCS_END__ = .;

        /*
         * Ensure 8-byte alignment for cpu_ops so that its fields are also
         * aligned. Also ensure cpu_ops inclusion.
         */
        . = ALIGN(8);
        __CPU_OPS_START__ = .;
        KEEP(*(cpu_ops))
        __CPU_OPS_END__ = .;

        /*
         * No need to pad out the .rodata section to a page boundary. Next is
         * the .data section, which can mapped in ROM with the same memory
         * attributes as the .rodata section.
         */
        __RODATA_END__ = .;
    } >ROM
#else
61
    ro . : {
62
        __RO_START__ = .;
Andrew Thoelke's avatar
Andrew Thoelke committed
63
64
        *bl1_entrypoint.o(.text*)
        *(.text*)
65
        *(.rodata*)
66

67
68
69
70
71
72
        /* Ensure 8-byte alignment for descriptors and ensure inclusion */
        . = ALIGN(8);
        __PARSER_LIB_DESCS_START__ = .;
        KEEP(*(.img_parser_lib_descs))
        __PARSER_LIB_DESCS_END__ = .;

73
74
75
76
77
78
79
80
81
        /*
         * Ensure 8-byte alignment for cpu_ops so that its fields are also
         * aligned. Also ensure cpu_ops inclusion.
         */
        . = ALIGN(8);
        __CPU_OPS_START__ = .;
        KEEP(*(cpu_ops))
        __CPU_OPS_END__ = .;

Achin Gupta's avatar
Achin Gupta committed
82
        *(.vectors)
83
        __RO_END__ = .;
84
    } >ROM
85
#endif
86

87
88
89
    ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__,
           "cpu_ops not defined for this platform.")

90
91
92
93
    . = BL1_RW_BASE;
    ASSERT(BL1_RW_BASE == ALIGN(4096),
           "BL1_RW_BASE address is not aligned on a page boundary.")

94
95
    /*
     * The .data section gets copied from ROM to RAM at runtime.
96
97
     * Its LMA should be 16-byte aligned to allow efficient copying of 16-bytes
     * aligned regions in it.
98
     * Its VMA must be page-aligned as it marks the first read/write page.
99
100
101
102
     *
     * It must be placed at a lower address than the stacks if the stack
     * protector is enabled. Alternatively, the .data.stack_protector_canary
     * section can be placed independently of the main .data section.
103
     */
104
    .data . : ALIGN(16) {
105
        __DATA_RAM_START__ = .;
Andrew Thoelke's avatar
Andrew Thoelke committed
106
        *(.data*)
107
108
        __DATA_RAM_END__ = .;
    } >RAM AT>ROM
109

110
    stacks . (NOLOAD) : {
111
        __STACKS_START__ = .;
112
        *(tzfw_normal_stacks)
113
114
115
116
117
        __STACKS_END__ = .;
    } >RAM

    /*
     * The .bss section gets initialised to 0 at runtime.
118
119
     * Its base address should be 16-byte aligned for better performance of the
     * zero-initialization code.
120
121
122
     */
    .bss : ALIGN(16) {
        __BSS_START__ = .;
Andrew Thoelke's avatar
Andrew Thoelke committed
123
        *(.bss*)
124
125
126
        *(COMMON)
        __BSS_END__ = .;
    } >RAM
127

128
    /*
129
     * The xlat_table section is for full, aligned page tables (4K).
130
131
132
133
134
135
136
     * Removing them from .bss avoids forcing 4K alignment on
     * the .bss section and eliminates the unecessary zero init
     */
    xlat_table (NOLOAD) : {
        *(xlat_table)
    } >RAM

137
#if USE_COHERENT_MEM
138
139
140
141
142
143
144
145
    /*
     * The base address of the coherent memory section must be page-aligned (4K)
     * to guarantee that the coherent data are stored on their own pages and
     * are not mixed with normal data.  This is required to set up the correct
     * memory attributes for the coherent data page tables.
     */
    coherent_ram (NOLOAD) : ALIGN(4096) {
        __COHERENT_RAM_START__ = .;
146
        *(tzfw_coherent_mem)
147
148
149
150
151
152
153
154
        __COHERENT_RAM_END_UNALIGNED__ = .;
        /*
         * Memory page(s) mapped to this section will be marked
         * as device memory.  No other unexpected data must creep in.
         * Ensure the rest of the current memory page is unused.
         */
        . = NEXT(4096);
        __COHERENT_RAM_END__ = .;
155
    } >RAM
156
#endif
157

158
159
160
161
162
    __BL1_RAM_START__ = ADDR(.data);
    __BL1_RAM_END__ = .;

    __DATA_ROM_START__ = LOADADDR(.data);
    __DATA_SIZE__ = SIZEOF(.data);
163

164
165
    /*
     * The .data section is the last PROGBITS section so its end marks the end
166
     * of BL1's actual content in Trusted ROM.
167
     */
168
169
170
    __BL1_ROM_END__ =  __DATA_ROM_START__ + __DATA_SIZE__;
    ASSERT(__BL1_ROM_END__ <= BL1_RO_LIMIT,
           "BL1's ROM content has exceeded its limit.")
171

172
    __BSS_SIZE__ = SIZEOF(.bss);
173

174
#if USE_COHERENT_MEM
175
176
    __COHERENT_RAM_UNALIGNED_SIZE__ =
        __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
177
#endif
178

179
    ASSERT(. <= BL1_RW_LIMIT, "BL1's RW section has exceeded its limit.")
180
}