Chris Zankel | 1387dab | 2016-08-10 18:36:44 +0300 | [diff] [blame] | 1 | /* |
| 2 | * (C) Copyright 2007 Tensilica, Inc. |
| 3 | * (C) Copyright 2014 - 2016 Cadence Design Systems Inc. |
| 4 | * |
| 5 | * SPDX-License-Identifier: GPL-2.0+ |
| 6 | */ |
| 7 | |
| 8 | #ifndef _XTENSA_LDSCRIPT_H |
| 9 | #define _XTENSA_LDSCRIPT_H |
| 10 | |
| 11 | /* |
| 12 | * This linker script is pre-processed with CPP to avoid hard-coding |
| 13 | * addresses that depend on the Xtensa core configuration, because |
| 14 | * this FPGA board can be used with a huge variety of Xtensa cores. |
| 15 | */ |
| 16 | |
| 17 | #include <asm/arch/core.h> |
| 18 | #include <asm/addrspace.h> |
| 19 | |
| 20 | #define ALIGN_LMA 4 |
| 21 | #define LMA_EQ_VMA |
| 22 | #define FORCE_OUTPUT . = . |
| 23 | #define FOLLOWING(sec) \ |
| 24 | AT(((LOADADDR(sec) + SIZEOF(sec) + ALIGN_LMA-1)) & ~(ALIGN_LMA-1)) |
| 25 | |
| 26 | /* |
| 27 | * Specify an output section that will be added to the ROM store table |
| 28 | * (PACKED_SECTION) or one that will be resident in ROM (RESIDENT_SECTION). |
| 29 | * 'symname' is a base name for section boundary symbols *_start & *_end. |
| 30 | * 'lma' is the load address at which a section will be packed in ROM. |
| 31 | * 'region' is the basename identifying a memory region and program header. |
| 32 | * 'keep' prevents removal of empty sections (must be 'KEEP' or 'NOKEEP'). |
| 33 | */ |
| 34 | |
| 35 | #define RELOCATE1(_sec_) \ |
| 36 | LONG(_##_sec_##_start); \ |
| 37 | LONG(_##_sec_##_end); \ |
| 38 | LONG(LOADADDR(.##_sec_)); |
| 39 | |
| 40 | #define RELOCATE2(_sym_, _sec_) \ |
| 41 | LONG(_##_sym_##_##_sec_##_start); \ |
| 42 | LONG(_##_sym_##_##_sec_##_end); \ |
| 43 | LONG(LOADADDR(.##_sym_##.##_sec_)); |
| 44 | |
| 45 | #define SECTION_VECTOR(_sym_, _sec_, _vma_, _lma_) \ |
| 46 | .##_sym_##.##_sec_ _vma_ : _lma_ \ |
| 47 | { \ |
| 48 | . = ALIGN(4); \ |
| 49 | _##_sym_##_##_sec_##_start = ABSOLUTE(.); \ |
| 50 | KEEP(*(.##_sym_##.##_sec_)) \ |
| 51 | _##_sym_##_##_sec_##_end = ABSOLUTE(.); \ |
| 52 | } |
| 53 | |
| 54 | /* In MMU configs there are two aliases of SYSROM, cached and uncached. |
| 55 | * For various reasons it is simpler to use the uncached mapping for load |
| 56 | * addresses, so ROM sections end up contiguous with the reset vector and |
| 57 | * we get a compact binary image. However we can gain performance by doing |
| 58 | * the unpacking from the cached ROM mapping. So we adjust all the load |
| 59 | * addresses in the ROM store table with an offset to the cached mapping, |
| 60 | * including the symbols referring to the ROM store table itself. |
| 61 | */ |
| 62 | |
| 63 | #define SECTION_ResetVector(_vma_, _lma_) \ |
| 64 | .ResetVector.text _vma_ : _lma_ \ |
| 65 | { \ |
| 66 | FORCE_OUTPUT; \ |
| 67 | KEEP(*(.ResetVector.text)); \ |
| 68 | KEEP(*(.reset.literal .reset.text)) \ |
| 69 | } |
| 70 | |
| 71 | #define SECTION_text(_vma_, _lma_) \ |
| 72 | .text _vma_ : _lma_ \ |
| 73 | { \ |
| 74 | _text_start = ABSOLUTE(.); \ |
| 75 | *(.literal .text) \ |
| 76 | *(.literal.* .text.* .stub) \ |
| 77 | *(.gnu.warning .gnu.linkonce.literal.*) \ |
| 78 | *(.gnu.linkonce.t.*.literal .gnu.linkonce.t.*) \ |
| 79 | *(.fini.literal) \ |
| 80 | *(.fini) \ |
| 81 | *(.gnu.version) \ |
| 82 | _text_end = ABSOLUTE(.); \ |
| 83 | } |
| 84 | |
| 85 | #define SECTION_rodata(_vma_, _lma_) \ |
| 86 | .rodata _vma_ : _lma_ \ |
| 87 | { \ |
| 88 | _rodata_start = ABSOLUTE(.); \ |
| 89 | *(.rodata) \ |
| 90 | *(.rodata.*) \ |
| 91 | *(.dtb.init.rodata) \ |
| 92 | *(.gnu.linkonce.r.*) \ |
| 93 | *(.rodata1) \ |
| 94 | __XT_EXCEPTION_TABLE__ = ABSOLUTE(.); \ |
| 95 | *(.xt_except_table) \ |
| 96 | *(.gcc_except_table) \ |
| 97 | *(.gnu.linkonce.e.*) \ |
| 98 | *(.gnu.version_r) \ |
| 99 | . = ALIGN(16); \ |
| 100 | _rodata_end = ABSOLUTE(.); \ |
| 101 | } |
| 102 | |
| 103 | #define SECTION_u_boot_list(_vma_, _lma_) \ |
| 104 | .u_boot_list _vma_ : _lma_ \ |
| 105 | { \ |
| 106 | _u_boot_list_start = ABSOLUTE(.); \ |
| 107 | KEEP(*(SORT(.u_boot_list*))); \ |
| 108 | _u_boot_list_end = ABSOLUTE(.); \ |
| 109 | } |
| 110 | |
| 111 | #define SECTION_data(_vma_, _lma_) \ |
| 112 | .data _vma_ : _lma_ \ |
| 113 | { \ |
| 114 | _data_start = ABSOLUTE(.); \ |
| 115 | *(.data) \ |
| 116 | *(.data.*) \ |
| 117 | *(.gnu.linkonce.d.*) \ |
| 118 | *(.data1) \ |
| 119 | *(.sdata) \ |
| 120 | *(.sdata.*) \ |
| 121 | *(.gnu.linkonce.s.*) \ |
| 122 | *(.sdata2) \ |
| 123 | *(.sdata2.*) \ |
| 124 | *(.gnu.linkonce.s2.*) \ |
| 125 | *(.jcr) \ |
| 126 | *(.eh_frame) \ |
| 127 | *(.dynamic) \ |
| 128 | *(.gnu.version_d) \ |
| 129 | _data_end = ABSOLUTE(.); \ |
| 130 | } |
| 131 | |
| 132 | #define SECTION_lit4(_vma_, _lma_) \ |
| 133 | .lit4 _vma_ : _lma_ \ |
| 134 | { \ |
| 135 | _lit4_start = ABSOLUTE(.); \ |
| 136 | *(*.lit4) \ |
| 137 | *(.gnu.linkonce.lit4.*) \ |
| 138 | _lit4_end = ABSOLUTE(.); \ |
| 139 | } |
| 140 | |
| 141 | #define SECTION_bss(_vma_, _lma_) \ |
| 142 | .bss _vma_ : _lma_ \ |
| 143 | { \ |
| 144 | . = ALIGN(8); \ |
| 145 | _bss_start = ABSOLUTE(.); \ |
| 146 | __bss_start = ABSOLUTE(.); \ |
| 147 | *(.dynsbss) \ |
| 148 | *(.sbss) \ |
| 149 | *(.sbss.*) \ |
| 150 | *(.gnu.linkonce.sb.*) \ |
| 151 | *(.scommon) \ |
| 152 | *(.sbss2) \ |
| 153 | *(.sbss2.*) \ |
| 154 | *(.gnu.linkonce.sb2.*) \ |
| 155 | *(.dynbss) \ |
| 156 | *(.bss) \ |
| 157 | *(.bss.*) \ |
| 158 | *(.gnu.linkonce.b.*) \ |
| 159 | *(COMMON) \ |
| 160 | *(.sram.bss) \ |
| 161 | . = ALIGN(8); \ |
| 162 | _bss_end = ABSOLUTE(.); \ |
| 163 | __bss_end = ABSOLUTE(.); \ |
| 164 | _end = ALIGN(0x8); \ |
| 165 | PROVIDE(end = ALIGN(0x8)); \ |
| 166 | _stack_sentry = ALIGN(0x8); \ |
| 167 | } |
| 168 | |
| 169 | #define SECTION_debug \ |
| 170 | .debug 0 : { *(.debug) } \ |
| 171 | .line 0 : { *(.line) } \ |
| 172 | .debug_srcinfo 0 : { *(.debug_srcinfo) } \ |
| 173 | .debug_sfnames 0 : { *(.debug_sfnames) } \ |
| 174 | .debug_aranges 0 : { *(.debug_aranges) } \ |
| 175 | .debug_pubnames 0 : { *(.debug_pubnames) } \ |
| 176 | .debug_info 0 : { *(.debug_info) } \ |
| 177 | .debug_abbrev 0 : { *(.debug_abbrev) } \ |
| 178 | .debug_line 0 : { *(.debug_line) } \ |
| 179 | .debug_frame 0 : { *(.debug_frame) } \ |
| 180 | .debug_str 0 : { *(.debug_str) } \ |
| 181 | .debug_loc 0 : { *(.debug_loc) } \ |
| 182 | .debug_macinfo 0 : { *(.debug_macinfo) } \ |
| 183 | .debug_weaknames 0 : { *(.debug_weaknames) } \ |
| 184 | .debug_funcnames 0 : { *(.debug_funcnames) } \ |
| 185 | .debug_typenames 0 : { *(.debug_typenames) } \ |
| 186 | .debug_varnames 0 : { *(.debug_varnames) } |
| 187 | |
| 188 | #define SECTION_xtensa \ |
| 189 | .xt.insn 0 : \ |
| 190 | { \ |
| 191 | KEEP (*(.xt.insn)) \ |
| 192 | KEEP (*(.gnu.linkonce.x.*)) \ |
| 193 | } \ |
| 194 | .xt.prop 0 : \ |
| 195 | { \ |
| 196 | KEEP (*(.xt.prop)) \ |
| 197 | KEEP (*(.xt.prop.*)) \ |
| 198 | KEEP (*(.gnu.linkonce.prop.*)) \ |
| 199 | } \ |
| 200 | .xt.lit 0 : \ |
| 201 | { \ |
| 202 | KEEP (*(.xt.lit)) \ |
| 203 | KEEP (*(.xt.lit.*)) \ |
| 204 | KEEP (*(.gnu.linkonce.p.*)) \ |
| 205 | } \ |
| 206 | .xt.profile_range 0 : \ |
| 207 | { \ |
| 208 | KEEP (*(.xt.profile_range)) \ |
| 209 | KEEP (*(.gnu.linkonce.profile_range.*)) \ |
| 210 | } \ |
| 211 | .xt.profile_ranges 0 : \ |
| 212 | { \ |
| 213 | KEEP (*(.xt.profile_ranges)) \ |
| 214 | KEEP (*(.gnu.linkonce.xt.profile_ranges.*)) \ |
| 215 | } \ |
| 216 | .xt.profile_files 0 : \ |
| 217 | { \ |
| 218 | KEEP (*(.xt.profile_files)) \ |
| 219 | KEEP (*(.gnu.linkonce.xt.profile_files.*)) \ |
| 220 | } |
| 221 | |
| 222 | #endif /* _XTENSA_LDSCRIPT_H */ |