/* SPDX-License-Identifier: GPL-2.0 */
/*
 * ld script for the c6x kernel
 *
 *  Copyright (C) 2010, 2011 Texas Instruments Incorporated
 *  Mark Salter <msalter@redhat.com>
 */
#include <asm-generic/vmlinux.lds.h>
#include <asm/thread_info.h>
#include <asm/page.h>

ENTRY(_c_int00)

#if defined(CONFIG_CPU_BIG_ENDIAN)
jiffies = jiffies_64 + 4;
#else
jiffies = jiffies_64;
#endif

#define	READONLY_SEGMENT_START	\
	. = PAGE_OFFSET;
#define	READWRITE_SEGMENT_START	\
	. = ALIGN(128);		\
	_data_lma = .;

SECTIONS
{
	/*
	 * Start kernel read only segment
	 */
	READONLY_SEGMENT_START

	.vectors :
	{
		_vectors_start = .;
		*(.vectors)
		. = ALIGN(0x400);
		_vectors_end = .;
	}

	/*
	 * This section contains data which may be shared with other
	 * cores. It needs to be a fixed offset from PAGE_OFFSET
	 * regardless of kernel configuration.
	 */
	.virtio_ipc_dev :
	{
		*(.virtio_ipc_dev)
	}

	. = ALIGN(PAGE_SIZE);
	__init_begin = .;
	.init :
	{
		_sinittext = .;
		HEAD_TEXT
		INIT_TEXT
		_einittext = .;
	}

	INIT_DATA_SECTION(16)

	PERCPU_SECTION(128)

	. = ALIGN(PAGE_SIZE);
	__init_end = .;

	.text :
	{
		_text = .;
		_stext = .;
		TEXT_TEXT
		SCHED_TEXT
		CPUIDLE_TEXT
		LOCK_TEXT
		IRQENTRY_TEXT
		SOFTIRQENTRY_TEXT
		KPROBES_TEXT
		*(.fixup)
		*(.gnu.warning)
	}

	EXCEPTION_TABLE(16)
	NOTES

	RO_DATA_SECTION(PAGE_SIZE)
	.const :
	{
		*(.const .const.* .gnu.linkonce.r.*)
		*(.switch)
	}

	. = ALIGN (8) ;
	__fdt_blob : AT(ADDR(__fdt_blob) - LOAD_OFFSET)
	{
		_fdt_start = . ;	/* place for fdt blob */
		*(__fdt_blob) ;		/* Any link-placed DTB */
		BYTE(0);		/* section always has contents */
	        . = _fdt_start + 0x4000;	/* Pad up to 16kbyte */
		_fdt_end = . ;
	}

	_etext = .;

	/*
	 * Start kernel read-write segment.
	 */
	READWRITE_SEGMENT_START
	_sdata = .;

	.fardata : AT(ADDR(.fardata) - LOAD_OFFSET)
	{
		INIT_TASK_DATA(THREAD_SIZE)
		NOSAVE_DATA
		PAGE_ALIGNED_DATA(PAGE_SIZE)
		CACHELINE_ALIGNED_DATA(128)
		READ_MOSTLY_DATA(128)
		DATA_DATA
		CONSTRUCTORS
		*(.data1)
		*(.fardata .fardata.*)
		*(.data.debug_bpt)
	}

	.neardata ALIGN(8) : AT(ADDR(.neardata) - LOAD_OFFSET)
	{
		*(.neardata2 .neardata2.* .gnu.linkonce.s2.*)
		*(.neardata .neardata.* .gnu.linkonce.s.*)
		. = ALIGN(8);
	}

	BUG_TABLE

	_edata = .;

	__bss_start = .;
	SBSS(8)
	BSS(8)
	.far :
	{
		. = ALIGN(8);
		*(.dynfar)
		*(.far .far.* .gnu.linkonce.b.*)
		. = ALIGN(8);
	}
	__bss_stop = .;

	_end = .;

	DWARF_DEBUG

	/DISCARD/ :
	{
		  EXIT_TEXT
		  EXIT_DATA
		  EXIT_CALL
		  *(.discard)
		  *(.discard.*)
		  *(.interp)
	}
}
