about summary refs log tree commit diff
path: root/src/thread/powerpc64/syscall_cp.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread/powerpc64/syscall_cp.s')
-rw-r--r--src/thread/powerpc64/syscall_cp.s37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/thread/powerpc64/syscall_cp.s b/src/thread/powerpc64/syscall_cp.s
new file mode 100644
index 00000000..d420dbde
--- /dev/null
+++ b/src/thread/powerpc64/syscall_cp.s
@@ -0,0 +1,37 @@
+	.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
+	.text
+	.type   __syscall_cp_asm,%function
+__syscall_cp_asm:
+	# at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th
+__cp_begin:
+	# if (self->cancel) goto __cp_cancel
+	lwz   0, 0(3)
+	cmpwi cr7, 0, 0
+	bne-  cr7, __cp_cancel
+
+	# make syscall
+	mr    0,  4
+	mr    3,  5
+	mr    4,  6
+	mr    5,  7
+	mr    6,  8
+	mr    7,  9
+	mr    8, 10
+	sc
+
+__cp_end:
+	# return error ? -r3 : r3
+	bnslr+
+	neg 3, 3
+	blr
+
+__cp_cancel:
+	b __cancel