mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-16 09:48:16 +00:00
223 lines
6.3 KiB
C
223 lines
6.3 KiB
C
|
/*
|
||
|
* (C) Copyright 2007 Tensilica, Inc.
|
||
|
* (C) Copyright 2014 - 2016 Cadence Design Systems Inc.
|
||
|
*
|
||
|
* SPDX-License-Identifier: GPL-2.0+
|
||
|
*/
|
||
|
|
||
|
#ifndef _XTENSA_LDSCRIPT_H
|
||
|
#define _XTENSA_LDSCRIPT_H
|
||
|
|
||
|
/*
|
||
|
* This linker script is pre-processed with CPP to avoid hard-coding
|
||
|
* addresses that depend on the Xtensa core configuration, because
|
||
|
* this FPGA board can be used with a huge variety of Xtensa cores.
|
||
|
*/
|
||
|
|
||
|
#include <asm/arch/core.h>
|
||
|
#include <asm/addrspace.h>
|
||
|
|
||
|
#define ALIGN_LMA 4
|
||
|
#define LMA_EQ_VMA
|
||
|
#define FORCE_OUTPUT . = .
|
||
|
#define FOLLOWING(sec) \
|
||
|
AT(((LOADADDR(sec) + SIZEOF(sec) + ALIGN_LMA-1)) & ~(ALIGN_LMA-1))
|
||
|
|
||
|
/*
|
||
|
* Specify an output section that will be added to the ROM store table
|
||
|
* (PACKED_SECTION) or one that will be resident in ROM (RESIDENT_SECTION).
|
||
|
* 'symname' is a base name for section boundary symbols *_start & *_end.
|
||
|
* 'lma' is the load address at which a section will be packed in ROM.
|
||
|
* 'region' is the basename identifying a memory region and program header.
|
||
|
* 'keep' prevents removal of empty sections (must be 'KEEP' or 'NOKEEP').
|
||
|
*/
|
||
|
|
||
|
#define RELOCATE1(_sec_) \
|
||
|
LONG(_##_sec_##_start); \
|
||
|
LONG(_##_sec_##_end); \
|
||
|
LONG(LOADADDR(.##_sec_));
|
||
|
|
||
|
#define RELOCATE2(_sym_, _sec_) \
|
||
|
LONG(_##_sym_##_##_sec_##_start); \
|
||
|
LONG(_##_sym_##_##_sec_##_end); \
|
||
|
LONG(LOADADDR(.##_sym_##.##_sec_));
|
||
|
|
||
|
#define SECTION_VECTOR(_sym_, _sec_, _vma_, _lma_) \
|
||
|
.##_sym_##.##_sec_ _vma_ : _lma_ \
|
||
|
{ \
|
||
|
. = ALIGN(4); \
|
||
|
_##_sym_##_##_sec_##_start = ABSOLUTE(.); \
|
||
|
KEEP(*(.##_sym_##.##_sec_)) \
|
||
|
_##_sym_##_##_sec_##_end = ABSOLUTE(.); \
|
||
|
}
|
||
|
|
||
|
/* In MMU configs there are two aliases of SYSROM, cached and uncached.
|
||
|
* For various reasons it is simpler to use the uncached mapping for load
|
||
|
* addresses, so ROM sections end up contiguous with the reset vector and
|
||
|
* we get a compact binary image. However we can gain performance by doing
|
||
|
* the unpacking from the cached ROM mapping. So we adjust all the load
|
||
|
* addresses in the ROM store table with an offset to the cached mapping,
|
||
|
* including the symbols referring to the ROM store table itself.
|
||
|
*/
|
||
|
|
||
|
#define SECTION_ResetVector(_vma_, _lma_) \
|
||
|
.ResetVector.text _vma_ : _lma_ \
|
||
|
{ \
|
||
|
FORCE_OUTPUT; \
|
||
|
KEEP(*(.ResetVector.text)); \
|
||
|
KEEP(*(.reset.literal .reset.text)) \
|
||
|
}
|
||
|
|
||
|
#define SECTION_text(_vma_, _lma_) \
|
||
|
.text _vma_ : _lma_ \
|
||
|
{ \
|
||
|
_text_start = ABSOLUTE(.); \
|
||
|
*(.literal .text) \
|
||
|
*(.literal.* .text.* .stub) \
|
||
|
*(.gnu.warning .gnu.linkonce.literal.*) \
|
||
|
*(.gnu.linkonce.t.*.literal .gnu.linkonce.t.*) \
|
||
|
*(.fini.literal) \
|
||
|
*(.fini) \
|
||
|
*(.gnu.version) \
|
||
|
_text_end = ABSOLUTE(.); \
|
||
|
}
|
||
|
|
||
|
#define SECTION_rodata(_vma_, _lma_) \
|
||
|
.rodata _vma_ : _lma_ \
|
||
|
{ \
|
||
|
_rodata_start = ABSOLUTE(.); \
|
||
|
*(.rodata) \
|
||
|
*(.rodata.*) \
|
||
|
*(.dtb.init.rodata) \
|
||
|
*(.gnu.linkonce.r.*) \
|
||
|
*(.rodata1) \
|
||
|
__XT_EXCEPTION_TABLE__ = ABSOLUTE(.); \
|
||
|
*(.xt_except_table) \
|
||
|
*(.gcc_except_table) \
|
||
|
*(.gnu.linkonce.e.*) \
|
||
|
*(.gnu.version_r) \
|
||
|
. = ALIGN(16); \
|
||
|
_rodata_end = ABSOLUTE(.); \
|
||
|
}
|
||
|
|
||
|
#define SECTION_u_boot_list(_vma_, _lma_) \
|
||
|
.u_boot_list _vma_ : _lma_ \
|
||
|
{ \
|
||
|
_u_boot_list_start = ABSOLUTE(.); \
|
||
|
KEEP(*(SORT(.u_boot_list*))); \
|
||
|
_u_boot_list_end = ABSOLUTE(.); \
|
||
|
}
|
||
|
|
||
|
#define SECTION_data(_vma_, _lma_) \
|
||
|
.data _vma_ : _lma_ \
|
||
|
{ \
|
||
|
_data_start = ABSOLUTE(.); \
|
||
|
*(.data) \
|
||
|
*(.data.*) \
|
||
|
*(.gnu.linkonce.d.*) \
|
||
|
*(.data1) \
|
||
|
*(.sdata) \
|
||
|
*(.sdata.*) \
|
||
|
*(.gnu.linkonce.s.*) \
|
||
|
*(.sdata2) \
|
||
|
*(.sdata2.*) \
|
||
|
*(.gnu.linkonce.s2.*) \
|
||
|
*(.jcr) \
|
||
|
*(.eh_frame) \
|
||
|
*(.dynamic) \
|
||
|
*(.gnu.version_d) \
|
||
|
_data_end = ABSOLUTE(.); \
|
||
|
}
|
||
|
|
||
|
#define SECTION_lit4(_vma_, _lma_) \
|
||
|
.lit4 _vma_ : _lma_ \
|
||
|
{ \
|
||
|
_lit4_start = ABSOLUTE(.); \
|
||
|
*(*.lit4) \
|
||
|
*(.gnu.linkonce.lit4.*) \
|
||
|
_lit4_end = ABSOLUTE(.); \
|
||
|
}
|
||
|
|
||
|
#define SECTION_bss(_vma_, _lma_) \
|
||
|
.bss _vma_ : _lma_ \
|
||
|
{ \
|
||
|
. = ALIGN(8); \
|
||
|
_bss_start = ABSOLUTE(.); \
|
||
|
__bss_start = ABSOLUTE(.); \
|
||
|
*(.dynsbss) \
|
||
|
*(.sbss) \
|
||
|
*(.sbss.*) \
|
||
|
*(.gnu.linkonce.sb.*) \
|
||
|
*(.scommon) \
|
||
|
*(.sbss2) \
|
||
|
*(.sbss2.*) \
|
||
|
*(.gnu.linkonce.sb2.*) \
|
||
|
*(.dynbss) \
|
||
|
*(.bss) \
|
||
|
*(.bss.*) \
|
||
|
*(.gnu.linkonce.b.*) \
|
||
|
*(COMMON) \
|
||
|
*(.sram.bss) \
|
||
|
. = ALIGN(8); \
|
||
|
_bss_end = ABSOLUTE(.); \
|
||
|
__bss_end = ABSOLUTE(.); \
|
||
|
_end = ALIGN(0x8); \
|
||
|
PROVIDE(end = ALIGN(0x8)); \
|
||
|
_stack_sentry = ALIGN(0x8); \
|
||
|
}
|
||
|
|
||
|
#define SECTION_debug \
|
||
|
.debug 0 : { *(.debug) } \
|
||
|
.line 0 : { *(.line) } \
|
||
|
.debug_srcinfo 0 : { *(.debug_srcinfo) } \
|
||
|
.debug_sfnames 0 : { *(.debug_sfnames) } \
|
||
|
.debug_aranges 0 : { *(.debug_aranges) } \
|
||
|
.debug_pubnames 0 : { *(.debug_pubnames) } \
|
||
|
.debug_info 0 : { *(.debug_info) } \
|
||
|
.debug_abbrev 0 : { *(.debug_abbrev) } \
|
||
|
.debug_line 0 : { *(.debug_line) } \
|
||
|
.debug_frame 0 : { *(.debug_frame) } \
|
||
|
.debug_str 0 : { *(.debug_str) } \
|
||
|
.debug_loc 0 : { *(.debug_loc) } \
|
||
|
.debug_macinfo 0 : { *(.debug_macinfo) } \
|
||
|
.debug_weaknames 0 : { *(.debug_weaknames) } \
|
||
|
.debug_funcnames 0 : { *(.debug_funcnames) } \
|
||
|
.debug_typenames 0 : { *(.debug_typenames) } \
|
||
|
.debug_varnames 0 : { *(.debug_varnames) }
|
||
|
|
||
|
#define SECTION_xtensa \
|
||
|
.xt.insn 0 : \
|
||
|
{ \
|
||
|
KEEP (*(.xt.insn)) \
|
||
|
KEEP (*(.gnu.linkonce.x.*)) \
|
||
|
} \
|
||
|
.xt.prop 0 : \
|
||
|
{ \
|
||
|
KEEP (*(.xt.prop)) \
|
||
|
KEEP (*(.xt.prop.*)) \
|
||
|
KEEP (*(.gnu.linkonce.prop.*)) \
|
||
|
} \
|
||
|
.xt.lit 0 : \
|
||
|
{ \
|
||
|
KEEP (*(.xt.lit)) \
|
||
|
KEEP (*(.xt.lit.*)) \
|
||
|
KEEP (*(.gnu.linkonce.p.*)) \
|
||
|
} \
|
||
|
.xt.profile_range 0 : \
|
||
|
{ \
|
||
|
KEEP (*(.xt.profile_range)) \
|
||
|
KEEP (*(.gnu.linkonce.profile_range.*)) \
|
||
|
} \
|
||
|
.xt.profile_ranges 0 : \
|
||
|
{ \
|
||
|
KEEP (*(.xt.profile_ranges)) \
|
||
|
KEEP (*(.gnu.linkonce.xt.profile_ranges.*)) \
|
||
|
} \
|
||
|
.xt.profile_files 0 : \
|
||
|
{ \
|
||
|
KEEP (*(.xt.profile_files)) \
|
||
|
KEEP (*(.gnu.linkonce.xt.profile_files.*)) \
|
||
|
}
|
||
|
|
||
|
#endif /* _XTENSA_LDSCRIPT_H */
|