Index: fusl/src/thread/aarch64/clone.s |
diff --git a/fusl/src/thread/aarch64/clone.s b/fusl/src/thread/aarch64/clone.s |
new file mode 100644 |
index 0000000000000000000000000000000000000000..50af913ce696796216e9d6551f92c7ac3a82dd97 |
--- /dev/null |
+++ b/fusl/src/thread/aarch64/clone.s |
@@ -0,0 +1,29 @@ |
+// __clone(func, stack, flags, arg, ptid, tls, ctid) |
+// x0, x1, w2, x3, x4, x5, x6 |
+ |
+// syscall(SYS_clone, flags, stack, ptid, tls, ctid) |
+// x8, x0, x1, x2, x3, x4 |
+ |
+.global __clone |
+.type __clone,%function |
+__clone: |
+ // align stack and save func,arg |
+ and x1,x1,#-16 |
+ stp x0,x3,[x1,#-16]! |
+ |
+ // syscall |
+ uxtw x0,w2 |
+ mov x2,x4 |
+ mov x3,x5 |
+ mov x4,x6 |
+ mov x8,#220 // SYS_clone |
+ svc #0 |
+ |
+ cbz x0,1f |
+ // parent |
+ ret |
+ // child |
+1: ldp x1,x0,[sp],#16 |
+ blr x1 |
+ mov x8,#93 // SYS_exit |
+ svc #0 |