commit fcf42a69afdbf932a56efcf6c2d0dafc5c8faa12
Author: Daniel Dorau <d.dorau@avm.de>
Date:   Mon Oct 21 16:26:47 2019 +0200

    Fix Backtrace aus syscall5,6,7
    
    Damit syscall5,6,7 den stack pointer nicht mehrmals ändern und damit
    der Backtracer eine falsche frame-Größe annimmt, den Syscall
    in einer separaten Assemblerfunktion durchführen.
    
    Inspririert durch:
    https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=319cbbf633ae60d7b4b89fcbb11a734f4d7d22f0

    [2021/08/06]
    Nachträglich angepasst an musl-1.1.24

Index: b/arch/mips/syscall_arch.h
===================================================================
--- a/arch/mips/syscall_arch.h
+++ b/arch/mips/syscall_arch.h
@@ -84,60 +84,36 @@ static inline long __syscall4(long n, lo
 	return r7 ? -r2 : r2;
 }
 
+extern long __mips_syscall5 (long a, long b, long c, long d, long e, long n);
+
 static inline long __syscall5(long n, long a, long b, long c, long d, long e)
 {
-	register long r4 __asm__("$4") = a;
-	register long r5 __asm__("$5") = b;
-	register long r6 __asm__("$6") = c;
-	register long r7 __asm__("$7") = d;
-	register long r8 __asm__("$8") = e;
-	register long r2 __asm__("$2") = n;
-	__asm__ __volatile__ (
-		"subu $sp,$sp,32 ; sw $8,16($sp) ; "
-		"syscall ;"
-		"addu $sp,$sp,32"
-		: "+r"(r2), "+r"(r7), "+r"(r8)
-		: "r"(r4), "r"(r5), "r"(r6)
-		: SYSCALL_CLOBBERLIST, "$9", "$10");
+	register long r7 __asm__("$7");     // a3
+	register long r2 __asm__("$2");     // v0
+
+	__mips_syscall5(a, b, c, d, e, n);
 	return r7 ? -r2 : r2;
 }
 
+extern long __mips_syscall6 (long a, long b, long c, long d, long e, long f, long n);
+
 static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
 {
-	register long r4 __asm__("$4") = a;
-	register long r5 __asm__("$5") = b;
-	register long r6 __asm__("$6") = c;
-	register long r7 __asm__("$7") = d;
-	register long r8 __asm__("$8") = e;
-	register long r9 __asm__("$9") = f;
-	register long r2 __asm__("$2") = n;
-	__asm__ __volatile__ (
-		"subu $sp,$sp,32 ; sw $8,16($sp) ; sw $9,20($sp) ; "
-		"syscall ;"
-		"addu $sp,$sp,32"
-		: "+r"(r2), "+r"(r7), "+r"(r8), "+r"(r9)
-		: "r"(r4), "r"(r5), "r"(r6)
-		: SYSCALL_CLOBBERLIST, "$10");
+	register long r7 __asm__("$7");     // a3
+	register long r2 __asm__("$2");     // v0
+
+	__mips_syscall6(a, b, c, d, e, f, n);
 	return r7 ? -r2 : r2;
 }
 
+extern long __mips_syscall7 (long a, long b, long c, long d, long e, long f, long g, long n);
+
 static inline long __syscall7(long n, long a, long b, long c, long d, long e, long f, long g)
 {
-	register long r4 __asm__("$4") = a;
-	register long r5 __asm__("$5") = b;
-	register long r6 __asm__("$6") = c;
-	register long r7 __asm__("$7") = d;
-	register long r8 __asm__("$8") = e;
-	register long r9 __asm__("$9") = f;
-	register long r10 __asm__("$10") = g;
-	register long r2 __asm__("$2") = n;
-	__asm__ __volatile__ (
-		"subu $sp,$sp,32 ; sw $8,16($sp) ; sw $9,20($sp) ; sw $10,24($sp) ; "
-		"syscall ;"
-		"addu $sp,$sp,32"
-		: "+r"(r2), "+r"(r7), "+r"(r8), "+r"(r9), "+r"(r10)
-		: "r"(r4), "r"(r5), "r"(r6)
-		: SYSCALL_CLOBBERLIST);
+	register long r7 __asm__("$7");     // a3
+	register long r2 __asm__("$2");     // v0
+
+	__mips_syscall7(a, b, c, d, e, f, g, n);
 	return r7 ? -r2 : r2;
 }
 
Index: b/src/misc/mips/syscall5.s
===================================================================
--- /dev/null
+++ b/src/misc/mips/syscall5.s
@@ -0,0 +1,12 @@
+.set	nomips16
+
+.global __mips_syscall5
+.type   __mips_syscall5,@function
+
+/* long __mips_syscall5 (long a, long b, long c, long d, long e, long n)  */
+
+__mips_syscall5:
+	lw	$v0, 20($sp)
+	syscall
+	move	$v1, $a3
+	jr	$ra
Index: b/src/misc/mips/syscall6.s
===================================================================
--- /dev/null
+++ b/src/misc/mips/syscall6.s
@@ -0,0 +1,12 @@
+.set	nomips16
+
+.global __mips_syscall6
+.type   __mips_syscall6,@function
+
+/* long __mips_syscall6 (long a, long b, long c, long d, long e, long f, long n)  */
+
+__mips_syscall6:
+	lw	$v0, 24($sp)
+	syscall
+	move	$v1, $a3
+	jr	$ra
Index: b/src/misc/mips/syscall7.s
===================================================================
--- /dev/null
+++ b/src/misc/mips/syscall7.s
@@ -0,0 +1,12 @@
+.set	nomips16
+
+.global __mips_syscall7
+.type   __mips_syscall7,@function
+
+/* long __mips_syscall7 (long a, long b, long c, long d, long e, long f, long g, long n)  */
+
+__mips_syscall7:
+	lw	$v0, 28($sp)
+	syscall
+	move	$v1, $a3
+	jr	$ra