Index: fusl/src/thread/aarch64/syscall_cp.s |
diff --git a/fusl/src/thread/aarch64/syscall_cp.s b/fusl/src/thread/aarch64/syscall_cp.s |
new file mode 100644 |
index 0000000000000000000000000000000000000000..41db68af9588a02f524fdd971ccb1737e5031a68 |
--- /dev/null |
+++ b/fusl/src/thread/aarch64/syscall_cp.s |
@@ -0,0 +1,32 @@ |
+// __syscall_cp_asm(&self->cancel, nr, u, v, w, x, y, z) |
+// x0 x1 x2 x3 x4 x5 x6 x7 |
+ |
+// syscall(nr, u, v, w, x, y, z) |
+// x8 x0 x1 x2 x3 x4 x5 |
+ |
+.global __cp_begin |
+.hidden __cp_begin |
+.global __cp_end |
+.hidden __cp_end |
+.global __cp_cancel |
+.hidden __cp_cancel |
+.hidden __cancel |
+.global __syscall_cp_asm |
+.hidden __syscall_cp_asm |
+.type __syscall_cp_asm,%function |
+__syscall_cp_asm: |
+__cp_begin: |
+ ldr w0,[x0] |
+ cbnz w0,__cp_cancel |
+ mov x8,x1 |
+ mov x0,x2 |
+ mov x1,x3 |
+ mov x2,x4 |
+ mov x3,x5 |
+ mov x4,x6 |
+ mov x5,x7 |
+ svc 0 |
+__cp_end: |
+ ret |
+__cp_cancel: |
+ b __cancel |