37 lines
595 B
ArmAsm
37 lines
595 B
ArmAsm
.set noreorder
|
|
.global __clone
|
|
.hidden __clone
|
|
.type __clone,@function
|
|
__clone:
|
|
# Save function pointer and argument pointer on new thread stack
|
|
and $5, $5, -8
|
|
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)
|
|
lw $7, 20($sp)
|
|
lw $9, 24($sp)
|
|
subu $sp, $sp, 16
|
|
sw $9, 16($sp)
|
|
li $2, 4120
|
|
syscall
|
|
beq $7, $0, 1f
|
|
nop
|
|
addu $sp, $sp, 16
|
|
jr $ra
|
|
subu $2, $0, $2
|
|
1: beq $2, $0, 1f
|
|
nop
|
|
addu $sp, $sp, 16
|
|
jr $ra
|
|
nop
|
|
1: lw $25, 0($sp)
|
|
lw $4, 4($sp)
|
|
jalr $25
|
|
nop
|
|
move $4, $2
|
|
li $2, 4001
|
|
syscall
|