/****************************************************************************
 * boards/arm/lpc31xx/ea3131/scripts/pg-ld.script
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.  The
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the
 * License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 ****************************************************************************/

/* The LPC3131 has 192Kb of ISRAM beginning at virtual address 0x1102:8000.
 * LPC31xx boot ROM expects the boot image be compiled with entry point at
 * 0x1102:9000.  A 128b header will appear at this address (applied by
 * lpc313xImgCreator) and the executable code must begin at 0x1102:9080.
 *
 * The .text virtual address space begins at the same location as the physical
 * address space:  0x1102 8000.  The virtual space is broken up into three
 * regions:
 *
 *                                           PHYSICAL         VIRTUAL
 *   NAME    DESCRIPTION                 SIZE    START    SIZE    START
 *  -------- -------------------------- ----- ----------- ------- -----------
 *   locked  Pages locked in memory.     48Kb 0x1102 8000  48Kb   0x1102 8000
 *   paged   Pages in nonvolatile store. 96Kb 0x1103 4000 384Kb   0x1103 4000
 *   data    .data/.bss/heap.            32Kb 0x1104 c000  32Kb   0x1109 4000
 *           Reserved for page table     16Kb 0x1105 4000  16Kb   0x1109 c000
 *  -------- -------------------------- ----- ----------- ------- -----------
 *                                       192Kb 0x1105 8000 480Kb   0x110a 0000
 *
 * These region sizes must match the size in pages specified for each region
 * in the NuttX configuration file:  CONFIG_PAGING_NLOCKED, CONFIG_PAGING_NVPAGED,
 * and CONFIG_PAGING_NDATA.
 *
 * NOTE 1: The locked region is really big here so that you can enable lots of
 * debug output without overflowing the locked region.  32Kb would probably be
 * plenty if this were a real, optimized application.
 *
 * NOTE 2: Different compilers will compile the code to different sizes.  If you
 * get a link time error saying that the locked region is full, you may have to
 * re-organize this memory layout (here and in defconfig) to make the locked
 * region even bigger.
 */

MEMORY
{
  locked (rx) : ORIGIN = 0x11029080, LENGTH = 52K - 4224
  paged  (rx) : ORIGIN = 0x11035000, LENGTH = 380K
  data   (rw) : ORIGIN = 0x11094000, LENGTH = 44K
}

OUTPUT_ARCH(arm)
ENTRY(_stext)
SECTIONS
{
    .locked : {
        _slocked = ABSOLUTE(.);
        *(.vectors)
        arm_head.o locked.r (.text .text.*)
        arm_head.o locked.r (.fixup)
        arm_head.o locked.r (.gnu.warning)
        arm_head.o locked.r (.rodata .rodata.*)
        arm_head.o locked.r (.gnu.linkonce.t.*)
        arm_head.o locked.r (.glue_7)
        arm_head.o locked.r (.glue_7t)
        arm_head.o locked.r (.got)
        arm_head.o locked.r (.gcc_except_table)
        arm_head.o locked.r (.gnu.linkonce.r.*)
        _elocked = ABSOLUTE(.);
    } >locked

    .init_section : {
        _sinit = ABSOLUTE(.);
        KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
        KEEP(*(.init_array .ctors))
        _einit = ABSOLUTE(.);
    } > locked

    .ARM.extab : {
        *(.ARM.extab*)
    } > locked

    __exidx_start = ABSOLUTE(.);
    .ARM.exidx : {
        *(.ARM.exidx*)
    } > locked
    __exidx_end = ABSOLUTE(.);

    _eronly = ABSOLUTE(.);

    .paged : {
        _spaged = ABSOLUTE(.);
        *(.text .text.*)
        *(.fixup)
        *(.gnu.warning)
        *(.rodata .rodata.*)
        *(.gnu.linkonce.t.*)
        *(.glue_7)
        *(.glue_7t)
        *(.got)
        *(.gcc_except_table)
        *(.gnu.linkonce.r.*)
        _epaged = ABSOLUTE(.);
    } > paged

    .data : {
        _sdata = ABSOLUTE(.);
        *(.data .data.*)
        *(.gnu.linkonce.d.*)
        CONSTRUCTORS
        . = ALIGN(4);
        _edata = ABSOLUTE(.);
    } > data AT > locked

    .bss : {
        _sbss = ABSOLUTE(.);
        *(.bss .bss.*)
        *(.gnu.linkonce.b.*)
        *(COMMON)
        . = ALIGN(4);
        _ebss = ABSOLUTE(.);
    } > data
                    /* 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) }
    .debug_abbrev 0 : { *(.debug_abbrev) }
    .debug_info 0 : { *(.debug_info) }
    .debug_line 0 : { *(.debug_line) }
    .debug_pubnames 0 : { *(.debug_pubnames) }
    .debug_aranges 0 : { *(.debug_aranges) }
}
