syscall_cp.s raw
1 .set noreorder
2 .global __cp_begin
3 .hidden __cp_begin
4 .type __cp_begin,@function
5 .global __cp_end
6 .hidden __cp_end
7 .type __cp_end,@function
8 .global __cp_cancel
9 .hidden __cp_cancel
10 .type __cp_cancel,@function
11 .global __cp_cancel_data
12 .hidden __cp_cancel_data
13 .type __cp_cancel_data,@function
14 .hidden __cancel
15 .global __syscall_cp_asm
16 .hidden __syscall_cp_asm
17 .type __syscall_cp_asm,@function
18 __syscall_cp_asm:
19 __cp_begin:
20 lw $4, 0($4)
21 bne $4, $0, __cp_cancel
22 move $2, $5
23 move $4, $6
24 move $5, $7
25 move $6, $8
26 move $7, $9
27 move $8, $10
28 move $9, $11
29 lw $10, 0($sp)
30 syscall
31 __cp_end:
32 beq $7, $0, 1f
33 nop
34 subu $2, $0, $2
35 1: jr $ra
36 nop
37
38 # if cancellation flag is 1 then call __cancel
39 __cp_cancel:
40 move $2, $ra
41 bal 1f
42 nop
43 __cp_cancel_data:
44 .gpword __cp_cancel_data
45 .gpword __cancel
46 1: lw $3, 0($ra)
47 subu $3, $ra, $3
48 lw $25, 4($ra)
49 addu $25, $25, $3
50 jr $25
51 move $ra, $2
52