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
|