Project

General

Profile

RE: U-Boot with large uImage containing initramfs ยป vmlinux.lds.S

Nicholas Crast, 08/28/2014 12:42 PM

 
1
/* ld script to make ARM Linux kernel
2
 * taken from the i386 version by Russell King
3
 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
4
 */
5

    
6
#include <asm-generic/vmlinux.lds.h>
7
#include <asm/cache.h>
8
#include <asm/thread_info.h>
9
#include <asm/memory.h>
10
#include <asm/page.h>
11
	
12
#define PROC_INFO							\
13
	. = ALIGN(4);							\
14
	VMLINUX_SYMBOL(__proc_info_begin) = .;				\
15
	*(.proc.info.init)						\
16
	VMLINUX_SYMBOL(__proc_info_end) = .;
17

    
18
#define IDMAP_TEXT							\
19
	ALIGN_FUNCTION();						\
20
	VMLINUX_SYMBOL(__idmap_text_start) = .;				\
21
	*(.idmap.text)							\
22
	VMLINUX_SYMBOL(__idmap_text_end) = .;				\
23
	. = ALIGN(32);							\
24
	VMLINUX_SYMBOL(__hyp_idmap_text_start) = .;			\
25
	*(.hyp.idmap.text)						\
26
	VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
27

    
28
#ifdef CONFIG_HOTPLUG_CPU
29
#define ARM_CPU_DISCARD(x)
30
#define ARM_CPU_KEEP(x)		x
31
#else
32
#define ARM_CPU_DISCARD(x)	x
33
#define ARM_CPU_KEEP(x)
34
#endif
35

    
36
#if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
37
	defined(CONFIG_GENERIC_BUG)
38
#define ARM_EXIT_KEEP(x)	x
39
#define ARM_EXIT_DISCARD(x)
40
#else
41
#define ARM_EXIT_KEEP(x)
42
#define ARM_EXIT_DISCARD(x)	x
43
#endif
44

    
45
OUTPUT_ARCH(arm)
46
ENTRY(stext)
47

    
48
#ifndef __ARMEB__
49
jiffies = jiffies_64;
50
#else
51
jiffies = jiffies_64 + 4;
52
#endif
53

    
54
SECTIONS
55
{
56
	/*
57
	 * XXX: The linker does not define how output sections are
58
	 * assigned to input sections when there are multiple statements
59
	 * matching the same input section name.  There is no documented
60
	 * order of matching.
61
	 *
62
	 * unwind exit sections must be discarded before the rest of the
63
	 * unwind sections get included.
64
	 */
65
	/DISCARD/ : {
66
		*(.ARM.exidx.exit.text)
67
		*(.ARM.extab.exit.text)
68
		ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))
69
		ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))
70
		ARM_EXIT_DISCARD(EXIT_TEXT)
71
		ARM_EXIT_DISCARD(EXIT_DATA)
72
		EXIT_CALL
73
#ifndef CONFIG_MMU
74
		*(.fixup)
75
		*(__ex_table)
76
#endif
77
#ifndef CONFIG_SMP_ON_UP
78
		*(.alt.smp.init)
79
#endif
80
		*(.discard)
81
		*(.discard.*)
82
	}
83

    
84
#ifdef CONFIG_XIP_KERNEL
85
	. = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
86
#else
87
	. = PAGE_OFFSET + TEXT_OFFSET;
88
#endif
89
	.head.text : {
90
		_text = .;
91
		HEAD_TEXT
92
	}
93
	.text : {			/* Real text segment		*/
94
		_stext = .;		/* Text and read-only data	*/
95
			__exception_text_start = .;
96
			*(.exception.text)
97
			__exception_text_end = .;
98
			IRQENTRY_TEXT
99
			TEXT_TEXT
100
			SCHED_TEXT
101
			LOCK_TEXT
102
			KPROBES_TEXT
103
			IDMAP_TEXT
104
#ifdef CONFIG_MMU
105
			*(.fixup)
106
#endif
107
			*(.gnu.warning)
108
			*(.glue_7)
109
			*(.glue_7t)
110
		. = ALIGN(4);
111
		*(.got)			/* Global offset table		*/
112
			ARM_CPU_KEEP(PROC_INFO)
113
	}
114

    
115
	RO_DATA(PAGE_SIZE)
116

    
117
	. = ALIGN(4);
118
	__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
119
		__start___ex_table = .;
120
#ifdef CONFIG_MMU
121
		*(__ex_table)
122
#endif
123
		__stop___ex_table = .;
124
	}
125

    
126
#ifdef CONFIG_ARM_UNWIND
127
	/*
128
	 * Stack unwinding tables
129
	 */
130
	. = ALIGN(8);
131
	.ARM.unwind_idx : {
132
		__start_unwind_idx = .;
133
		*(.ARM.exidx*)
134
		__stop_unwind_idx = .;
135
	}
136
	.ARM.unwind_tab : {
137
		__start_unwind_tab = .;
138
		*(.ARM.extab*)
139
		__stop_unwind_tab = .;
140
	}
141
#endif
142

    
143
	NOTES
144

    
145
	_etext = .;			/* End of text and rodata section */
146

    
147
#ifndef CONFIG_XIP_KERNEL
148
	. = ALIGN(PAGE_SIZE);
149
	__init_begin = .;
150
#endif
151
	/*
152
	 * The vectors and stubs are relocatable code, and the
153
	 * only thing that matters is their relative offsets
154
	 */
155
	__vectors_start = .;
156
	.vectors 0 : AT(__vectors_start) {
157
		*(.vectors)
158
	}
159
	. = __vectors_start + SIZEOF(.vectors);
160
	__vectors_end = .;
161

    
162
	__stubs_start = .;
163
	.stubs 0x1000 : AT(__stubs_start) {
164
		*(.stubs)
165
	}
166
	. = __stubs_start + SIZEOF(.stubs);
167
	__stubs_end = .;
168

    
169
	INIT_TEXT_SECTION(8)
170
	.exit.text : {
171
		ARM_EXIT_KEEP(EXIT_TEXT)
172
	}
173
	.init.proc.info : {
174
		ARM_CPU_DISCARD(PROC_INFO)
175
	}
176
	.init.arch.info : {
177
		__arch_info_begin = .;
178
		*(.arch.info.init)
179
		__arch_info_end = .;
180
	}
181
	.init.tagtable : {
182
		__tagtable_begin = .;
183
		*(.taglist.init)
184
		__tagtable_end = .;
185
	}
186
#ifdef CONFIG_SMP_ON_UP
187
	.init.smpalt : {
188
		__smpalt_begin = .;
189
		*(.alt.smp.init)
190
		__smpalt_end = .;
191
	}
192
#endif
193
	.init.pv_table : {
194
		__pv_table_begin = .;
195
		*(.pv_table)
196
		__pv_table_end = .;
197
	}
198
	.init.data : {
199
#ifndef CONFIG_XIP_KERNEL
200
		INIT_DATA
201
#endif
202
		INIT_SETUP(16)
203
		INIT_CALLS
204
		CON_INITCALL
205
		SECURITY_INITCALL
206
	}
207
#ifndef CONFIG_XIP_KERNEL
208
	__init_begin = _stext;
209
	.exit.data : {
210
		ARM_EXIT_KEEP(EXIT_DATA)
211
	}
212
#endif
213

    
214
#ifdef CONFIG_SMP
215
	PERCPU_SECTION(L1_CACHE_BYTES)
216
#endif
217

    
218
#ifdef CONFIG_XIP_KERNEL
219
	__data_loc = ALIGN(4);		/* location in binary */
220
	. = PAGE_OFFSET + TEXT_OFFSET;
221

    
222
#else
223
	__init_end = .;
224
	. = ALIGN(THREAD_SIZE);
225
	__data_loc = .;
226
#endif
227

    
228
	.data : AT(__data_loc) {
229
		_data = .;		/* address in memory */
230
		_sdata = .;
231

    
232
		/*
233
		 * first, the init task union, aligned
234
		 * to an 8192 byte boundary.
235
		 */
236
		INIT_TASK_DATA(THREAD_SIZE)
237

    
238
#ifdef CONFIG_XIP_KERNEL
239
		. = ALIGN(PAGE_SIZE);
240
		__init_begin = .;
241
		INIT_DATA
242
		ARM_EXIT_KEEP(EXIT_DATA)
243
		. = ALIGN(PAGE_SIZE);
244
		__init_end = .;
245
#endif
246

    
247
		NOSAVE_DATA
248
		CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
249
		READ_MOSTLY_DATA(L1_CACHE_BYTES)
250

    
251
		/*
252
		 * and the usual data section
253
		 */
254
		DATA_DATA
255
		CONSTRUCTORS
256

    
257
		_edata = .;
258
	}
259
	
260
		.initramfs : {
261
		INIT_RAM_FS
262
		}
263

    
264
	_edata_loc = __data_loc + SIZEOF(.data);
265

    
266
#ifdef CONFIG_HAVE_TCM
267
        /*
268
	 * We align everything to a page boundary so we can
269
	 * free it after init has commenced and TCM contents have
270
	 * been copied to its destination.
271
	 */
272
	.tcm_start : {
273
		. = ALIGN(PAGE_SIZE);
274
		__tcm_start = .;
275
		__itcm_start = .;
276
	}
277

    
278
	/*
279
	 * Link these to the ITCM RAM
280
	 * Put VMA to the TCM address and LMA to the common RAM
281
	 * and we'll upload the contents from RAM to TCM and free
282
	 * the used RAM after that.
283
	 */
284
	.text_itcm ITCM_OFFSET : AT(__itcm_start)
285
	{
286
		__sitcm_text = .;
287
		*(.tcm.text)
288
		*(.tcm.rodata)
289
		. = ALIGN(4);
290
		__eitcm_text = .;
291
	}
292

    
293
	/*
294
	 * Reset the dot pointer, this is needed to create the
295
	 * relative __dtcm_start below (to be used as extern in code).
296
	 */
297
	. = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);
298

    
299
	.dtcm_start : {
300
		__dtcm_start = .;
301
	}
302

    
303
	/* TODO: add remainder of ITCM as well, that can be used for data! */
304
	.data_dtcm DTCM_OFFSET : AT(__dtcm_start)
305
	{
306
		. = ALIGN(4);
307
		__sdtcm_data = .;
308
		*(.tcm.data)
309
		. = ALIGN(4);
310
		__edtcm_data = .;
311
	}
312

    
313
	/* Reset the dot pointer or the linker gets confused */
314
	. = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);
315

    
316
	/* End marker for freeing TCM copy in linked object */
317
	.tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
318
		. = ALIGN(PAGE_SIZE);
319
		__tcm_end = .;
320
	}
321
#endif
322

    
323
	BSS_SECTION(0, 0, 0)
324
	_end = .;
325

    
326
	STABS_DEBUG
327
	.comment 0 : { *(.comment) }
328
}
329

    
330
/*
331
 * These must never be empty
332
 * If you have to comment these two assert statements out, your
333
 * binutils is too old (for other reasons as well)
334
 */
335
ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
336
ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
337
/*
338
 * The HYP init code can't be more than a page long.
339
 * The above comment applies as well.
340
 */
341
ASSERT(((__hyp_idmap_text_end - __hyp_idmap_text_start) <= PAGE_SIZE), "HYP init code too big")
    (1-1/1)
    Go to top
    Add picture from clipboard (Maximum size: 1 GB)