/* Copyright 2025 Google LLC. */
/* Licensed under the Apache License, Version 2.0, see LICENSE for details. */
/* SPDX-License-Identifier: Apache-2.0 */

MEMORY {
    ITCM(rx): ORIGIN = 0x00000000, LENGTH = 8K
    DTCM(rw): ORIGIN = 0x00010000, LENGTH = 32K
}

STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x80;
__stack_size = STACK_SIZE;
__stack_shift = 7;
__boot_hart = 0;
HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x80;

ENTRY(_start)

SECTIONS {
    /* ITCM data here */
    . = ORIGIN(ITCM);
    .text : ALIGN(16) {
        *(._init)
        *(.text)
        *(.text.*)
        . = ALIGN(16);
    } > ITCM

    .init.array : ALIGN(16) {
      __init_array_start = .;
      __init_array_start__ = .;
      *(.init_array)
      *(.init_array.*)
      . = ALIGN(16);
      __init_array_end = .;
      __init_array_end__ = .;
    } > ITCM

    .rodata : ALIGN(16) {
      *(.srodata)
      *(.srodata.*)
      *(.rodata)
      *(.rodata.*)
      . = ALIGN(16);
    } > ITCM

    /* Static Thread Local Storage template */
    .tdata : {
        PROVIDE_HIDDEN (__tdata_start = .);
        *(.tdata .tdata.*)
        *(.gnu.linkonce.td.*)
        PROVIDE_HIDDEN (__tdata_end = .);
    } > DTCM
    PROVIDE (__tdata_size = SIZEOF (.tdata));

    .tbss (NOLOAD) : {
        PROVIDE_HIDDEN (__tbss_start = .);
        PROVIDE_HIDDEN (__tbss_offset = ABSOLUTE (__tbss_start - __tdata_start));
        *(.tbss .tbss.*)
        *(.gnu.linkonce.tb.*)
        *(.tcommon)
        PROVIDE_HIDDEN (__tbss_end = .);
    } > DTCM
    PROVIDE (__tbss_size = SIZEOF (.tbss));

    .data : ALIGN(16) {
      __data_start__ = .;
      /**
      * This will get loaded into `gp`, and the linker will use that register for
      * accessing data within [-2048,2047] of `__global_pointer$`.
      *
      * This is much cheaper (for small data) than materializing the
      * address and loading from that (which will take one extra instruction).
      */
      _global_pointer = . + 0x800;
      __global_pointer$ = . + 0x800;
      *(.sdata)
      *(.sdata.*)
      *(.data)
      *(.data.*)
      /**
       * Memory location for the return value from main,
       * which could be inspected by another core in the system.
       **/
      . = ALIGN(4);
      _ret = .;
      . += 4;
      . = ALIGN(16);
      __data_end__ = .;
      _edata = .;
    } > DTCM

    /* DTCM data here */
    . = ORIGIN(DTCM);
    .bss : ALIGN(16) {
      __bss_start__ = .;
      __bss_start = .;
      *(.sbss)
      *(.sbss.*)
      *(.bss)
      *(.bss.*)
      __bss_end__ = .;
      __bss_end = .;
      _end = .;
    } > DTCM

    .heap : ALIGN(16) {
      __heap_start__ = .;
      _heap_ptr = .;
      . += HEAP_SIZE;
      __heap_end__ = .;
      __heap_end = .;
    } > DTCM

    .stack : ALIGN(16) {
      __stack_start__ = .;
      __stack_start = .;
      . += STACK_SIZE;
      __stack_end__ = .;
    } > DTCM
}