summaryrefslogtreecommitdiff
path: root/arm7/asm/OS_mutex.s
blob: 981842b876aaaa2994ac07f0d89b8e173d05e05d (plain)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
	.include "asm/macros.inc"
	.include "global.inc"

    .text

	arm_func_start OSi_DequeueItem
OSi_DequeueItem: ; 0x037F99E8
	ldr	r2, [r1, #16]
	ldr	r1, [r1, #20]
	cmp	r2, #0
	streq	r1, [r0, #112]	; 0x70
	strne	r1, [r2, #20]
	cmp	r1, #0
	streq	r2, [r0, #108]	; 0x6c
	strne	r2, [r1, #16]
	bx	lr

	arm_func_start OSi_EnqueueTail
OSi_EnqueueTail: ; 0x037F9A0C
	ldr	r2, [r0, #112]	; 0x70
	cmp	r2, #0
	streq	r1, [r0, #108]	; 0x6c
	strne	r1, [r2, #16]
	str	r2, [r1, #20]
	mov	r2, #0
	str	r2, [r1, #16]
	str	r1, [r0, #112]	; 0x70
	bx	lr

	arm_func_start OSi_UnlockAllMutex
OSi_UnlockAllMutex: ; 0x037F9A30
	stmdb	sp!, {r4, r5, r6, lr}
	mov	r6, r0
	add	r5, r6, #108	; 0x6c
	mov	r4, #0
	b	_037F9A58
_037F9A44:
	mov	r0, r5
	bl	OSi_RemoveMutexLinkFromQueue
	str	r4, [r0, #12]
	str	r4, [r0, #8]
	bl	OS_WakeupThread
_037F9A58:
	ldr	r0, [r6, #108]	; 0x6c
	cmp	r0, #0
	bne	_037F9A44
	ldmia	sp!, {r4, r5, r6, lr}
	bx	lr

	arm_func_start OS_UnlockMutex
OS_UnlockMutex: ; 0x037F9A6C
	stmdb	sp!, {r4, r5, lr}
	sub	sp, sp, #4
	mov	r5, r0
	bl	OS_DisableInterrupts
	mov	r4, r0
	ldr	r0, _037F9AD8	; =OSi_ThreadInfo
	ldr	r0, [r0, #4]
	ldr	r1, [r5, #8]
	cmp	r1, r0
	bne	_037F9AC4
	ldr	r1, [r5, #12]
	sub	r1, r1, #1
	str	r1, [r5, #12]
	ldr	r1, [r5, #12]
	cmp	r1, #0
	bne	_037F9AC4
	mov	r1, r5
	bl	OSi_DequeueItem
	mov	r0, #0
	str	r0, [r5, #8]
	mov	r0, r5
	bl	OS_WakeupThread
_037F9AC4:
	mov	r0, r4
	bl	OS_RestoreInterrupts
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, lr}
	bx	lr
_037F9AD8:	.word	OSi_ThreadInfo

	arm_func_start OS_LockMutex
OS_LockMutex: ; 0x037F9ADC
	stmdb	sp!, {r4, r5, r6, r7, lr}
	sub	sp, sp, #4
	mov	r5, r0
	bl	OS_DisableInterrupts
	mov	r4, r0
	ldr	r0, _037F9B64	; =OSi_ThreadInfo
	ldr	r7, [r0, #4]
	mov	r6, #0
_037F9AFC:
	ldr	r0, [r5, #8]
	cmp	r0, #0
	bne	_037F9B28
	str	r7, [r5, #8]
	ldr	r0, [r5, #12]
	add	r0, r0, #1
	str	r0, [r5, #12]
	mov	r0, r7
	mov	r1, r5
	bl	OSi_EnqueueTail
	b	_037F9B50
_037F9B28:
	cmp	r0, r7
	ldreq	r0, [r5, #12]
	addeq	r0, r0, #1
	streq	r0, [r5, #12]
	beq	_037F9B50
	str	r5, [r7, #104]	; 0x68
	mov	r0, r5
	bl	OS_SleepThread
	str	r6, [r7, #104]	; 0x68
	b	_037F9AFC
_037F9B50:
	mov	r0, r4
	bl	OS_RestoreInterrupts
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, lr}
	bx	lr
_037F9B64:	.word	OSi_ThreadInfo

	arm_func_start OS_InitMutex
OS_InitMutex: ; 0x037F9B68
	mov	r2, #0
	str	r2, [r0, #4]
	ldr	r1, [r0, #4]
	str	r1, [r0]
	str	r2, [r0, #8]
	str	r2, [r0, #12]
	bx	lr