Index: fusl/src/thread/sh/syscall_cp.s |
diff --git a/fusl/src/thread/sh/syscall_cp.s b/fusl/src/thread/sh/syscall_cp.s |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bb848ef3b671429b101c247cf28d898b58cd66eb |
--- /dev/null |
+++ b/fusl/src/thread/sh/syscall_cp.s |
@@ -0,0 +1,45 @@ |
+.text |
+.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: |
+ mov.l @r4, r4 |
+ tst r4, r4 |
+ bf __cp_cancel |
+ mov r5, r3 |
+ mov r6, r4 |
+ mov r7, r5 |
+ mov.l @r15, r6 |
+ mov.l @(4,r15), r7 |
+ mov.l @(8,r15), r0 |
+ mov.l @(12,r15), r1 |
+ trapa #31 |
+ |
+__cp_end: |
+ ! work around hardware bug |
+ or r0, r0 |
+ or r0, r0 |
+ or r0, r0 |
+ or r0, r0 |
+ or r0, r0 |
+ |
+ rts |
+ nop |
+ |
+__cp_cancel: |
+ mov.l 2f, r0 |
+ braf r0 |
+ nop |
+1: |
+ |
+.align 2 |
+2: .long __cancel@PCREL-(1b-.) |