Index: fusl/src/thread/mips/clone.s |
diff --git a/fusl/src/thread/mips/clone.s b/fusl/src/thread/mips/clone.s |
new file mode 100644 |
index 0000000000000000000000000000000000000000..37dddf57ba9575c9e849b03ad195b0caea1ddf4a |
--- /dev/null |
+++ b/fusl/src/thread/mips/clone.s |
@@ -0,0 +1,32 @@ |
+.set noreorder |
+.global __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) |
+ jr $25 |
+ nop |