xref: /linux/arch/s390/boot/vmlinux.lds.S (revision 00cda11d)
1edd4a866SHeiko Carstens/* SPDX-License-Identifier: GPL-2.0 */
2edd4a866SHeiko Carstens#include <asm-generic/vmlinux.lds.h>
3edd4a866SHeiko Carstens#include <asm/vmlinux.lds.h>
4edd4a866SHeiko Carstens#include <asm/thread_info.h>
5edd4a866SHeiko Carstens#include <asm/page.h>
6edd4a866SHeiko Carstens#include <asm/sclp.h>
7834979c2SHeiko Carstens#include "boot.h"
8edd4a866SHeiko Carstens
9edd4a866SHeiko CarstensOUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
10edd4a866SHeiko CarstensOUTPUT_ARCH(s390:64-bit)
11edd4a866SHeiko Carstens
12edd4a866SHeiko CarstensENTRY(startup)
13edd4a866SHeiko Carstens
14edd4a866SHeiko CarstensSECTIONS
15edd4a866SHeiko Carstens{
16edd4a866SHeiko Carstens	. = 0;
17834979c2SHeiko Carstens	.ipldata : {
18834979c2SHeiko Carstens		*(.ipldata)
19834979c2SHeiko Carstens	}
20834979c2SHeiko Carstens	. = IPL_START;
21edd4a866SHeiko Carstens	.head.text : {
22edd4a866SHeiko Carstens		_head = . ;
23edd4a866SHeiko Carstens		HEAD_TEXT
24edd4a866SHeiko Carstens		_ehead = . ;
25edd4a866SHeiko Carstens	}
26f84d88edSHeiko Carstens	. = PARMAREA;
27f84d88edSHeiko Carstens	.parmarea : {
28f84d88edSHeiko Carstens		*(.parmarea)
29f84d88edSHeiko Carstens	}
30edd4a866SHeiko Carstens	.text :	{
31edd4a866SHeiko Carstens		_text = .;	/* Text */
32edd4a866SHeiko Carstens		*(.text)
33edd4a866SHeiko Carstens		*(.text.*)
34b23ab303SNathan Chancellor		INIT_TEXT
35edd4a866SHeiko Carstens		_etext = . ;
36edd4a866SHeiko Carstens	}
37edd4a866SHeiko Carstens	.rodata : {
38edd4a866SHeiko Carstens		_rodata = . ;
39edd4a866SHeiko Carstens		*(.rodata)	 /* read-only data */
40edd4a866SHeiko Carstens		*(.rodata.*)
41edd4a866SHeiko Carstens		_erodata = . ;
42edd4a866SHeiko Carstens	}
4330226853SNathan Chancellor	.got : {
4430226853SNathan Chancellor		*(.got)
4530226853SNathan Chancellor	}
46edd4a866SHeiko Carstens	NOTES
47edd4a866SHeiko Carstens	.data :	{
48edd4a866SHeiko Carstens		_data = . ;
49edd4a866SHeiko Carstens		*(.data)
50edd4a866SHeiko Carstens		*(.data.*)
51edd4a866SHeiko Carstens		_edata = . ;
52edd4a866SHeiko Carstens	}
53edd4a866SHeiko Carstens
54edd4a866SHeiko Carstens	BOOT_DATA
55edd4a866SHeiko Carstens	BOOT_DATA_PRESERVED
56edd4a866SHeiko Carstens
57edd4a866SHeiko Carstens	/*
58edd4a866SHeiko Carstens	 * This is the BSS section of the decompressor and not of the decompressed Linux kernel.
59edd4a866SHeiko Carstens	 * It will consume place in the decompressor's image.
60edd4a866SHeiko Carstens	 */
61edd4a866SHeiko Carstens	. = ALIGN(8);
62edd4a866SHeiko Carstens	.bss : {
63edd4a866SHeiko Carstens		_bss = . ;
64edd4a866SHeiko Carstens		*(.bss)
65edd4a866SHeiko Carstens		*(.bss.*)
66edd4a866SHeiko Carstens		*(COMMON)
67edd4a866SHeiko Carstens		/*
68edd4a866SHeiko Carstens		 * Stacks for the decompressor
69edd4a866SHeiko Carstens		 */
70edd4a866SHeiko Carstens		. = ALIGN(PAGE_SIZE);
71edd4a866SHeiko Carstens		_dump_info_stack_start = .;
72edd4a866SHeiko Carstens		. += PAGE_SIZE;
73edd4a866SHeiko Carstens		_dump_info_stack_end = .;
74edd4a866SHeiko Carstens		. = ALIGN(PAGE_SIZE);
75edd4a866SHeiko Carstens		_stack_start = .;
76edd4a866SHeiko Carstens		. += BOOT_STACK_SIZE;
77edd4a866SHeiko Carstens		_stack_end = .;
78edd4a866SHeiko Carstens		_ebss = .;
79edd4a866SHeiko Carstens	}
80edd4a866SHeiko Carstens
81edd4a866SHeiko Carstens	/*
82edd4a866SHeiko Carstens	 * uncompressed image info used by the decompressor it should match
83edd4a866SHeiko Carstens	 * struct vmlinux_info. It comes from .vmlinux.info section of
84edd4a866SHeiko Carstens	 * uncompressed vmlinux in a form of info.o
85edd4a866SHeiko Carstens	 */
86edd4a866SHeiko Carstens	. = ALIGN(8);
87edd4a866SHeiko Carstens	.vmlinux.info : {
88edd4a866SHeiko Carstens		_vmlinux_info = .;
89edd4a866SHeiko Carstens		*(.vmlinux.info)
90edd4a866SHeiko Carstens	}
91edd4a866SHeiko Carstens
92edd4a866SHeiko Carstens	.decompressor.syms : {
93edd4a866SHeiko Carstens		. += 1; /* make sure we have \0 before the first entry */
94edd4a866SHeiko Carstens		. = ALIGN(2);
95edd4a866SHeiko Carstens		_decompressor_syms_start = .;
96edd4a866SHeiko Carstens		*(.decompressor.syms)
97edd4a866SHeiko Carstens		_decompressor_syms_end = .;
98edd4a866SHeiko Carstens	}
99edd4a866SHeiko Carstens
100f913a660SVasily Gorbik	_decompressor_end = .;
101f913a660SVasily Gorbik
102*236d70f8SAlexander Gordeev	. = ALIGN(4);
103*236d70f8SAlexander Gordeev	.vmlinux.relocs : {
104*236d70f8SAlexander Gordeev		__vmlinux_relocs_64_start = .;
105*236d70f8SAlexander Gordeev		*(.vmlinux.relocs_64)
106*236d70f8SAlexander Gordeev		__vmlinux_relocs_64_end = .;
107*236d70f8SAlexander Gordeev	}
108*236d70f8SAlexander Gordeev
109edd4a866SHeiko Carstens#ifdef CONFIG_KERNEL_UNCOMPRESSED
11056b1069cSAlexander Gordeev	. = ALIGN(PAGE_SIZE);
11156b1069cSAlexander Gordeev	. += AMODE31_SIZE;		/* .amode31 section */
112edd4a866SHeiko Carstens#else
113edd4a866SHeiko Carstens	. = ALIGN(8);
114edd4a866SHeiko Carstens#endif
115edd4a866SHeiko Carstens	.rodata.compressed : {
116edd4a866SHeiko Carstens		_compressed_start = .;
117edd4a866SHeiko Carstens		*(.vmlinux.bin.compressed)
118edd4a866SHeiko Carstens		_compressed_end = .;
119aa127a06SPeter Oberparleiter	}
120aa127a06SPeter Oberparleiter
121aa127a06SPeter Oberparleiter#define SB_TRAILER_SIZE 32
122aa127a06SPeter Oberparleiter	/* Trailer needed for Secure Boot */
123aa127a06SPeter Oberparleiter	. += SB_TRAILER_SIZE; /* make sure .sb.trailer does not overwrite the previous section */
124aa127a06SPeter Oberparleiter	. = ALIGN(4096) - SB_TRAILER_SIZE;
125aa127a06SPeter Oberparleiter	.sb.trailer : {
126aa127a06SPeter Oberparleiter		QUAD(0)
127aa127a06SPeter Oberparleiter		QUAD(0)
128aa127a06SPeter Oberparleiter		QUAD(0)
129aa127a06SPeter Oberparleiter		QUAD(0x000000207a49504c)
130edd4a866SHeiko Carstens	}
131edd4a866SHeiko Carstens	_end = .;
132edd4a866SHeiko Carstens
133ba6c26afSNathan Chancellor	DWARF_DEBUG
1346a4d37c8SNathan Chancellor	ELF_DETAILS
135ba6c26afSNathan Chancellor
13630226853SNathan Chancellor	/*
137a795e5d2SHeiko Carstens	 * Make sure that the .got.plt is either completely empty or it
138a795e5d2SHeiko Carstens	 * contains only the three reserved double words.
13930226853SNathan Chancellor	 */
14030226853SNathan Chancellor	.got.plt : {
14130226853SNathan Chancellor		*(.got.plt)
14230226853SNathan Chancellor	}
143a795e5d2SHeiko Carstens	ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!")
144a795e5d2SHeiko Carstens
145a795e5d2SHeiko Carstens	/*
146a795e5d2SHeiko Carstens	 * Sections that should stay zero sized, which is safer to
147a795e5d2SHeiko Carstens	 * explicitly check instead of blindly discarding.
148a795e5d2SHeiko Carstens	 */
14930226853SNathan Chancellor	.plt : {
15030226853SNathan Chancellor		*(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt)
15130226853SNathan Chancellor	}
15230226853SNathan Chancellor	ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!")
15364d590a2SNathan Chancellor	.rela.dyn : {
15464d590a2SNathan Chancellor		*(.rela.*) *(.rela_*)
15564d590a2SNathan Chancellor	}
15664d590a2SNathan Chancellor	ASSERT(SIZEOF(.rela.dyn) == 0, "Unexpected run-time relocations (.rela) detected!")
15730226853SNathan Chancellor
158edd4a866SHeiko Carstens	/* Sections to be discarded */
159edd4a866SHeiko Carstens	/DISCARD/ : {
160c0f98ea0SNathan Chancellor		COMMON_DISCARDS
161edd4a866SHeiko Carstens		*(.eh_frame)
162edd4a866SHeiko Carstens		*(__ex_table)
163edd4a866SHeiko Carstens		*(*__ksymtab*)
164edd4a866SHeiko Carstens		*(___kcrctab*)
165edd4a866SHeiko Carstens	}
166edd4a866SHeiko Carstens}
167