commit 77fc3b88fbdf805e0c2c1fc2647513cee56813a4 (tree)
parent 66b71273a2555da23f6d706c22e3d85f43fe602b
Author: Alex Rønne Petersen <alex@alexrp.com>
Date: Thu, 25 Jul 2024 01:08:03 +0200
start: Set up the gp register on mips and mips64.
Diffstat:
1 file changed, 13 insertions(+), 0 deletions(-)
diff --git a/lib/std/start.zig b/lib/std/start.zig
@@ -329,6 +329,11 @@ fn _start() callconv(.Naked) noreturn {
\\ jsr (%%pc, %%a0)
,
.mips, .mipsel =>
+ \\ bal 1f
+ \\ .gpword .
+ \\ 1:
+ \\ lw $gp, 0($ra)
+ \\ subu $gp, $ra, $gp
\\ move $fp, $0
\\ move $ra, $0
\\ move $a0, $sp
@@ -336,6 +341,14 @@ fn _start() callconv(.Naked) noreturn {
\\ j %[posixCallMainAndExit]
,
.mips64, .mips64el =>
+ \\ bal 1f
+ \\ .gpdword .
+ \\ 1:
+ // The `gp` register on MIPS serves a similar purpose to `r2` (ToC pointer) on PPC64.
+ // We need to set it up in order for dynamically-linked / position-independent code to
+ // work.
+ \\ ld $gp, 0($ra)
+ \\ dsubu $gp, $ra, $gp
\\ move $fp, $0
\\ move $ra, $0
\\ move $a0, $sp