/*-
 * Copyright (c) 2003-2012 Broadcom Corporation
 * All Rights Reserved
 *
 * 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.
 * 
 * THIS SOFTWARE IS PROVIDED BY BROADCOM ``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 BROADCOM 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.
 *
 * $FreeBSD: stable/10/sys/mips/nlm/dev/net/ucore/ld.ucore.S 233545 2012-03-27 14:05:12Z jchandra $
 */

ENTRY(_start)
OUTPUT_FORMAT(elf32-tradbigmips)
__DYNAMIC  =  0;

SECTIONS
{
	. = 0x0;
	_loadaddr = .	;

	/* ----------------------------------------- */

	.text : {
		_ftext = . ;
		PROVIDE (eprol = .);
		_shim_reg = . ;
		*(.text)
		*(.text.*)
		*(.gnu.linkonce.t*)
		*(.mips16.fn.*)
		*(.mips16.call.*)
	}
	.init : {
		KEEP(*(.init))
		*(.init)
	}
	.fini : {
		*(.fini)
	}
	.rel.sdata : {
		PROVIDE (__runtime_reloc_start = .);
		*(.rel.sdata)
		PROVIDE (__runtime_reloc_stop = .);
	}
	PROVIDE (etext = .);
	.ctors    :
	{
		KEEP (*crtbegin.o(.ctors))
		KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
		KEEP (*(SORT(.ctors.*)))
		KEEP (*(.ctors))
	}
	.dtors    :
	{
		KEEP (*crtbegin.o(.dtors))
		KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
		KEEP (*(SORT(.dtors.*)))
		KEEP (*(.dtors))
	}
	. = .;
	.rodata : {
		*(.rdata)
		*(.rodata)
		*(.rodata.*)
		*(.gnu.linkonce.r*)
	}
	. = . + (0x1000 - .) ;

	/* ----------------------------------------- */

	. = 0x8000 ;
	magicstart = . ;
	.magicregs : {
		*(.magicregs)
	}
	magicend = . ;

	/* ----------------------------------------- */

	. = 0x18000 ; 		
	shmemstart = . ;
	.sharedmem : {
		*(.sharedmem)
	}
	shmemend = . ;

	/* ----------------------------------------- */

	. = 0xFF800 ;
	.data : {
		*(.data)
		*(.data.*)
		*(.gnu.linkonce.d*)
	}
	. = ALIGN(8);
	.lit8 : {
		*(.lit8)
	}
	.lit4 : {
		*(.lit4)
	}
	.sdata : {
		*(.sdata)
		*(.sdata.*)
		*(.gnu.linkonce.s*)
	}
	. = ALIGN (8);
	PROVIDE (edata  =  .);
	_edata  =  .;
	_fbss = .;
	.sbss : {
		*(.sbss)
		*(.scommon)
	}
	.bss : {
		_bss_start = . ;
		*(.bss)
		*(COMMON)
	}
	_bss_end = . ;
	_end = .;

	_gp = . ;
	__global = _gp ;
	. = ALIGN (8);

	PROVIDE(__stackmarker = .) ;

	. = 0xFFA00 ;	

	/* 32 + 4(argc) + 4(argv), aligned to 64 */
	PROVIDE(__stack =  . - 64); 

	/* ----------------------------------------- */

	. = 0xFFE00 ;
	.pktbuf : {
		*(.pktbuf)
	}
	. = . + (0x100000 - .) ;

	PROVIDE(_endaddr = 0x0 + 0x100000);
}
