1edd4a866SHeiko Carstens/* SPDX-License-Identifier: GPL-2.0 */ 2edd4a866SHeiko Carstens#include <asm-generic/vmlinux.lds.h> 3edd4a866SHeiko Carstens#include <asm/vmlinux.lds.h> 4edd4a866SHeiko Carstens#include <asm/thread_info.h> 5edd4a866SHeiko Carstens#include <asm/page.h> 6edd4a866SHeiko Carstens#include <asm/sclp.h> 7834979c2SHeiko Carstens#include "boot.h" 8edd4a866SHeiko Carstens 9edd4a866SHeiko CarstensOUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") 10edd4a866SHeiko CarstensOUTPUT_ARCH(s390:64-bit) 11edd4a866SHeiko Carstens 12edd4a866SHeiko CarstensENTRY(startup) 13edd4a866SHeiko Carstens 14edd4a866SHeiko CarstensSECTIONS 15edd4a866SHeiko Carstens{ 16edd4a866SHeiko Carstens . = 0; 17834979c2SHeiko Carstens .ipldata : { 18834979c2SHeiko Carstens *(.ipldata) 19834979c2SHeiko Carstens } 20834979c2SHeiko Carstens . = IPL_START; 21edd4a866SHeiko Carstens .head.text : { 22edd4a866SHeiko Carstens _head = . ; 23edd4a866SHeiko Carstens HEAD_TEXT 24edd4a866SHeiko Carstens _ehead = . ; 25edd4a866SHeiko Carstens } 26f84d88edSHeiko Carstens . = PARMAREA; 27f84d88edSHeiko Carstens .parmarea : { 28f84d88edSHeiko Carstens *(.parmarea) 29f84d88edSHeiko Carstens } 30edd4a866SHeiko Carstens .text : { 31edd4a866SHeiko Carstens _text = .; /* Text */ 32edd4a866SHeiko Carstens *(.text) 33edd4a866SHeiko Carstens *(.text.*) 34b23ab303SNathan Chancellor INIT_TEXT 35edd4a866SHeiko Carstens _etext = . ; 36edd4a866SHeiko Carstens } 37edd4a866SHeiko Carstens .rodata : { 38edd4a866SHeiko Carstens _rodata = . ; 39edd4a866SHeiko Carstens *(.rodata) /* read-only data */ 40edd4a866SHeiko Carstens *(.rodata.*) 41edd4a866SHeiko Carstens _erodata = . ; 42edd4a866SHeiko Carstens } 4330226853SNathan Chancellor .got : { 4430226853SNathan Chancellor *(.got) 4530226853SNathan Chancellor } 46edd4a866SHeiko Carstens NOTES 47edd4a866SHeiko Carstens .data : { 48edd4a866SHeiko Carstens _data = . ; 49edd4a866SHeiko Carstens *(.data) 50edd4a866SHeiko Carstens *(.data.*) 51edd4a866SHeiko Carstens _edata = . ; 52edd4a866SHeiko Carstens } 53edd4a866SHeiko Carstens 54edd4a866SHeiko Carstens BOOT_DATA 55edd4a866SHeiko Carstens BOOT_DATA_PRESERVED 56edd4a866SHeiko Carstens 57edd4a866SHeiko Carstens /* 58edd4a866SHeiko Carstens * This is the BSS section of the decompressor and not of the decompressed Linux kernel. 59edd4a866SHeiko Carstens * It will consume place in the decompressor's image. 60edd4a866SHeiko Carstens */ 61edd4a866SHeiko Carstens . = ALIGN(8); 62edd4a866SHeiko Carstens .bss : { 63edd4a866SHeiko Carstens _bss = . ; 64edd4a866SHeiko Carstens *(.bss) 65edd4a866SHeiko Carstens *(.bss.*) 66edd4a866SHeiko Carstens *(COMMON) 67edd4a866SHeiko Carstens /* 68edd4a866SHeiko Carstens * Stacks for the decompressor 69edd4a866SHeiko Carstens */ 70edd4a866SHeiko Carstens . = ALIGN(PAGE_SIZE); 71edd4a866SHeiko Carstens _dump_info_stack_start = .; 72edd4a866SHeiko Carstens . += PAGE_SIZE; 73edd4a866SHeiko Carstens _dump_info_stack_end = .; 74edd4a866SHeiko Carstens . = ALIGN(PAGE_SIZE); 75edd4a866SHeiko Carstens _stack_start = .; 76edd4a866SHeiko Carstens . += BOOT_STACK_SIZE; 77edd4a866SHeiko Carstens _stack_end = .; 78edd4a866SHeiko Carstens _ebss = .; 79edd4a866SHeiko Carstens } 80edd4a866SHeiko Carstens 81edd4a866SHeiko Carstens /* 82edd4a866SHeiko Carstens * uncompressed image info used by the decompressor it should match 83edd4a866SHeiko Carstens * struct vmlinux_info. It comes from .vmlinux.info section of 84edd4a866SHeiko Carstens * uncompressed vmlinux in a form of info.o 85edd4a866SHeiko Carstens */ 86edd4a866SHeiko Carstens . = ALIGN(8); 87edd4a866SHeiko Carstens .vmlinux.info : { 88edd4a866SHeiko Carstens _vmlinux_info = .; 89edd4a866SHeiko Carstens *(.vmlinux.info) 90edd4a866SHeiko Carstens } 91edd4a866SHeiko Carstens 92edd4a866SHeiko Carstens .decompressor.syms : { 93edd4a866SHeiko Carstens . += 1; /* make sure we have \0 before the first entry */ 94edd4a866SHeiko Carstens . = ALIGN(2); 95edd4a866SHeiko Carstens _decompressor_syms_start = .; 96edd4a866SHeiko Carstens *(.decompressor.syms) 97edd4a866SHeiko Carstens _decompressor_syms_end = .; 98edd4a866SHeiko Carstens } 99edd4a866SHeiko Carstens 100f913a660SVasily Gorbik _decompressor_end = .; 101f913a660SVasily Gorbik 102*236d70f8SAlexander Gordeev . = ALIGN(4); 103*236d70f8SAlexander Gordeev .vmlinux.relocs : { 104*236d70f8SAlexander Gordeev __vmlinux_relocs_64_start = .; 105*236d70f8SAlexander Gordeev *(.vmlinux.relocs_64) 106*236d70f8SAlexander Gordeev __vmlinux_relocs_64_end = .; 107*236d70f8SAlexander Gordeev } 108*236d70f8SAlexander Gordeev 109edd4a866SHeiko Carstens#ifdef CONFIG_KERNEL_UNCOMPRESSED 11056b1069cSAlexander Gordeev . = ALIGN(PAGE_SIZE); 11156b1069cSAlexander Gordeev . += AMODE31_SIZE; /* .amode31 section */ 112edd4a866SHeiko Carstens#else 113edd4a866SHeiko Carstens . = ALIGN(8); 114edd4a866SHeiko Carstens#endif 115edd4a866SHeiko Carstens .rodata.compressed : { 116edd4a866SHeiko Carstens _compressed_start = .; 117edd4a866SHeiko Carstens *(.vmlinux.bin.compressed) 118edd4a866SHeiko Carstens _compressed_end = .; 119aa127a06SPeter Oberparleiter } 120aa127a06SPeter Oberparleiter 121aa127a06SPeter Oberparleiter#define SB_TRAILER_SIZE 32 122aa127a06SPeter Oberparleiter /* Trailer needed for Secure Boot */ 123aa127a06SPeter Oberparleiter . += SB_TRAILER_SIZE; /* make sure .sb.trailer does not overwrite the previous section */ 124aa127a06SPeter Oberparleiter . = ALIGN(4096) - SB_TRAILER_SIZE; 125aa127a06SPeter Oberparleiter .sb.trailer : { 126aa127a06SPeter Oberparleiter QUAD(0) 127aa127a06SPeter Oberparleiter QUAD(0) 128aa127a06SPeter Oberparleiter QUAD(0) 129aa127a06SPeter Oberparleiter QUAD(0x000000207a49504c) 130edd4a866SHeiko Carstens } 131edd4a866SHeiko Carstens _end = .; 132edd4a866SHeiko Carstens 133ba6c26afSNathan Chancellor DWARF_DEBUG 1346a4d37c8SNathan Chancellor ELF_DETAILS 135ba6c26afSNathan Chancellor 13630226853SNathan Chancellor /* 137a795e5d2SHeiko Carstens * Make sure that the .got.plt is either completely empty or it 138a795e5d2SHeiko Carstens * contains only the three reserved double words. 13930226853SNathan Chancellor */ 14030226853SNathan Chancellor .got.plt : { 14130226853SNathan Chancellor *(.got.plt) 14230226853SNathan Chancellor } 143a795e5d2SHeiko Carstens ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!") 144a795e5d2SHeiko Carstens 145a795e5d2SHeiko Carstens /* 146a795e5d2SHeiko Carstens * Sections that should stay zero sized, which is safer to 147a795e5d2SHeiko Carstens * explicitly check instead of blindly discarding. 148a795e5d2SHeiko Carstens */ 14930226853SNathan Chancellor .plt : { 15030226853SNathan Chancellor *(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt) 15130226853SNathan Chancellor } 15230226853SNathan Chancellor ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!") 15364d590a2SNathan Chancellor .rela.dyn : { 15464d590a2SNathan Chancellor *(.rela.*) *(.rela_*) 15564d590a2SNathan Chancellor } 15664d590a2SNathan Chancellor ASSERT(SIZEOF(.rela.dyn) == 0, "Unexpected run-time relocations (.rela) detected!") 15730226853SNathan Chancellor 158edd4a866SHeiko Carstens /* Sections to be discarded */ 159edd4a866SHeiko Carstens /DISCARD/ : { 160c0f98ea0SNathan Chancellor COMMON_DISCARDS 161edd4a866SHeiko Carstens *(.eh_frame) 162edd4a866SHeiko Carstens *(__ex_table) 163edd4a866SHeiko Carstens *(*__ksymtab*) 164edd4a866SHeiko Carstens *(___kcrctab*) 165edd4a866SHeiko Carstens } 166edd4a866SHeiko Carstens} 167