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