commit fcf42a69afdbf932a56efcf6c2d0dafc5c8faa12 Author: Daniel Dorau 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