bug-mes
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]