blob: bc6b0ca221c15d72433b7fbfcd716d167f09baa1 [file] [log] [blame]
/* 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
}