// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
/*
 * Copyright 2013-2019 IBM Corp.
 */

#include <config.h>
#include <mem-map.h>

/* Debug sections from binutils `ld --verbose` */

#define DEBUG_SECTIONS							\
  /* Stabs debugging sections.  */					\
  .stab          0 : { *(.stab) }					\
  .stabstr       0 : { *(.stabstr) }					\
  .stab.excl     0 : { *(.stab.excl) }					\
  .stab.exclstr  0 : { *(.stab.exclstr) }				\
  .stab.index    0 : { *(.stab.index) }					\
  .stab.indexstr 0 : { *(.stab.indexstr) }				\
  .comment       0 : { *(.comment) }					\
  /* DWARF debug sections.						\
     Symbols in the DWARF debugging sections are relative to the beginning \
     of the section so we begin them at 0.  */				\
  /* DWARF 1 */								\
  .debug          0 : { *(.debug) }					\
  .line           0 : { *(.line) }					\
  /* GNU DWARF 1 extensions */						\
  .debug_srcinfo  0 : { *(.debug_srcinfo) }				\
  .debug_sfnames  0 : { *(.debug_sfnames) }				\
  /* DWARF 1.1 and DWARF 2 */						\
  .debug_aranges  0 : { *(.debug_aranges) }				\
  .debug_pubnames 0 : { *(.debug_pubnames) }				\
  /* DWARF 2 */								\
  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }		\
  .debug_abbrev   0 : { *(.debug_abbrev) }				\
  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }	\
  .debug_frame    0 : { *(.debug_frame) }				\
  .debug_str      0 : { *(.debug_str) }					\
  .debug_loc      0 : { *(.debug_loc) }					\
  .debug_macinfo  0 : { *(.debug_macinfo) }				\
  /* SGI/MIPS DWARF 2 extensions */					\
  .debug_weaknames 0 : { *(.debug_weaknames) }				\
  .debug_funcnames 0 : { *(.debug_funcnames) }				\
  .debug_typenames 0 : { *(.debug_typenames) }				\
  .debug_varnames  0 : { *(.debug_varnames) }				\
  /* DWARF 3 */								\
  .debug_pubtypes 0 : { *(.debug_pubtypes) }				\
  .debug_ranges   0 : { *(.debug_ranges) }				\
  /* DWARF 5 */								\
  .debug_macro    0 : { *(.debug_macro) }				\
  .debug_addr     0 : { *(.debug_addr) }				\
  .debug_rnglists 0 : { *(.debug_rnglists) }				\
  .debug_loclists 0 : { *(.debug_loclists) }

ENTRY(boot_entry);
SECTIONS
{
	_start = .;
	. = 0;

	.head : {
		KEEP(*(.head))
	}

	. = NACA_OFF;
	.naca : {
		KEEP(*(.naca.data))
	}

	. = SPIRAH_OFF;
	.spirah : {
		KEEP(*(.spirah.data))
	}

	_head_end = .;
	. = ALIGN(PAGE_SIZE);

	/*
	 * The following sections are read-write at runtime. We need
	 * to skip over them when checksumming the skiboot images
	 * before a fast-reboot.
	 */
	. = PROC_DUMP_AREA_OFF;
	.procdump : {
		KEEP(*(.procdump.data))
	}

	. = PROCIN_OFF;
	.procin.data : {
		KEEP(*(.procin.data))
	}

	. = MDST_TABLE_OFF;
	.mdst : {
		KEEP(*(.mdst.data))
	}

	. = MDDT_TABLE_OFF;
	.mddt : {
		KEEP(*(.mddt.data))
	}

	. = CPU_CTL_OFF;
	.cpuctrl : {
		KEEP(*(.cpuctrl.data))
	}

	/* ...and back to RO */
	. = ALIGN(PAGE_SIZE);
	_stext = .;
 	.text : {
		*(.text*)
		*(.sfpr .glink)
	}
	_etext = .;
	. = ALIGN(PAGE_SIZE);

	.rodata : {
		__rodata_start = .;
		*(.rodata .rodata.*)
		__rodata_end = .;
	}

	. = ALIGN(0x10);
	.trap_table : {
		__trap_table_start = .;
		KEEP(*(.trap_table))
		__trap_table_end = .;
	}

	. = ALIGN(0x10);
	.init : {
		__ctors_start = .;
		KEEP(*(.ctors*))
		KEEP(*(SORT(.init_array.*)))
		KEEP(*(.init_array))
		__ctors_end = .;
	}

	. = ALIGN(0x10);
	.opd : {
		*(.opd)
	}
  
	. = ALIGN(0x100);
	.got : {
		__toc_start = . + 0x8000;
		*(.got)
		*(.toc)
	}

	. = ALIGN(0x10);
	.opal_table : {
		__opal_table_start = .;
		KEEP(*(.opal_table))
		__opal_table_end = .;
	}

	.platforms : {
		__platforms_start = .;
		KEEP(*(.platforms))
		__platforms_end = .;
	}

	.hwprobes : {
		__hwprobes_start = .;
		KEEP(*(.hwprobes))
		__hwprobes_end = .;
	}

	/* Relocations */
	. = ALIGN(0x10);
	.dynamic : {
		__dynamic_start = .;
		*(.dynamic)
		__dynamic_end = .;
	}

	. = ALIGN(0x10);
	.rela.dyn : {
		__rela_dyn_start = .;
		*(.rela*)
		__rela_dyn_end = .;
	}

	.hash          : { *(.hash)   }
	.gnu.hash      : { *(.gnu.hash) }
	.gnu.version   : { *(.gnu.version) }
	.gnu.version_d : { *(.gnu.version_d) }
	.gnu.version_r : { *(.gnu.version_r) }

	. = ALIGN(0x10);
	.sym_map : {
		__sym_map_start = . ;
		KEEP(*(.sym_map))
		__sym_map_end = . ;
	}

	/*
	 * Memory above this point should be un-changing after the OS
	 * boots, and is verified with a checksum upon fast reboot.
	 */
	_romem_end = .;

	. = ALIGN(PAGE_SIZE);

	_sdata = .;
	.data : {
		/*
		 * A couple of things that need to be 4K aligned and
		 * to reside in their own pages for the sake of TCE
		 * mappings, so use PAGE_SIZE alignment.
		 */
		. = ALIGN(PAGE_SIZE);
		*(.data.memcons);
		. = ALIGN(PAGE_SIZE);
		*(.data.boot_trace);
		. = ALIGN(PAGE_SIZE);
		*(.data*)
		*(.force.data)
		*(.toc1)
		*(.branch_lt)
	}
	_edata = .;

	/* We locate the BSS at 5M to leave room for the symbol map */
	. = 0x500000;

	_sbss = .;
	.bss : {
		*(.dynbss)
		*(.bss*)
	}
	. = ALIGN(PAGE_SIZE);
	_ebss = .;
	_end = .;

	ASSERT((HEAP_BASE - SKIBOOT_BASE) >= _end, "Heap collision with image")

	/* Optional kernel image */
       . = ALIGN(PAGE_SIZE);
       .builtin_kernel : {
		__builtin_kernel_start = .;
		KEEP(*(.builtin_kernel))
		__builtin_kernel_end = .;
	}

	DEBUG_SECTIONS

	/* Discards */
	/DISCARD/ : {
		*(.note.GNU-stack)
		*(.comment)
		*(.eh_frame)
		*(.interp)
		*(.fini_array.*)
		*(.dynsym)
		*(.dynstr)
		*(.plt)
		*(.iplt)
	}
}
