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#ifdef CONFIG_XIP_KERNEL
11#include "vmlinux-xip.lds.S"
12#else
13
14#include <asm/pgtable.h>
15#define LOAD_OFFSET KERNEL_LINK_ADDR
16
17#include <asm/vmlinux.lds.h>
18#include <asm/page.h>
19#include <asm/cache.h>
20#include <asm/thread_info.h>
21#include <asm/set_memory.h>
22#include "image-vars.h"
23
24#include <linux/sizes.h>
25OUTPUT_ARCH(riscv)
26ENTRY(_start)
27
28jiffies = jiffies_64;
29
30PECOFF_SECTION_ALIGNMENT = 0x1000;
31PECOFF_FILE_ALIGNMENT = 0x200;
32
33SECTIONS
34{
35	/* Beginning of code and text segment */
36	. = LOAD_OFFSET;
37	_start = .;
38	HEAD_TEXT_SECTION
39	. = ALIGN(PAGE_SIZE);
40
41	.text : {
42		_text = .;
43		_stext = .;
44		TEXT_TEXT
45		SCHED_TEXT
46		LOCK_TEXT
47		KPROBES_TEXT
48		ENTRY_TEXT
49		IRQENTRY_TEXT
50		SOFTIRQENTRY_TEXT
51		_etext = .;
52	}
53
54	. = ALIGN(SECTION_ALIGN);
55	__init_begin = .;
56	__init_text_begin = .;
57	.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) ALIGN(SECTION_ALIGN) { \
58		_sinittext = .;						\
59		INIT_TEXT						\
60		_einittext = .;						\
61	}
62
63	. = ALIGN(8);
64	__soc_early_init_table : {
65		__soc_early_init_table_start = .;
66		KEEP(*(__soc_early_init_table))
67		__soc_early_init_table_end = .;
68	}
69	__soc_builtin_dtb_table : {
70		__soc_builtin_dtb_table_start = .;
71		KEEP(*(__soc_builtin_dtb_table))
72		__soc_builtin_dtb_table_end = .;
73	}
74	/* we have to discard exit text and such at runtime, not link time */
75	.exit.text :
76	{
77		EXIT_TEXT
78	}
79
80	__init_text_end = .;
81	. = ALIGN(SECTION_ALIGN);
82#ifdef CONFIG_EFI
83	. = ALIGN(PECOFF_SECTION_ALIGNMENT);
84	__pecoff_text_end = .;
85#endif
86	/* Start of init data section */
87	__init_data_begin = .;
88	INIT_DATA_SECTION(16)
89	.init.bss : {
90		*(.init.bss)	/* from the EFI stub */
91	}
92	.exit.data :
93	{
94		EXIT_DATA
95	}
96	PERCPU_SECTION(L1_CACHE_BYTES)
97
98	.rel.dyn : {
99		*(.rel.dyn*)
100	}
101
102	.rela.dyn : {
103		*(.rela*)
104	}
105
106	__init_data_end = .;
107
108	. = ALIGN(8);
109	.alternative : {
110		__alt_start = .;
111		*(.alternative)
112		__alt_end = .;
113	}
114	__init_end = .;
115
116	/* Start of data section */
117	_sdata = .;
118	RO_DATA(SECTION_ALIGN)
119	.srodata : {
120		*(.srodata*)
121	}
122
123	. = ALIGN(SECTION_ALIGN);
124	_data = .;
125
126	RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_ALIGN)
127	.sdata : {
128		__global_pointer$ = . + 0x800;
129		*(.sdata*)
130	}
131
132#ifdef CONFIG_EFI
133	.pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); }
134	__pecoff_data_raw_size = ABSOLUTE(. - __pecoff_text_end);
135#endif
136
137	/* End of data section */
138	_edata = .;
139
140	BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0)
141
142#ifdef CONFIG_EFI
143	. = ALIGN(PECOFF_SECTION_ALIGNMENT);
144	__pecoff_data_virt_size = ABSOLUTE(. - __pecoff_text_end);
145#endif
146	_end = .;
147
148	STABS_DEBUG
149	DWARF_DEBUG
150	ELF_DETAILS
151	.riscv.attributes 0 : { *(.riscv.attributes) }
152
153	DISCARDS
154}
155#endif /* CONFIG_XIP_KERNEL */
156