summaryrefslogtreecommitdiff
path: root/src/thread/powerpc64/syscall_cp.s
diff options
context:
space:
mode:
authorBobby Bingham <koorogi@koorogi.info>2016-04-30 19:18:17 -0500
committerRich Felker <dalias@aerifal.cx>2016-05-08 22:57:40 -0400
commitc0ede9e4046a0882d83ae4b45c7dfac86fb7c15d (patch)
tree02956e3cc93a50bcc9c946fbc2bbffb883e72f2f /src/thread/powerpc64/syscall_cp.s
parent6bc7d9c411c3a32cfa9d239b73fffb2ba66dd9ff (diff)
downloadmusl-c0ede9e4046a0882d83ae4b45c7dfac86fb7c15d.tar.gz
add powerpc64 port
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