MIPS requires some extra instructions to set up the $gp register for the
with a pointer to the global data area.

This isn't needed for non-PIC builds, but this patch enables the code
unconditionally to prevent bitrot.

Also enable PIC in one of the test configurations for ongoing
validation.

Signed-off-by: Thomas Weißschuh <[email protected]>
---
 tools/include/nolibc/arch-mips.h        | 7 ++++++-
 tools/testing/selftests/nolibc/Makefile | 2 +-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/tools/include/nolibc/arch-mips.h b/tools/include/nolibc/arch-mips.h
index 3a2c76716b83..e9a01847c2b8 100644
--- a/tools/include/nolibc/arch-mips.h
+++ b/tools/include/nolibc/arch-mips.h
@@ -184,10 +184,15 @@ void __attribute__((weak, noreturn, optimize("Os", 
"omit-frame-pointer"))) __no_
        __asm__ volatile (
                ".set push\n"
                ".set noreorder\n"
-               ".option pic0\n"
+               "bal 1f\n"               /* prime $ra for .cpload               
             */
+               "nop\n"
+               "1:\n"
+               ".cpload $ra\n"
                "move  $a0, $sp\n"       /* save stack pointer to $a0, as arg1 
of _start_c */
                "li    $t0, -8\n"
                "and   $sp, $sp, $t0\n"  /* $sp must be 8-byte aligned          
           */
+               "addiu $sp, $sp, -4\n"   /* space for .cprestore to store $gp   
           */
+               ".cprestore 0\n"
                "addiu $sp, $sp, -16\n"  /* the callee expects to save a0..a3 
there        */
                "jal   _start_c\n"       /* transfer to c runtime               
           */
                " nop\n"                 /* delayed slot                        
           */
diff --git a/tools/testing/selftests/nolibc/Makefile 
b/tools/testing/selftests/nolibc/Makefile
index 508435b8ac2a..484bb02d8e6c 100644
--- a/tools/testing/selftests/nolibc/Makefile
+++ b/tools/testing/selftests/nolibc/Makefile
@@ -144,7 +144,7 @@ CFLAGS_ppc = -m32 -mbig-endian -mno-vsx $(call 
cc-option,-mmultiple)
 CFLAGS_ppc64 = -m64 -mbig-endian -mno-vsx $(call cc-option,-mmultiple)
 CFLAGS_ppc64le = -m64 -mlittle-endian -mno-vsx $(call cc-option,-mabi=elfv2)
 CFLAGS_s390 = -m64
-CFLAGS_mips32le = -EL -mabi=32
+CFLAGS_mips32le = -EL -mabi=32 -fPIC
 CFLAGS_mips32be = -EB -mabi=32
 CFLAGS_STACKPROTECTOR ?= $(call cc-option,-mstack-protector-guard=global 
$(call cc-option,-fstack-protector-all))
 CFLAGS  ?= -Os -fno-ident -fno-asynchronous-unwind-tables -std=c89 -W -Wall 
-Wextra \

---
base-commit: ba335752620565c25c3028fff9496bb8ef373602
change-id: 20770914-nolibc-pic-30043ffb0403

Best regards,
-- 
Thomas Weißschuh <[email protected]>

Reply via email to