/* SPDX-License-Identifier: GPL-2.0 */ #include #include #include #include #include #include "boot.h" OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") OUTPUT_ARCH(s390:64-bit) ENTRY(startup) SECTIONS { . = 0; .ipldata : { *(.ipldata) } . = IPL_START; .head.text : { _head = . ; HEAD_TEXT _ehead = . ; } . = PARMAREA; .parmarea : { *(.parmarea) } .text : { _text = .; /* Text */ *(.text) *(.text.*) INIT_TEXT _etext = . ; } .rodata : { _rodata = . ; *(.rodata) /* read-only data */ *(.rodata.*) _erodata = . ; } .got : { *(.got) } NOTES .data : { _data = . ; *(.data) *(.data.*) _edata = . ; } BOOT_DATA BOOT_DATA_PRESERVED /* * This is the BSS section of the decompressor and not of the decompressed Linux kernel. * It will consume place in the decompressor's image. */ . = ALIGN(8); .bss : { _bss = . ; *(.bss) *(.bss.*) *(COMMON) /* * Stacks for the decompressor */ . = ALIGN(PAGE_SIZE); _dump_info_stack_start = .; . += PAGE_SIZE; _dump_info_stack_end = .; . = ALIGN(PAGE_SIZE); _stack_start = .; . += BOOT_STACK_SIZE; _stack_end = .; _ebss = .; } /* * uncompressed image info used by the decompressor it should match * struct vmlinux_info. It comes from .vmlinux.info section of * uncompressed vmlinux in a form of info.o */ . = ALIGN(8); .vmlinux.info : { _vmlinux_info = .; *(.vmlinux.info) } .decompressor.syms : { . += 1; /* make sure we have \0 before the first entry */ . = ALIGN(2); _decompressor_syms_start = .; *(.decompressor.syms) _decompressor_syms_end = .; } _decompressor_end = .; #ifdef CONFIG_KERNEL_UNCOMPRESSED . = 0x100000; #else . = ALIGN(8); #endif .rodata.compressed : { _compressed_start = .; *(.vmlinux.bin.compressed) _compressed_end = .; } #ifndef CONFIG_PIE_BUILD /* * When the kernel is built with CONFIG_KERNEL_UNCOMPRESSED, the entire * uncompressed vmlinux.bin is positioned in the bzImage decompressor * image at the default kernel LMA of 0x100000, enabling it to be * executed in-place. However, the size of .vmlinux.relocs could be * large enough to cause an overlap with the uncompressed kernel at the * address 0x100000. To address this issue, .vmlinux.relocs is * positioned after the .rodata.compressed. */ . = ALIGN(4); .vmlinux.relocs : { __vmlinux_relocs_64_start = .; *(.vmlinux.relocs_64) __vmlinux_relocs_64_end = .; } #endif #define SB_TRAILER_SIZE 32 /* Trailer needed for Secure Boot */ . += SB_TRAILER_SIZE; /* make sure .sb.trailer does not overwrite the previous section */ . = ALIGN(4096) - SB_TRAILER_SIZE; .sb.trailer : { QUAD(0) QUAD(0) QUAD(0) QUAD(0x000000207a49504c) } _end = .; DWARF_DEBUG ELF_DETAILS /* * Make sure that the .got.plt is either completely empty or it * contains only the three reserved double words. */ .got.plt : { *(.got.plt) } ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!") /* * Sections that should stay zero sized, which is safer to * explicitly check instead of blindly discarding. */ .plt : { *(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt) } ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!") .rela.dyn : { *(.rela.*) *(.rela_*) } ASSERT(SIZEOF(.rela.dyn) == 0, "Unexpected run-time relocations (.rela) detected!") /* Sections to be discarded */ /DISCARD/ : { COMMON_DISCARDS *(.eh_frame) *(__ex_table) *(*__ksymtab*) *(___kcrctab*) } }