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