From: Rich Felker Date: Thu, 12 Jul 2012 02:59:43 +0000 (-0400) Subject: fix mips clone() on real linux kernel X-Git-Tag: v0.9.3~38 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=b58f738bcb5877c83aef49129b40827a1d5ae4c7;p=oweals%2Fmusl.git fix mips clone() on real linux kernel the old code worked in qemu app-level emulation, but not on real kernels where the clone syscall does not copy the register values to the new thread. save arguments on the new thread stack instead. --- diff --git a/src/thread/mips/clone.s b/src/thread/mips/clone.s index a7c2d907..fab90dc3 100644 --- a/src/thread/mips/clone.s +++ b/src/thread/mips/clone.s @@ -2,9 +2,10 @@ .global __clone .type __clone,@function __clone: - # Save function pointer and argument pointer - move $25, $4 - move $8, $7 + # Save function pointer and argument pointer on new thread stack + subu $5, $5, 16 + sw $4, 0($5) + sw $7, 4($5) # Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,tls,ctid) move $4, $6 lw $6, 16($sp) @@ -21,6 +22,8 @@ __clone: nop jr $ra nop -1: move $4, $8 +1: lw $25, 0($sp) + lw $4, 4($sp) jr $25 + addu $sp, $sp, 16 nop