162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#include <asm-generic/vmlinux.lds.h> 362306a36Sopenharmony_ci#include <asm/vmlinux.lds.h> 462306a36Sopenharmony_ci#include <asm/thread_info.h> 562306a36Sopenharmony_ci#include <asm/page.h> 662306a36Sopenharmony_ci#include <asm/sclp.h> 762306a36Sopenharmony_ci#include "boot.h" 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciOUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") 1062306a36Sopenharmony_ciOUTPUT_ARCH(s390:64-bit) 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ciENTRY(startup) 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ciSECTIONS 1562306a36Sopenharmony_ci{ 1662306a36Sopenharmony_ci . = 0; 1762306a36Sopenharmony_ci .ipldata : { 1862306a36Sopenharmony_ci *(.ipldata) 1962306a36Sopenharmony_ci } 2062306a36Sopenharmony_ci . = IPL_START; 2162306a36Sopenharmony_ci .head.text : { 2262306a36Sopenharmony_ci _head = . ; 2362306a36Sopenharmony_ci HEAD_TEXT 2462306a36Sopenharmony_ci _ehead = . ; 2562306a36Sopenharmony_ci } 2662306a36Sopenharmony_ci . = PARMAREA; 2762306a36Sopenharmony_ci .parmarea : { 2862306a36Sopenharmony_ci *(.parmarea) 2962306a36Sopenharmony_ci } 3062306a36Sopenharmony_ci .text : { 3162306a36Sopenharmony_ci _text = .; /* Text */ 3262306a36Sopenharmony_ci *(.text) 3362306a36Sopenharmony_ci *(.text.*) 3462306a36Sopenharmony_ci _etext = . ; 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci .rodata : { 3762306a36Sopenharmony_ci _rodata = . ; 3862306a36Sopenharmony_ci *(.rodata) /* read-only data */ 3962306a36Sopenharmony_ci *(.rodata.*) 4062306a36Sopenharmony_ci _erodata = . ; 4162306a36Sopenharmony_ci } 4262306a36Sopenharmony_ci NOTES 4362306a36Sopenharmony_ci .data : { 4462306a36Sopenharmony_ci _data = . ; 4562306a36Sopenharmony_ci *(.data) 4662306a36Sopenharmony_ci *(.data.*) 4762306a36Sopenharmony_ci _edata = . ; 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci BOOT_DATA 5162306a36Sopenharmony_ci BOOT_DATA_PRESERVED 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci /* 5462306a36Sopenharmony_ci * This is the BSS section of the decompressor and not of the decompressed Linux kernel. 5562306a36Sopenharmony_ci * It will consume place in the decompressor's image. 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_ci . = ALIGN(8); 5862306a36Sopenharmony_ci .bss : { 5962306a36Sopenharmony_ci _bss = . ; 6062306a36Sopenharmony_ci *(.bss) 6162306a36Sopenharmony_ci *(.bss.*) 6262306a36Sopenharmony_ci *(COMMON) 6362306a36Sopenharmony_ci /* 6462306a36Sopenharmony_ci * Stacks for the decompressor 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_ci . = ALIGN(PAGE_SIZE); 6762306a36Sopenharmony_ci _dump_info_stack_start = .; 6862306a36Sopenharmony_ci . += PAGE_SIZE; 6962306a36Sopenharmony_ci _dump_info_stack_end = .; 7062306a36Sopenharmony_ci . = ALIGN(PAGE_SIZE); 7162306a36Sopenharmony_ci _stack_start = .; 7262306a36Sopenharmony_ci . += BOOT_STACK_SIZE; 7362306a36Sopenharmony_ci _stack_end = .; 7462306a36Sopenharmony_ci _ebss = .; 7562306a36Sopenharmony_ci } 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci /* 7862306a36Sopenharmony_ci * uncompressed image info used by the decompressor it should match 7962306a36Sopenharmony_ci * struct vmlinux_info. It comes from .vmlinux.info section of 8062306a36Sopenharmony_ci * uncompressed vmlinux in a form of info.o 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_ci . = ALIGN(8); 8362306a36Sopenharmony_ci .vmlinux.info : { 8462306a36Sopenharmony_ci _vmlinux_info = .; 8562306a36Sopenharmony_ci *(.vmlinux.info) 8662306a36Sopenharmony_ci } 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci .decompressor.syms : { 8962306a36Sopenharmony_ci . += 1; /* make sure we have \0 before the first entry */ 9062306a36Sopenharmony_ci . = ALIGN(2); 9162306a36Sopenharmony_ci _decompressor_syms_start = .; 9262306a36Sopenharmony_ci *(.decompressor.syms) 9362306a36Sopenharmony_ci _decompressor_syms_end = .; 9462306a36Sopenharmony_ci } 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci _decompressor_end = .; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci#ifdef CONFIG_KERNEL_UNCOMPRESSED 9962306a36Sopenharmony_ci . = 0x100000; 10062306a36Sopenharmony_ci#else 10162306a36Sopenharmony_ci . = ALIGN(8); 10262306a36Sopenharmony_ci#endif 10362306a36Sopenharmony_ci .rodata.compressed : { 10462306a36Sopenharmony_ci _compressed_start = .; 10562306a36Sopenharmony_ci *(.vmlinux.bin.compressed) 10662306a36Sopenharmony_ci _compressed_end = .; 10762306a36Sopenharmony_ci } 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#define SB_TRAILER_SIZE 32 11062306a36Sopenharmony_ci /* Trailer needed for Secure Boot */ 11162306a36Sopenharmony_ci . += SB_TRAILER_SIZE; /* make sure .sb.trailer does not overwrite the previous section */ 11262306a36Sopenharmony_ci . = ALIGN(4096) - SB_TRAILER_SIZE; 11362306a36Sopenharmony_ci .sb.trailer : { 11462306a36Sopenharmony_ci QUAD(0) 11562306a36Sopenharmony_ci QUAD(0) 11662306a36Sopenharmony_ci QUAD(0) 11762306a36Sopenharmony_ci QUAD(0x000000207a49504c) 11862306a36Sopenharmony_ci } 11962306a36Sopenharmony_ci _end = .; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci /* Sections to be discarded */ 12262306a36Sopenharmony_ci /DISCARD/ : { 12362306a36Sopenharmony_ci *(.eh_frame) 12462306a36Sopenharmony_ci *(__ex_table) 12562306a36Sopenharmony_ci *(*__ksymtab*) 12662306a36Sopenharmony_ci *(___kcrctab*) 12762306a36Sopenharmony_ci } 12862306a36Sopenharmony_ci} 129