[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] riscv: lib: make long jumps to __init_io and main
From: |
Ekaitz Zarraga |
Subject: |
[PATCH] riscv: lib: make long jumps to __init_io and main |
Date: |
Tue, 16 Apr 2024 12:48:21 +0200 |
`jalr` only supports 20 bit offsets that happened not to be enough when
building large programs. The jumps fell too short and that caused a
segfault. Making a C call instead, lets the compiler use an `auipc` +
`jalr` combination, enabling longer jumps.
* lib/linux/riscv64-mes-gcc/crt1.c (__init_io, main): Move out of
extended asm to take advantage of call relocations.
---
lib/linux/riscv64-mes-gcc/crt1.c | 24 +++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/lib/linux/riscv64-mes-gcc/crt1.c b/lib/linux/riscv64-mes-gcc/crt1.c
index 3f3d7ce8..e1e97efe 100644
--- a/lib/linux/riscv64-mes-gcc/crt1.c
+++ b/lib/linux/riscv64-mes-gcc/crt1.c
@@ -34,6 +34,9 @@ int main (int argc, char *argv[], char *envp[]);
void
_start ()
{
+ int argc, retval;
+ char ** argv;
+ char ** envp;
asm (
".option push\n\t"
".option norelax\n\t"
@@ -50,17 +53,20 @@ _start ()
"slli t0, t0, 3\n\t"
"add t0, t1, t0\n\t"
- "lw a0, 0(s0)\n\t" // a0 argc
- "addi a1, s0, 8\n\t" // a1 argv
- "mv a2, t0\n\t" // a2 envp
- "jal __init_io\n\t"
- "jal main\n\t"
-
+ "lw %[a0], 0(s0)\n\t" // a0 argc
+ "addi %[a1], s0, 8\n\t" // a1 argv
+ "mv %[a2], t0\n\t" // a2 envp
+ : [a0] "r" (argc), [a1] "r" (argv), [a2] "r" (envp)
+ : "r" (environ)
+ );
+ __init_io();
+ retval = main(argc, argv, envp);
+ asm (
+ "mv a0, %1\n\t"
"li a7, 93\n\t" // SYS_exit
"ecall\n\t" // exit(return value from main)
-
"ebreak\n\t"
: //no outputs ""
- : "r" (environ)
- );
+ : "r" (environ), "r" (retval)
+ );
}
--
2.41.0
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] riscv: lib: make long jumps to __init_io and main,
Ekaitz Zarraga <=