mirror of git://git.musl-libc.org/musl
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.
This commit is contained in:
parent
2b3cc04a8d
commit
b58f738bcb
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue