aboutsummaryrefslogtreecommitdiff
path: root/lib/mlibc/sysdeps/linux/aarch64/cp_syscall.S
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mlibc/sysdeps/linux/aarch64/cp_syscall.S')
-rw-r--r--lib/mlibc/sysdeps/linux/aarch64/cp_syscall.S31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/mlibc/sysdeps/linux/aarch64/cp_syscall.S b/lib/mlibc/sysdeps/linux/aarch64/cp_syscall.S
new file mode 100644
index 0000000..98690c7
--- /dev/null
+++ b/lib/mlibc/sysdeps/linux/aarch64/cp_syscall.S
@@ -0,0 +1,31 @@
+.section .text
+.global __mlibc_do_asm_cp_syscall
+.global __mlibc_syscall_begin
+.global __mlibc_syscall_end
+.type __mlibc_do_asm_cp_syscall, "function"
+__mlibc_do_asm_cp_syscall:
+ mov x8, x0
+ mov x0, x1
+ mov x1, x2
+ mov x2, x3
+ mov x3, x4
+ mov x4, x5
+ mov x5, x6
+
+ mrs x7, tpidr_el0
+ ldr w7, [x7, #-80] // Tcb::cancelBits. See asserts in tcb.hpp.
+__mlibc_syscall_begin:
+ // tcbCancelEnableBit && tcbCancelTriggerBit
+ mov x9, #((1 << 0) | (1 << 2))
+ and x7, x7, x9
+ cmp x7, x9
+ b.eq cancel
+ svc 0
+__mlibc_syscall_end:
+ ret
+
+cancel:
+ bl __mlibc_do_cancel
+ brk #0
+.section .note.GNU-stack,"",%progbits
+