sw/vec: Enable WMMU sections in linker file
Change springbok.ld to add all 6 sections. Keep a no_wmmu version for
single model tests.
Also adds a global _heap_ptr that gets reset to _sheap in crt0.
Change-Id: I6036fd9fe91dfc991bc27f43f6a6054dc1aa29a4
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8b53b42..edf1a81 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,7 +32,7 @@
add_subdirectory($ENV{ROOTDIR}/sw/pigweed pw)
-set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/springbok/springbok.ld" CACHE PATH "Linker script for springbok")
+set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/springbok/springbok_no_wmmu.ld" CACHE PATH "Linker script for springbok")
set(TEST_RUNNER "${CMAKE_CURRENT_SOURCE_DIR}/scripts/test_runner.py" CACHE PATH "Test runner script path")
diff --git a/hello_vec/Makefile b/hello_vec/Makefile
index c006178..3b000db 100644
--- a/hello_vec/Makefile
+++ b/hello_vec/Makefile
@@ -24,7 +24,7 @@
LDFLAGS += -Wl,--gc-sections
LDFLAGS += -Wl,--print-memory-usage
LDFLAGS += -Wl,-Map=${BUILDDIR}/hello_vec.map
-LDFLAGS += -T${ROOTDIR}/springbok/springbok.ld
+LDFLAGS += -T${ROOTDIR}/springbok/springbok_no_wmmu.ld
CC := ${SHODANROOTDIR}/cache/toolchain_vp/bin/riscv32-unknown-elf-gcc
CPP := ${SHODANROOTDIR}/cache/toolchain_vp/bin/riscv32-unknown-elf-g++
diff --git a/springbok/crt0.S b/springbok/crt0.S
index 822fac7..21240c0 100644
--- a/springbok/crt0.S
+++ b/springbok/crt0.S
@@ -22,6 +22,8 @@
###############################################
la sp, _stack_ptr
la gp, _global_pointer
+ la s0, _sheap
+ sw s0, _heap_ptr, s1
mv tp, zero
mv t1, zero
mv t2, zero
diff --git a/springbok/springbok.ld b/springbok/springbok.ld
index 8b68fd1..a3ddc65 100644
--- a/springbok/springbok.ld
+++ b/springbok/springbok.ld
@@ -15,16 +15,20 @@
*/
TCM_LENGTH = DEFINED(__tcm_length__) ? __tcm_length__ : 4M;
+WINDOW_LENGTH = 0x1000000;
MEMORY
{
- TCM (rw) : ORIGIN = 0x34000000, LENGTH = TCM_LENGTH
+ TEXT (rx) : ORIGIN = 0x80000000, LENGTH = TCM_LENGTH
+ CONSTANT_DATA (r) : ORIGIN = 0x80000000 + WINDOW_LENGTH, LENGTH = TCM_LENGTH
+ MODEL_OUTPUT (rw) : ORIGIN = 0x80000000 + 2*WINDOW_LENGTH, LENGTH = TCM_LENGTH
+ STATIC_DATA (rw) : ORIGIN = 0x80000000 + 3*WINDOW_LENGTH, LENGTH = TCM_LENGTH
+ MODEL_INPUT (r) : ORIGIN = 0x80000000 + 4*WINDOW_LENGTH, LENGTH = TCM_LENGTH
+ TEMPORARY_DATA (rw) : ORIGIN = 0x80000000 + 5*WINDOW_LENGTH, LENGTH = TCM_LENGTH
}
+HEAP_SIZE = DEFINED(HEADP_SIZE) ? HEAP_SIZE : DEFINED(__heap_size__) ? __heap_size__ : 1M;
STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x2000;
-PROVIDE( _stack_ptr = ORIGIN(TCM) + LENGTH(TCM) - 64 );
-PROVIDE( _stack_start_sentinel = ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE );
-PROVIDE( _stack_end_sentinel = ORIGIN(TCM) + LENGTH(TCM) - 64 );
ENTRY(_start)
@@ -36,7 +40,7 @@
KEEP(*(.text._start))
*(.text*)
_etext = .;
- } > TCM
+ } > TEXT
.rodata :
{
@@ -44,14 +48,14 @@
_srodata = .;
*(.rodata*)
_erodata = .;
- } > TCM
+ } > CONSTANT_DATA
.preinit_array :
{
PROVIDE(__preinit_array_start = .);
KEEP(*(.preinit_array))
PROVIDE(__preinit_array_end = .);
- } > TCM
+ } > CONSTANT_DATA
.init_array :
{
@@ -59,7 +63,7 @@
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
PROVIDE(__init_array_end = .);
- } > TCM
+ } > CONSTANT_DATA
.fini_array :
{
@@ -67,7 +71,15 @@
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE(__fini_array_end = .);
- } > TCM
+ } > CONSTANT_DATA
+
+ .model_output :
+ {
+ . = ALIGN(64);
+ _smodel_output = .;
+ *(.model_output*)
+ _emodel_output = .;
+ } > MODEL_OUTPUT
.data :
{
@@ -76,7 +88,7 @@
_sdata = .;
*(.data*)
_edata = .;
- } > TCM
+ } > STATIC_DATA
.bss (NOLOAD) :
{
@@ -85,24 +97,28 @@
*(.bss*)
*(COMMON)
_ebss = .;
- } > TCM
+ } > TEMPORARY_DATA
.heap (NOLOAD) :
{
. = ALIGN(64);
_sheap = .;
- . = ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE - 63;
+ . = . + HEAP_SIZE;
. = ALIGN(64);
_eheap = .;
- } > TCM
+ } > TEMPORARY_DATA
- .stack ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE (NOLOAD) :
+ .stack (NOLOAD) :
{
_sstack = .;
+ PROVIDE(_stack_start_sentinel = .);
. = . + STACK_SIZE;
+ PROVIDE(_stack_ptr = .);
+ PROVIDE(_stack_end_sentinel = .);
. = ALIGN(64);
+ . = . + 64;
_estack = .;
- } > TCM
+ } > TEMPORARY_DATA
_end = .;
}
diff --git a/springbok/springbok_gloss.cpp b/springbok/springbok_gloss.cpp
index 0f55e64..8f83415 100644
--- a/springbok/springbok_gloss.cpp
+++ b/springbok/springbok_gloss.cpp
@@ -20,18 +20,23 @@
#include <springbok_intrinsics.h>
-void* __dso_handle = (void*) &__dso_handle;
+void *__dso_handle = reinterpret_cast<void *>(&__dso_handle);
+
+char *_heap_ptr; // Set to _sheap in crt0.S
extern "C" void *_sbrk(int nbytes) {
extern char _sheap, _eheap;
- static char *_heap_ptr = &_sheap;
if ((nbytes < 0) ||
(_heap_ptr + nbytes > &_eheap)) {
- springbok_simprint(SPRINGBOK_SIMPRINT_ERROR, "_sbrk failed to allocate memory. Number of bytes requested:", nbytes);
- springbok_simprint(SPRINGBOK_SIMPRINT_ERROR, "Number of unallocated bytes remaining:", static_cast<int32_t>(&_eheap - _heap_ptr));
+ springbok_simprint(
+ SPRINGBOK_SIMPRINT_ERROR,
+ "_sbrk failed to allocate memory. Number of bytes requested:", nbytes);
+ springbok_simprint(SPRINGBOK_SIMPRINT_ERROR,
+ "Number of unallocated bytes remaining:",
+ static_cast<int32_t>(&_eheap - _heap_ptr));
errno = ENOMEM;
- return (void *)-1;
+ return reinterpret_cast<void *>(-1);
}
void *base = _heap_ptr;
@@ -67,7 +72,8 @@
}
const int buffer_num = (file == STDOUT_FILENO)? 0 : 1;
- const int buffer_level = (file == STDOUT_FILENO)? SPRINGBOK_SIMPRINT_INFO : SPRINGBOK_SIMPRINT_ERROR;
+ const int buffer_level = (file == STDOUT_FILENO) ? SPRINGBOK_SIMPRINT_INFO
+ : SPRINGBOK_SIMPRINT_ERROR;
int bytes_read = 0;
char c;
@@ -78,7 +84,8 @@
if ((c == '\n') || (c == '\0')) {
_write_line_buffer[buffer_num][len] = '\0';
- springbok_simprint(buffer_level, _write_line_buffer[buffer_num], buffer_num);
+ springbok_simprint(buffer_level, _write_line_buffer[buffer_num],
+ buffer_num);
len = 0;
} else {
_write_line_buffer[buffer_num][len] = c;
@@ -86,7 +93,8 @@
if (len == 255) {
_write_line_buffer[buffer_num][len] = '\0';
- springbok_simprint(buffer_level, _write_line_buffer[buffer_num], buffer_num);
+ springbok_simprint(buffer_level, _write_line_buffer[buffer_num],
+ buffer_num);
len = 0;
}
}
@@ -139,6 +147,6 @@
free(p);
}
-extern "C" void operator delete(void *p, unsigned long c) noexcept {
+extern "C" void operator delete(void *p, uint32_t c) noexcept {
operator delete(p);
}
diff --git a/springbok/springbok_no_wmmu.ld b/springbok/springbok_no_wmmu.ld
new file mode 100644
index 0000000..2f6a194
--- /dev/null
+++ b/springbok/springbok_no_wmmu.ld
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed 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.
+ */
+
+TCM_LENGTH = DEFINED(__tcm_length__) ? __tcm_length__ : 4M;
+
+MEMORY
+{
+ TCM (rw) : ORIGIN = 0x34000000, LENGTH = TCM_LENGTH
+}
+
+STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x2000;
+PROVIDE( _stack_ptr = ORIGIN(TCM) + LENGTH(TCM) - 64 );
+PROVIDE( _stack_start_sentinel = ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE );
+PROVIDE( _stack_end_sentinel = ORIGIN(TCM) + LENGTH(TCM) - 64 );
+
+ENTRY(_start)
+
+SECTIONS
+{
+ .text :
+ {
+ _stext = .;
+ KEEP(*(.text._start))
+ *(.text*)
+ _etext = .;
+ } > TCM
+
+ .rodata :
+ {
+ . = ALIGN(64);
+ _srodata = .;
+ *(.rodata*)
+ _erodata = .;
+ } > TCM
+
+ .preinit_array :
+ {
+ PROVIDE(__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE(__preinit_array_end = .);
+ } > TCM
+
+ .init_array :
+ {
+ PROVIDE(__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE(__init_array_end = .);
+ } > TCM
+
+ .fini_array :
+ {
+ PROVIDE(__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE(__fini_array_end = .);
+ } > TCM
+
+
+ .model_output :
+ {
+ . = ALIGN(64);
+ _smodel_output = .;
+ *(.model_output*)
+ _emodel_output = .;
+ } > TCM
+
+ .data :
+ {
+ . = ALIGN(64);
+ _global_pointer = . + 0x800;
+ _sdata = .;
+ *(.data*)
+ _edata = .;
+ } > TCM
+
+ .bss (NOLOAD) :
+ {
+ . = ALIGN(64);
+ _sbss = .;
+ *(.bss*)
+ *(COMMON)
+ _ebss = .;
+ } > TCM
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(64);
+ _sheap = .;
+ . = ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE - 63;
+ . = ALIGN(64);
+ _eheap = .;
+ } > TCM
+
+ .stack ORIGIN(TCM) + LENGTH(TCM) - STACK_SIZE (NOLOAD) :
+ {
+ _sstack = .;
+ . = . + STACK_SIZE;
+ . = ALIGN(64);
+ _estack = .;
+ } > TCM
+
+ _end = .;
+}