root/arch/s390/boot/vmlinux.lds.S
/* SPDX-License-Identifier: GPL-2.0 */
#include <asm-generic/vmlinux.lds.h>
#include <asm/vmlinux.lds.h>
#include <asm/thread_info.h>
#include <asm/page.h>
#include <asm/sclp.h>
#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 = . ;
        }
        EXCEPTION_TABLE(16)
        .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 = .;

        . = ALIGN(4);
        .vmlinux.relocs : {
                __vmlinux_relocs_64_start = .;
                *(.vmlinux.relocs_64)
                __vmlinux_relocs_64_end = .;
        }

#ifdef CONFIG_KERNEL_UNCOMPRESSED
        . = ALIGN(PAGE_SIZE);
        . += AMODE31_SIZE;              /* .amode31 section */

        /*
         * Make sure the location counter is not less than TEXT_OFFSET.
         * _SEGMENT_SIZE is not available, use ALIGN(1 << 20) instead.
         */
        . = MAX(TEXT_OFFSET, ALIGN(1 << 20));
#else
        . = ALIGN(8);
#endif
        .rodata.compressed : {
                _compressed_start = .;
                *(.vmlinux.bin.compressed)
                _compressed_end = .;
        }

#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 = .;

        /* Sections to be discarded */
        /DISCARD/ : {
                COMMON_DISCARDS
                *(.eh_frame)
                *(*__ksymtab*)
                *(___kcrctab*)
                *(.modinfo)
        }

        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!")
}