xref: /openbmc/linux/arch/riscv/kernel/vmlinux.lds.S (revision 2bfc6cd81bd17e4306e24ee47b9554c967bcb499)
150acfb2bSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
2fbe934d6SPalmer Dabbelt/*
3fbe934d6SPalmer Dabbelt * Copyright (C) 2012 Regents of the University of California
4fbe934d6SPalmer Dabbelt * Copyright (C) 2017 SiFive
5fbe934d6SPalmer Dabbelt */
6fbe934d6SPalmer Dabbelt
7*2bfc6cd8SAlexandre Ghiti#include <asm/pgtable.h>
8*2bfc6cd8SAlexandre Ghiti#define LOAD_OFFSET KERNEL_LINK_ADDR
9fbe934d6SPalmer Dabbelt#include <asm/vmlinux.lds.h>
10fbe934d6SPalmer Dabbelt#include <asm/page.h>
11fbe934d6SPalmer Dabbelt#include <asm/cache.h>
12fbe934d6SPalmer Dabbelt#include <asm/thread_info.h>
1300cb41d5SZong Li#include <asm/set_memory.h>
14cb7d2dd5SAtish Patra#include "image-vars.h"
15fbe934d6SPalmer Dabbelt
16e011995eSAtish Patra#include <linux/sizes.h>
17fbe934d6SPalmer DabbeltOUTPUT_ARCH(riscv)
18fbe934d6SPalmer DabbeltENTRY(_start)
19fbe934d6SPalmer Dabbelt
20fbe934d6SPalmer Dabbeltjiffies = jiffies_64;
21fbe934d6SPalmer Dabbelt
22cb7d2dd5SAtish PatraPECOFF_SECTION_ALIGNMENT = 0x1000;
23cb7d2dd5SAtish PatraPECOFF_FILE_ALIGNMENT = 0x200;
24cb7d2dd5SAtish Patra
25fbe934d6SPalmer DabbeltSECTIONS
26fbe934d6SPalmer Dabbelt{
27fbe934d6SPalmer Dabbelt	/* Beginning of code and text segment */
28fbe934d6SPalmer Dabbelt	. = LOAD_OFFSET;
29fbe934d6SPalmer Dabbelt	_start = .;
30fbe934d6SPalmer Dabbelt	HEAD_TEXT_SECTION
31e011995eSAtish Patra	. = ALIGN(PAGE_SIZE);
32e011995eSAtish Patra
3319a00869SAtish Patra	.text : {
3419a00869SAtish Patra		_text = .;
3519a00869SAtish Patra		_stext = .;
3619a00869SAtish Patra		TEXT_TEXT
3719a00869SAtish Patra		SCHED_TEXT
3819a00869SAtish Patra		CPUIDLE_TEXT
3919a00869SAtish Patra		LOCK_TEXT
4019a00869SAtish Patra		KPROBES_TEXT
4119a00869SAtish Patra		ENTRY_TEXT
4219a00869SAtish Patra		IRQENTRY_TEXT
4319a00869SAtish Patra		SOFTIRQENTRY_TEXT
4419a00869SAtish Patra		*(.fixup)
4519a00869SAtish Patra		_etext = .;
4619a00869SAtish Patra	}
4719a00869SAtish Patra
4819a00869SAtish Patra	. = ALIGN(SECTION_ALIGN);
49e011995eSAtish Patra	__init_begin = .;
50b6566dc1SAtish Patra	__init_text_begin = .;
51b6566dc1SAtish Patra	.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) ALIGN(SECTION_ALIGN) { \
52b6566dc1SAtish Patra		_sinittext = .;						\
53b6566dc1SAtish Patra		INIT_TEXT						\
54b6566dc1SAtish Patra		_einittext = .;						\
55b6566dc1SAtish Patra	}
56b6566dc1SAtish Patra
57335b1390SDamien Le Moal	. = ALIGN(8);
58335b1390SDamien Le Moal	__soc_early_init_table : {
59335b1390SDamien Le Moal		__soc_early_init_table_start = .;
60335b1390SDamien Le Moal		KEEP(*(__soc_early_init_table))
61335b1390SDamien Le Moal		__soc_early_init_table_end = .;
62335b1390SDamien Le Moal	}
632d268251SPalmer Dabbelt	__soc_builtin_dtb_table : {
642d268251SPalmer Dabbelt		__soc_builtin_dtb_table_start = .;
652d268251SPalmer Dabbelt		KEEP(*(__soc_builtin_dtb_table))
662d268251SPalmer Dabbelt		__soc_builtin_dtb_table_end = .;
672d268251SPalmer Dabbelt	}
68fbe934d6SPalmer Dabbelt	/* we have to discard exit text and such at runtime, not link time */
69fbe934d6SPalmer Dabbelt	.exit.text :
70fbe934d6SPalmer Dabbelt	{
71fbe934d6SPalmer Dabbelt		EXIT_TEXT
72fbe934d6SPalmer Dabbelt	}
7319a00869SAtish Patra
7419a00869SAtish Patra	__init_text_end = .;
7519a00869SAtish Patra	. = ALIGN(SECTION_ALIGN);
7619a00869SAtish Patra#ifdef CONFIG_EFI
7719a00869SAtish Patra	. = ALIGN(PECOFF_SECTION_ALIGNMENT);
7819a00869SAtish Patra	__pecoff_text_end = .;
7919a00869SAtish Patra#endif
8019a00869SAtish Patra	/* Start of init data section */
8119a00869SAtish Patra	__init_data_begin = .;
8219a00869SAtish Patra	INIT_DATA_SECTION(16)
83fbe934d6SPalmer Dabbelt	.exit.data :
84fbe934d6SPalmer Dabbelt	{
85fbe934d6SPalmer Dabbelt		EXIT_DATA
86fbe934d6SPalmer Dabbelt	}
87fbe934d6SPalmer Dabbelt	PERCPU_SECTION(L1_CACHE_BYTES)
8819a00869SAtish Patra
89b5b11a8aSAtish Patra	.rel.dyn : {
90b5b11a8aSAtish Patra		*(.rel.dyn*)
91b5b11a8aSAtish Patra	}
92b5b11a8aSAtish Patra
9319a00869SAtish Patra	__init_data_end = .;
946f4eea90SVincent Chen
956f4eea90SVincent Chen	. = ALIGN(8);
966f4eea90SVincent Chen	.alternative : {
976f4eea90SVincent Chen		__alt_start = .;
986f4eea90SVincent Chen		*(.alternative)
996f4eea90SVincent Chen		__alt_end = .;
1006f4eea90SVincent Chen	}
101fbe934d6SPalmer Dabbelt	__init_end = .;
102fbe934d6SPalmer Dabbelt
103fbe934d6SPalmer Dabbelt	/* Start of data section */
104fbe934d6SPalmer Dabbelt	_sdata = .;
10500cb41d5SZong Li	RO_DATA(SECTION_ALIGN)
106fbe934d6SPalmer Dabbelt	.srodata : {
107fbe934d6SPalmer Dabbelt		*(.srodata*)
108fbe934d6SPalmer Dabbelt	}
109fbe934d6SPalmer Dabbelt
110bd3d914dSZong Li	EXCEPTION_TABLE(0x10)
111bd3d914dSZong Li
11200cb41d5SZong Li	. = ALIGN(SECTION_ALIGN);
113bd3d914dSZong Li	_data = .;
114bd3d914dSZong Li
115c9174047SKees Cook	RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
116fbe934d6SPalmer Dabbelt	.sdata : {
117fbe934d6SPalmer Dabbelt		__global_pointer$ = . + 0x800;
118fbe934d6SPalmer Dabbelt		*(.sdata*)
119cb7d2dd5SAtish Patra	}
120cb7d2dd5SAtish Patra
121cb7d2dd5SAtish Patra#ifdef CONFIG_EFI
122cb7d2dd5SAtish Patra	.pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); }
123cb7d2dd5SAtish Patra	__pecoff_data_raw_size = ABSOLUTE(. - __pecoff_text_end);
124cb7d2dd5SAtish Patra#endif
125cb7d2dd5SAtish Patra
126fbe934d6SPalmer Dabbelt	/* End of data section */
127fbe934d6SPalmer Dabbelt	_edata = .;
128fbe934d6SPalmer Dabbelt
12941fb9d54SPalmer Dabbelt	BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0)
13041fb9d54SPalmer Dabbelt
131cb7d2dd5SAtish Patra#ifdef CONFIG_EFI
132cb7d2dd5SAtish Patra	. = ALIGN(PECOFF_SECTION_ALIGNMENT);
133cb7d2dd5SAtish Patra	__pecoff_data_virt_size = ABSOLUTE(. - __pecoff_text_end);
134cb7d2dd5SAtish Patra#endif
135fbe934d6SPalmer Dabbelt	_end = .;
136fbe934d6SPalmer Dabbelt
137fbe934d6SPalmer Dabbelt	STABS_DEBUG
138fbe934d6SPalmer Dabbelt	DWARF_DEBUG
139c604abc3SKees Cook	ELF_DETAILS
140fbe934d6SPalmer Dabbelt
141fbe934d6SPalmer Dabbelt	DISCARDS
142fbe934d6SPalmer Dabbelt}
143