Make the ISA extension init code paths optional in crt0.S
Having the ability to disable these extension-specific code paths is
necessary for low-level hardware development and unit testing.
This CL also removes irq_vector.S as it 1) was resulting in undefined
symbol errors when disabling exceptions, 2) wasn't actually being
actively used by crt0.S (rather than pointing the mtvec CSR to the
indirect jump table in irq_vector.S, crt0.S was setting it directly to
the exception handler in crt0.S; irq_vector.S was in effect only used
for resets and the jump table defined was never used at all), and 3)
isn't plan of record to support interrupts on Springbok anyway.
Change-Id: Idfb5cc45b76db1f664b1d953f4a7c2c8a5f1d174
diff --git a/springbok/CMakeLists.txt b/springbok/CMakeLists.txt
index a3261e4..365e1ac 100644
--- a/springbok/CMakeLists.txt
+++ b/springbok/CMakeLists.txt
@@ -6,7 +6,6 @@
target_sources(springbok_intrinsic
PRIVATE
crt0.S
- irq_vector.S
springbok_gloss.cpp
springbok.cpp
)
diff --git a/springbok/crt0.S b/springbok/crt0.S
index 68351ce..5adebba 100644
--- a/springbok/crt0.S
+++ b/springbok/crt0.S
@@ -34,6 +34,7 @@
mv t5, zero
mv t6, zero
+#ifndef LIBSPRINGBOK_NO_VECTOR_SUPPORT
###############################################
# Put all vector registers into a known state #
###############################################
@@ -56,7 +57,9 @@
# Set vector extension to "clean"
xori a0, a0, 0x600
csrw mstatus, a0
+#endif
+#ifndef LIBSPRINGBOK_NO_FLOAT_SUPPORT
###############################################################
# Reset all other CSRs, and perform any other processor setup #
###############################################################
@@ -65,8 +68,12 @@
li a1, 0x2000
or a0, a0, a1
csrw mstatus, a0
+#endif
+
+#ifndef LIBSPRINGBOK_NO_EXCEPTION_SUPPORT
la a0, exception_handler
csrw mtvec, a0
+#endif
#############################################################
# Set up stack sentinels #
@@ -157,11 +164,18 @@
addi sp, sp, 16
_finish:
- # Store the application's return value onto the stack
+#ifndef LIBSPRINGBOK_NO_EXCEPTION_SUPPORT
+ # Store the application's return value and machine exception program
+ # counter onto the stack
addi sp, sp, -8
sw a0, 0(sp)
csrr t0, mepc
sw t0, 4(sp)
+#else
+ # Store the application's return value onto the stack
+ addi sp, sp, -4
+ sw a0, 0(sp)
+#endif
1:
.word 0x0000307B # finish (encoded as custom3<func3=3>)
j 1b
@@ -242,6 +256,7 @@
2: li a0, 1
ret
+#ifndef LIBSPRINGBOK_NO_EXCEPTION_SUPPORT
.weak exception_handler
exception_handler:
# Exception occurred
@@ -274,3 +289,4 @@
.weak print_csrs
print_csrs:
mret
+#endif
diff --git a/springbok/irq_vector.S b/springbok/irq_vector.S
deleted file mode 100644
index 1787f67..0000000
--- a/springbok/irq_vector.S
+++ /dev/null
@@ -1,8 +0,0 @@
- // Exception handler.
- .section .vectors, "ax"
- .option norvc
- .option push
- .option norelax
- .org 0x00
- j _start
- j exception_handler
diff --git a/springbok/matcha.ld b/springbok/matcha.ld
index ab5d339..639f700 100644
--- a/springbok/matcha.ld
+++ b/springbok/matcha.ld
@@ -13,14 +13,10 @@
PROVIDE( _stack_start_sentinel = ORIGIN(DTCM) + LENGTH(DTCM) - STACK_SIZE );
PROVIDE( _stack_end_sentinel = ORIGIN(DTCM) + LENGTH(DTCM) - 64 );
-_boot_address = ORIGIN(ITCM);
-ENTRY(_boot_address)
+ENTRY(_start)
SECTIONS
{
- .vectors _boot_address : ALIGN(4) {
- KEEP(*(.vectors))
- } > ITCM
.text :
{
_stext = .;
diff --git a/springbok/springbok.cpp b/springbok/springbok.cpp
index 514eda0..d6d659e 100644
--- a/springbok/springbok.cpp
+++ b/springbok/springbok.cpp
@@ -1,6 +1,8 @@
#include <stdint.h>
#include "springbok.h"
+#ifndef LIBSPRINGBOK_NO_EXCEPTION_SUPPORT
+
extern "C" void print_csrs(void) {
uint32_t mcause;
uint32_t mepc;
@@ -40,6 +42,10 @@
LOG_ERROR("MIMPID:\t\t0x%08X", static_cast<unsigned int>(mimpid));
}
+#endif
+
+#ifndef LIBSPRINGBOK_NO_FLOAT_SUPPORT
+
// Helper function for float_to_str. Copies a string into the output buffer.
static void print_str(char *buffer, const int len, int *l, const char *str) {
for (int i = 0; str[i] != '\0'; i++) {
@@ -222,3 +228,13 @@
// Return the number of characters needed for display.
return l;
}
+
+#else // defined(LIBSPRINGBOK_NO_FLOAT_SUPPORT)
+
+extern "C" int float_to_str(const int len, char *buffer, const float value) {
+ // Dummy function since float support is disabled in libspringbok
+ LOG_ERROR("float_to_str is disabled because libspringbok was compiled without float support");
+ return 0;
+}
+
+#endif