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