Move return information to model_output section
Reserves 12 bytes at the beginning of model_output to place the return
code, fault PC (if any) and length of the rest of the output.
Stores the return code and PC in _finish.
Change-Id: I16b6eb4259f0a04391e3bcc20aa8d277d989fc8d
diff --git a/springbok/crt0.S b/springbok/crt0.S
index 21240c0..1732eb8 100644
--- a/springbok/crt0.S
+++ b/springbok/crt0.S
@@ -181,17 +181,18 @@
addi sp, sp, 16
_finish:
+ # At ret we have 3 u32 values: return code, fault PC (if any), and
+ # output length (to be added with MlOutput cleanup).
+ la t0, _ret
#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)
+ # counter at _ret
+ sw a0, 0(t0)
+ csrr t1, mepc
+ sw t1, 4(t0)
#else
- # Store the application's return value onto the stack
- addi sp, sp, -4
- sw a0, 0(sp)
+ # Store the application's return value at _ret
+ sw a0, 0(t0)
#endif
1:
.word 0x0000307B # finish (encoded as custom3<func3=3>)
diff --git a/springbok/springbok.ld b/springbok/springbok.ld
index a3ddc65..df28ba8 100644
--- a/springbok/springbok.ld
+++ b/springbok/springbok.ld
@@ -77,6 +77,9 @@
{
. = ALIGN(64);
_smodel_output = .;
+ _ret = .;
+ /* Reserve 12 bytes for return information. */
+ . = . + 12;
*(.model_output*)
_emodel_output = .;
} > MODEL_OUTPUT
diff --git a/springbok/springbok_no_wmmu.ld b/springbok/springbok_no_wmmu.ld
index 2f6a194..389c616 100644
--- a/springbok/springbok_no_wmmu.ld
+++ b/springbok/springbok_no_wmmu.ld
@@ -69,11 +69,13 @@
PROVIDE(__fini_array_end = .);
} > TCM
-
.model_output :
{
. = ALIGN(64);
_smodel_output = .;
+ _ret = .;
+ /* Reserve 12 bytes for return information. */
+ . = . + 12;
*(.model_output*)
_emodel_output = .;
} > TCM