xref: /OK3568_Linux_fs/u-boot/arch/xtensa/include/asm/ldscript.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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