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 9OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") 10OUTPUT_ARCH(s390:64-bit) 11 12ENTRY(startup) 13 14SECTIONS 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