summaryrefslogtreecommitdiff
path: root/src/thread/mips64/syscall_cp.s
blob: 0d4ede7635f4e8613066bd09ae85b4481d5573bc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
.set	noreorder
.global	__cp_begin
.hidden	__cp_begin
.type	__cp_begin,@function
.global	__cp_end
.hidden	__cp_end
.type	__cp_end,@function
.global	__cp_cancel
.hidden	__cp_cancel
.type	__cp_cancel,@function
.global	__cp_cancel_data
.hidden	__cp_cancel_data
.type	__cp_cancel_data,@function
.hidden	__cancel
.global	__syscall_cp_asm
.hidden	__syscall_cp_asm
.type	__syscall_cp_asm,@function
__syscall_cp_asm:
__cp_begin:
	lw	$4, 0($4)
	bne	$4, $0, __cp_cancel
	move	$2, $5
	move	$4, $6
	move	$5, $7
	move	$6, $8
	move	$7, $9
	move	$8, $10
	move	$9, $11
	ld	$10, 0($sp)
	syscall
__cp_end:
	beq	$7, $0, 1f
	nop
	dsubu	$2, $0, $2
1:	jr	$ra
	nop

	# if cancellation flag is 1 then call __cancel
__cp_cancel:
	move	$2, $ra
.align 8
	bal	1f
	nop
__cp_cancel_data:
	.gpdword __cp_cancel_data
	.gpdword __cancel
1:	ld	$3, ($ra)
	dsubu	$3, $ra, $3
	ld	$25, 8($ra)
	daddu	$25, $25, $3
	jr	$25
	move	$ra, $2