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 . = ALIGN(1 << 20); /* _SEGMENT_SIZE */ 113#else 114 . = ALIGN(8); 115#endif 116 .rodata.compressed : { 117 _compressed_start = .; 118 *(.vmlinux.bin.compressed) 119 _compressed_end = .; 120 } 121 122#define SB_TRAILER_SIZE 32 123 /* Trailer needed for Secure Boot */ 124 . += SB_TRAILER_SIZE; /* make sure .sb.trailer does not overwrite the previous section */ 125 . = ALIGN(4096) - SB_TRAILER_SIZE; 126 .sb.trailer : { 127 QUAD(0) 128 QUAD(0) 129 QUAD(0) 130 QUAD(0x000000207a49504c) 131 } 132 _end = .; 133 134 DWARF_DEBUG 135 ELF_DETAILS 136 137 /* 138 * Make sure that the .got.plt is either completely empty or it 139 * contains only the three reserved double words. 140 */ 141 .got.plt : { 142 *(.got.plt) 143 } 144 ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!") 145 146 /* 147 * Sections that should stay zero sized, which is safer to 148 * explicitly check instead of blindly discarding. 149 */ 150 .plt : { 151 *(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt) 152 } 153 ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!") 154 .rela.dyn : { 155 *(.rela.*) *(.rela_*) 156 } 157 ASSERT(SIZEOF(.rela.dyn) == 0, "Unexpected run-time relocations (.rela) detected!") 158 159 /* Sections to be discarded */ 160 /DISCARD/ : { 161 COMMON_DISCARDS 162 *(.eh_frame) 163 *(__ex_table) 164 *(*__ksymtab*) 165 *(___kcrctab*) 166 } 167} 168