overhaul pthread cancellation
[musl] / src / thread / x86_64 / syscall_cp.s
diff --git a/src/thread/x86_64/syscall_cp.s b/src/thread/x86_64/syscall_cp.s
new file mode 100644 (file)
index 0000000..1894ce1
--- /dev/null
@@ -0,0 +1,24 @@
+.text
+.global __syscall_cp_asm
+.type   __syscall_cp_asm,%function
+__syscall_cp_asm:
+       lea 1f(%rip),%rax
+       mov %rax,8(%rdi)
+       mov %rsp,(%rdi)
+       mov 16(%rdi),%eax
+       test %eax,%eax
+       jnz 2f
+       mov %rsi,%rax
+       mov %rdx,%rdi
+       mov %rcx,%rsi
+       mov %r8,%rdx
+       mov %r9,%r10
+       mov 8(%rsp),%r8
+       mov 16(%rsp),%r9
+1:     syscall
+       ret
+2:     xor %edi,%edi
+       mov %rdi,8(%r10)
+       mov %rdi,(%r10)
+       dec %rdi
+       jmp pthread_exit