1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include <asm-generic/vmlinux.lds.h>
3 #include <asm/vmlinux.lds.h>
4 #include <asm/thread_info.h>
5 #include <asm/page.h>
6 #include <asm/sclp.h>
7 #include "boot.h"
8 
9 OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
10 OUTPUT_ARCH(s390:64-bit)
11 
12 ENTRY(startup)
13 
14 SECTIONS
15 {
16 	. = 0;
17 	.ipldata : {
18 		*(.ipldata)
19 	}
20 	. = IPL_START;
21 	.head.text : {
22 		_head = . ;
23 		HEAD_TEXT
24 		_ehead = . ;
25 	}
26 	. = PARMAREA;
27 	.parmarea : {
28 		*(.parmarea)
29 	}
30 	.text :	{
31 		_text = .;	/* Text */
32 		*(.text)
33 		*(.text.*)
34 		INIT_TEXT
35 		_etext = . ;
36 	}
37 	.rodata : {
38 		_rodata = . ;
39 		*(.rodata)	 /* read-only data */
40 		*(.rodata.*)
41 		_erodata = . ;
42 	}
43 	.got : {
44 		*(.got)
45 	}
46 	NOTES
47 	.data :	{
48 		_data = . ;
49 		*(.data)
50 		*(.data.*)
51 		_edata = . ;
52 	}
53 
54 	BOOT_DATA
55 	BOOT_DATA_PRESERVED
56 
57 	/*
58 	 * This is the BSS section of the decompressor and not of the decompressed Linux kernel.
59 	 * It will consume place in the decompressor's image.
60 	 */
61 	. = ALIGN(8);
62 	.bss : {
63 		_bss = . ;
64 		*(.bss)
65 		*(.bss.*)
66 		*(COMMON)
67 		/*
68 		 * Stacks for the decompressor
69 		 */
70 		. = ALIGN(PAGE_SIZE);
71 		_dump_info_stack_start = .;
72 		. += PAGE_SIZE;
73 		_dump_info_stack_end = .;
74 		. = ALIGN(PAGE_SIZE);
75 		_stack_start = .;
76 		. += BOOT_STACK_SIZE;
77 		_stack_end = .;
78 		_ebss = .;
79 	}
80 
81 	/*
82 	 * uncompressed image info used by the decompressor it should match
83 	 * struct vmlinux_info. It comes from .vmlinux.info section of
84 	 * uncompressed vmlinux in a form of info.o
85 	 */
86 	. = ALIGN(8);
87 	.vmlinux.info : {
88 		_vmlinux_info = .;
89 		*(.vmlinux.info)
90 	}
91 
92 	.decompressor.syms : {
93 		. += 1; /* make sure we have \0 before the first entry */
94 		. = ALIGN(2);
95 		_decompressor_syms_start = .;
96 		*(.decompressor.syms)
97 		_decompressor_syms_end = .;
98 	}
99 
100 	_decompressor_end = .;
101 
102 	. = ALIGN(4);
103 	.vmlinux.relocs : {
104 		__vmlinux_relocs_64_start = .;
105 		*(.vmlinux.relocs_64)
106 		__vmlinux_relocs_64_end = .;
107 	}
108 
109 #ifdef CONFIG_KERNEL_UNCOMPRESSED
110 	. = ALIGN(PAGE_SIZE);
111 	. += AMODE31_SIZE;		/* .amode31 section */
112 
113 	/*
114 	 * Make sure the location counter is not less than TEXT_OFFSET.
115 	 * _SEGMENT_SIZE is not available, use ALIGN(1 << 20) instead.
116 	 */
117 	. = MAX(TEXT_OFFSET, ALIGN(1 << 20));
118 #else
119 	. = ALIGN(8);
120 #endif
121 	.rodata.compressed : {
122 		_compressed_start = .;
123 		*(.vmlinux.bin.compressed)
124 		_compressed_end = .;
125 	}
126 
127 #define SB_TRAILER_SIZE 32
128 	/* Trailer needed for Secure Boot */
129 	. += SB_TRAILER_SIZE; /* make sure .sb.trailer does not overwrite the previous section */
130 	. = ALIGN(4096) - SB_TRAILER_SIZE;
131 	.sb.trailer : {
132 		QUAD(0)
133 		QUAD(0)
134 		QUAD(0)
135 		QUAD(0x000000207a49504c)
136 	}
137 	_end = .;
138 
139 	DWARF_DEBUG
140 	ELF_DETAILS
141 
142 	/*
143 	 * Make sure that the .got.plt is either completely empty or it
144 	 * contains only the three reserved double words.
145 	 */
146 	.got.plt : {
147 		*(.got.plt)
148 	}
149 	ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!")
150 
151 	/*
152 	 * Sections that should stay zero sized, which is safer to
153 	 * explicitly check instead of blindly discarding.
154 	 */
155 	.plt : {
156 		*(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt)
157 	}
158 	ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!")
159 	.rela.dyn : {
160 		*(.rela.*) *(.rela_*)
161 	}
162 	ASSERT(SIZEOF(.rela.dyn) == 0, "Unexpected run-time relocations (.rela) detected!")
163 
164 	/* Sections to be discarded */
165 	/DISCARD/ : {
166 		COMMON_DISCARDS
167 		*(.eh_frame)
168 		*(__ex_table)
169 		*(*__ksymtab*)
170 		*(___kcrctab*)
171 	}
172 }
173