/*
 * Copyright (C) 2008 Advanced Micro Devices, Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/*
 * KERNEL_START, KERNEL_SIZE, BASE_ADDRESS, HEAP_SIZE and STACK_SIZE
 * come from KConfig
 */

ENTRY(_entry)

SECTIONS
{
	/*
	 * The trampoline to RW firmware. It goes where the kernel will go
	 * eventually since that area has to be kept clear anyway, and we'll
	 * be done with it by the time we need it for the kernel.
	 */
	. = KERNEL_START;
	_kernel_start = KERNEL_START;

	. = ALIGN(16);
	_tramp_start = .;
	.tramp.text : {
		*trampoline.o(.text)
		*trampoline.o(.text.*)
		*(.tramp.text)
		*(.tramp.text.*)
	}

	.tramp.rodata : {
		*trampoline.o(.rodata)
		*trampoline.o(.rodata.*)
		*(.tramp.rodata)
		*(.tramp.rodata.*)
	}

	.tramp.data : {
		*trampoline.o(.data)
		*trampoline.o(.data.*)
		*(.tramp.data)
		*(.tramp.data.*)
	}

	.tramp.got : {
		*trampoline.o(.got)
		*trampoline.o(.got.*)
		*(.tramp.got)
		*(.tramp.got.*)
	}

	.tramp.bss : {
		*trampoline.o(.sbss)
		*trampoline.o(.sbss.*)
		*trampoline.o(.bss)
		*trampoline.o(.bss.*)
		*trampoline.o(COMMON)
		*(.tramp.bss)
		*(.tramp.bss.*)
	}

	. = ALIGN(16);
	_tramp_stack = .;
	. += 0x200;
	_tramp_estack = .;

	_tramp_end = .;

	. = KERNEL_START + KERNEL_SIZE;
	_kernel_end = .;


	/* The main portion of depthcharge. */
	. = BASE_ADDRESS;

	. = ALIGN(16);
	_start = .;

	.cparams : {
		KEEP(*(.cparams))
	}
	.shared_data : {
		KEEP(*(.shared_data))
	}
	.gbb_copy : {
		_gbb_copy_start = .;
		. += GBB_COPY_SIZE;
		_gbb_copy_end = .;
	}

	.text : {
		*(.text._entry)
		*(.text)
		*(.text.*)
	}

	.rodata : {
		*(.rodata)
		*(.rodata.*)
	}

	.data : {
		*(.data)
		*(.data.*)

		_init_funcs_start = .;
		KEEP(*(.init_funcs))
		_init_funcs_end = .;
		 KEEP(*(SORT(.dp_list*)));
	}

	.got : {
		*(.got)
		*(.got.*)
	}

	_edata = .;

	.bss : {
		*(.sbss)
		*(.sbss.*)
		*(.bss)
		*(.bss.*)
		*(COMMON)

		/* Stack and heap */

		. = ALIGN(16);
		_heap = .;
		. += HEAP_SIZE;
		. += FASTBOOT_HEAP_SIZE;
		. = ALIGN(16);
		_eheap = .;

		_estack = .;
		. += STACK_SIZE;
		. = ALIGN(16);
		_stack = .;

		_exc_estack = .;
		. += STACK_SIZE;
		. = ALIGN(16);
		_exc_stack = .;
	}

	_end = .;

	/* Stuff we don't want in the final image. */
	/DISCARD/ : {
		*(.comment)
		*(.note*)
		*(.GCC.*)
	}
}
