/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2023 Alessandro Gatti
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

/* Output format is 32 bits little endian. */
OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv");

/*
 * Memory layout:
 *
 * 0x8000_0000: .text
 *   .........: .rodata
 * 0x8040_0000: .data
 *   .........: _global_pointer
 *   .........: .bss
 * 0x8060_0000: .stack
 * 0x8060_0000: _sstack
 * 0x8060_FFFF: _estack
 */
MEMORY
{
    ROM   (xr)  : ORIGIN = 0x80000000,                LENGTH = 4M
    RAM   (xrw) : ORIGIN = ORIGIN(ROM) + LENGTH(ROM), LENGTH = 2M
    STACK (rw)  : ORIGIN = ORIGIN(RAM) + LENGTH(RAM), LENGTH = 64K
}

SECTIONS
{
    /* Code + Read-Only data segment */

    .text : ALIGN (4K)
    {
        *(.start)
        *(.text)
        . = ALIGN (4K);
        *(.rodata)
        _sirodata = .;
    } > ROM

    .rodata : AT (_sirodata) ALIGN (4K)
    {
        *(.rodata)
    } > ROM

    /* Data + BSS segment */

    .data : ALIGN (4K)
    {
        *(.data)
        _sibss = .;
    } > RAM

    .bss : AT (_sibss) ALIGN (4K)
    {
        /* Mark global pointer address. */
        _global_pointer = .;

        /* Mark BSS start. */
        . = . + 4;
        _sbss = .;
        *(.bss)
        /* Mark BSS end. */
        _ebss = .;
    } > RAM

    /* Isolated stack segment. */

    .stack : ALIGN(4K)
    {
        /* Mark stack start. */
        _sstack = .;
        . = LENGTH(STACK);
        /* Mark stack end. */
        _estack = .;
    } > STACK
}
