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