/* SPDX-License-Identifier: BSD-3-Clause */

/******************************************************************************
*
* Copyright (C) 2012-2018 Texas Instruments Incorporated - http://www.ti.com/
*
******************************************************************************/

MEMORY {
	MAIN_FLASH (RX) : ORIGIN = 0x00000000, LENGTH = 0x00200000
	INFO_FLASH (RX) : ORIGIN = 0x00200000, LENGTH = 0x00008000
	SRAM_CODE_0(RWX): ORIGIN = 0x01000000, LENGTH = 0x00000110
	SRAM_CODE_1(RWX): ORIGIN = 0x01000110, LENGTH = 0x00000030
	SRAM_CODE_2(RWX): ORIGIN = 0x01000150, LENGTH = 0x00000040
	SRAM_CODE_3(RWX): ORIGIN = 0x01000190, LENGTH = 0x00001E70
	SRAM_CODE_4(RWX): ORIGIN = 0x01002000, LENGTH = 0x00000200
	SRAM_DATA  (RW) : ORIGIN = 0x20002000, LENGTH = 0x00001000
}

REGION_ALIAS("REGION_INTVECT", SRAM_CODE_0);
REGION_ALIAS("REGION_RESET", SRAM_CODE_1);
REGION_ALIAS("REGION_DESCRIPTOR", SRAM_CODE_2);
REGION_ALIAS("REGION_TEXT", SRAM_CODE_3);
REGION_ALIAS("REGION_BSS", SRAM_CODE_3);
REGION_ALIAS("REGION_DATA", SRAM_DATA);
REGION_ALIAS("REGION_STACK", SRAM_CODE_4);
REGION_ALIAS("REGION_HEAP", SRAM_DATA);
REGION_ALIAS("REGION_ARM_EXIDX", SRAM_CODE_3);
REGION_ALIAS("REGION_ARM_EXTAB", SRAM_CODE_3);

SECTIONS {
	/* section for the interrupt vector area */
	.intvecs : {
		KEEP (*(.intvecs))
	} > REGION_INTVECT

	PROVIDE (_vtable_base_address =
		DEFINED(_vtable_base_address) ? _vtable_base_address : 0x20000000);

	.vtable (_vtable_base_address) : AT (_vtable_base_address) {
		KEEP (*(.vtable))
	} > REGION_DATA

	.descriptor :{
		FILL(0x00000000);
		. = ORIGIN(REGION_DESCRIPTOR) + LENGTH(REGION_DESCRIPTOR) - 1;
		BYTE(0x00);
		__ROM_AT = .;
	} > REGION_DESCRIPTOR

	.reset : {
		KEEP(*(.reset))
	} > REGION_RESET AT> REGION_RESET

	.text : {
		CREATE_OBJECT_SYMBOLS
		KEEP (*(.text))
		*(.text.*)
		. = ALIGN(0x4);
		KEEP (*(.ctors))
		. = ALIGN(0x4);
		KEEP (*(.dtors))
		. = ALIGN(0x4);
		__init_array_start = .;
		KEEP (*(.init_array*))
		__init_array_end = .;
		KEEP (*(.init))
		KEEP (*(.fini*))
	} > REGION_TEXT AT> REGION_TEXT

	.rodata : {
		*(.rodata)
		*(.rodata.*)
	} > REGION_TEXT AT> REGION_TEXT

	.ARM.exidx : {
		__exidx_start = .;
		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
		__exidx_end = .;
	} > REGION_ARM_EXIDX AT> REGION_ARM_EXIDX

	.ARM.extab : {
		KEEP (*(.ARM.extab* .gnu.linkonce.armextab.*))
	} > REGION_ARM_EXTAB AT> REGION_ARM_EXTAB

	__etext = .;

	.data : {
		__data_load__ = LOADADDR (.data);
		__data_start__ = .;
		KEEP (*(.data))
		KEEP (*(.data*))
		. = ALIGN (4);
		__data_end__ = .;
	} > REGION_DATA AT> REGION_TEXT

	.bss : {
		__bss_start__ = .;
		*(.shbss)
		KEEP (*(.bss))
		*(.bss.*)
		*(COMMON)
		. = ALIGN (4);
		__bss_end__ = .;
	} > REGION_BSS AT> REGION_BSS

	.heap : {
		__heap_start__ = .;
		end = __heap_start__;
		_end = end;
		__end = end;
		KEEP (*(.heap))
		__heap_end__ = .;
		__HeapLimit = __heap_end__;
	} > REGION_HEAP AT> REGION_HEAP

	.stack (NOLOAD) : ALIGN(0x8) {
		_stack = .;
		KEEP(*(.stack))
	} > REGION_STACK AT> REGION_STACK

	__stack_top = ORIGIN(REGION_STACK) + LENGTH(REGION_STACK);
	PROVIDE(__stack = __stack_top);
}
