xref: /linux/arch/riscv/kernel/vmlinux.lds.S (revision feff82eb5f4075d541990d0ba60dad14ea83ea9b)
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2012 Regents of the University of California
4 * Copyright (C) 2017 SiFive
5 */
6
7#define RO_EXCEPTION_TABLE_ALIGN	4
8#define RUNTIME_DISCARD_EXIT
9
10#include <asm/pgtable.h>
11#define LOAD_OFFSET KERNEL_LINK_ADDR
12
13#include <asm/vmlinux.lds.h>
14#include <asm/page.h>
15#include <asm/cache.h>
16#include <asm/thread_info.h>
17#include <asm/set_memory.h>
18#include "image-vars.h"
19
20#include <linux/sizes.h>
21OUTPUT_ARCH(riscv)
22ENTRY(_start)
23
24jiffies = jiffies_64;
25
26SECTIONS
27{
28	/* Beginning of code and text segment */
29	. = LOAD_OFFSET;
30	_start = .;
31	HEAD_TEXT_SECTION
32	. = ALIGN(PAGE_SIZE);
33
34	.text : {
35		_text = .;
36		_stext = .;
37		TEXT_TEXT
38		SCHED_TEXT
39		LOCK_TEXT
40		KPROBES_TEXT
41		ENTRY_TEXT
42		IRQENTRY_TEXT
43		SOFTIRQENTRY_TEXT
44		_etext = .;
45	}
46
47	. = ALIGN(SECTION_ALIGN);
48	__init_begin = .;
49	__init_text_begin = .;
50	.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) ALIGN(SECTION_ALIGN) { \
51		_sinittext = .;						\
52		INIT_TEXT						\
53		_einittext = .;						\
54	}
55
56	. = ALIGN(8);
57	__soc_early_init_table : {
58		__soc_early_init_table_start = .;
59		KEEP(*(__soc_early_init_table))
60		__soc_early_init_table_end = .;
61	}
62	__soc_builtin_dtb_table : {
63		__soc_builtin_dtb_table_start = .;
64		KEEP(*(__soc_builtin_dtb_table))
65		__soc_builtin_dtb_table_end = .;
66	}
67	/* we have to discard exit text and such at runtime, not link time */
68	__exittext_begin = .;
69	.exit.text :
70	{
71		EXIT_TEXT
72	}
73	__exittext_end = .;
74
75	__init_text_end = .;
76	. = ALIGN(SECTION_ALIGN);
77#ifdef CONFIG_EFI
78	. = ALIGN(PECOFF_SECTION_ALIGNMENT);
79	__pecoff_text_end = .;
80#endif
81	/* Start of init data section */
82	__init_data_begin = .;
83	INIT_DATA_SECTION(16)
84
85	.init.pi : {
86		KEEP(*(.init.pi*))
87	}
88
89	.init.bss : {
90		KEEP(*(.init.bss*))	/* from the EFI stub */
91	}
92	.exit.data :
93	{
94		EXIT_DATA
95	}
96
97	RUNTIME_CONST_VARIABLES
98
99	PERCPU_SECTION(L1_CACHE_BYTES)
100
101	.rel.dyn : {
102		*(.rel.dyn*)
103	}
104
105	.rela.dyn : ALIGN(8) {
106		__rela_dyn_start = .;
107		*(.rela .rela*)
108		__rela_dyn_end = .;
109	}
110
111	__init_data_end = .;
112
113	. = ALIGN(8);
114	.alternative : {
115		__alt_start = .;
116		KEEP(*(.alternative))
117		__alt_end = .;
118	}
119	__init_end = .;
120
121	/* Start of data section */
122	_sdata = .;
123	RO_DATA(SECTION_ALIGN)
124	.srodata : {
125		*(.srodata*)
126	}
127
128	. = ALIGN(SECTION_ALIGN);
129	_data = .;
130
131	RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_ALIGN)
132	.sdata : {
133		__global_pointer$ = . + 0x800;
134		*(.sdata*)
135	}
136
137	.got : { *(.got*) }
138
139#ifdef CONFIG_RELOCATABLE
140	.data.rel : { *(.data.rel*) }
141	.plt : { *(.plt) }
142	.dynamic : { *(.dynamic) }
143	.dynsym : { *(.dynsym) }
144	.dynstr : { *(.dynstr) }
145	.hash : { *(.hash) }
146	.gnu.hash : { *(.gnu.hash) }
147#endif
148
149#ifdef CONFIG_EFI
150	.pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); }
151	__pecoff_data_raw_size = ABSOLUTE(. - __pecoff_text_end);
152	__pecoff_data_raw_end = ABSOLUTE(.);
153#endif
154
155	/* End of data section */
156	_edata = .;
157
158	BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0)
159
160#ifdef CONFIG_EFI
161	. = ALIGN(PECOFF_SECTION_ALIGNMENT);
162	__pecoff_data_virt_size = ABSOLUTE(. - __pecoff_text_end);
163	__pecoff_data_virt_end = ABSOLUTE(.);
164#endif
165	_end = .;
166
167	STABS_DEBUG
168	DWARF_DEBUG
169	MODINFO
170	ELF_DETAILS
171	.riscv.attributes 0 : { *(.riscv.attributes) }
172
173	DISCARDS
174}
175