summaryrefslogtreecommitdiff
path: root/arm9/asm/OS_mutex.s
blob: 0970a10d6229ab8222ecfb346fbdb7f57a769b03 (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
    .include "asm/macros.inc"
    .include "global.inc"

    .text

	arm_func_start OSi_DequeueItem
OSi_DequeueItem: ; 0x020CBE9C
	ldr r2, [r1, #0x10]
	ldr r1, [r1, #0x14]
	cmp r2, #0x0
	streq r1, [r0, #0x8c]
	strne r1, [r2, #0x14]
	cmp r1, #0x0
	streq r2, [r0, #0x88]
	strne r2, [r1, #0x10]
	bx lr

	arm_func_start OSi_EnqueueTail
OSi_EnqueueTail: ; 0x020CBEC0
	ldr r2, [r0, #0x8c]
	cmp r2, #0x0
	streq r1, [r0, #0x88]
	strne r1, [r2, #0x10]
	str r2, [r1, #0x14]
	mov r2, #0x0
	str r2, [r1, #0x10]
	str r1, [r0, #0x8c]
	bx lr

	arm_func_start OS_TryLockMutex
OS_TryLockMutex: ; 0x020CBEE4
	stmdb sp!, {r4-r6,lr}
	mov r5, r0
	bl OS_DisableInterrupts
	ldr r2, [r5, #0x8]
	ldr r1, _020CBF54 ; =OSi_ThreadInfo
	mov r4, r0
	cmp r2, #0x0
	ldr r0, [r1, #0x4]
	bne _020CBF28
	str r0, [r5, #0x8]
	ldr r2, [r5, #0xc]
	mov r1, r5
	add r2, r2, #0x1
	str r2, [r5, #0xc]
	bl OSi_EnqueueTail
	mov r6, #0x1
	b _020CBF40
_020CBF28:
	cmp r2, r0
	ldreq r0, [r5, #0xc]
	moveq r6, #0x1
	addeq r0, r0, #0x1
	streq r0, [r5, #0xc]
	movne r6, #0x0
_020CBF40:
	mov r0, r4
	bl OS_RestoreInterrupts
	mov r0, r6
	ldmia sp!, {r4-r6,lr}
	bx lr
	.balign 4
_020CBF54: .word OSi_ThreadInfo

	arm_func_start OSi_UnlockAllMutex
OSi_UnlockAllMutex: ; 0x020CBF58
	stmdb sp!, {r4-r6,lr}
	mov r6, r0
	ldr r0, [r6, #0x88]
	cmp r0, #0x0
	ldmeqia sp!, {r4-r6,lr}
	bxeq lr
	add r5, r6, #0x88
	mov r4, #0x0
_020CBF78:
	mov r0, r5
	bl OSi_RemoveMutexLinkFromQueue
	str r4, [r0, #0xc]
	str r4, [r0, #0x8]
	bl OS_WakeupThread
	ldr r0, [r6, #0x88]
	cmp r0, #0x0
	bne _020CBF78
	ldmia sp!, {r4-r6,lr}
	bx lr

	arm_func_start OS_UnlockMutex
OS_UnlockMutex: ; 0x020CBFA0
	stmdb sp!, {r4-r5,lr}
	sub sp, sp, #0x4
	mov r5, r0
	bl OS_DisableInterrupts
	ldr r1, _020CC00C ; =OSi_ThreadInfo
	mov r4, r0
	ldr r0, [r1, #0x4]
	ldr r1, [r5, #0x8]
	cmp r1, r0
	bne _020CBFF8
	ldr r1, [r5, #0xc]
	sub r1, r1, #0x1
	str r1, [r5, #0xc]
	ldr r1, [r5, #0xc]
	cmp r1, #0x0
	bne _020CBFF8
	mov r1, r5
	bl OSi_DequeueItem
	mov r1, #0x0
	mov r0, r5
	str r1, [r5, #0x8]
	bl OS_WakeupThread
_020CBFF8:
	mov r0, r4
	bl OS_RestoreInterrupts
	add sp, sp, #0x4
	ldmia sp!, {r4-r5,lr}
	bx lr
	.balign 4
_020CC00C: .word OSi_ThreadInfo

	arm_func_start OS_LockMutex
OS_LockMutex: ; 0x020CC010
	stmdb sp!, {r4-r7,lr}
	sub sp, sp, #0x4
	mov r5, r0
	bl OS_DisableInterrupts
	ldr r1, _020CC098 ; =OSi_ThreadInfo
	mov r4, r0
	ldr r7, [r1, #0x4]
	mov r6, #0x0
_020CC030:
	ldr r0, [r5, #0x8]
	cmp r0, #0x0
	bne _020CC05C
	str r7, [r5, #0x8]
	ldr r1, [r5, #0xc]
	mov r0, r7
	add r2, r1, #0x1
	mov r1, r5
	str r2, [r5, #0xc]
	bl OSi_EnqueueTail
	b _020CC084
_020CC05C:
	cmp r0, r7
	ldreq r0, [r5, #0xc]
	addeq r0, r0, #0x1
	streq r0, [r5, #0xc]
	beq _020CC084
	mov r0, r5
	str r5, [r7, #0x84]
	bl OS_SleepThread
	str r6, [r7, #0x84]
	b _020CC030
_020CC084:
	mov r0, r4
	bl OS_RestoreInterrupts
	add sp, sp, #0x4
	ldmia sp!, {r4-r7,lr}
	bx lr
	.balign 4
_020CC098: .word OSi_ThreadInfo

	arm_func_start OS_InitMutex
OS_InitMutex: ; 0x020CC09C
	mov r2, #0x0
	str r2, [r0, #0x4]
	ldr r1, [r0, #0x4]
	str r1, [r0, #0x0]
	str r2, [r0, #0x8]
	str r2, [r0, #0xc]
	bx lr