summaryrefslogtreecommitdiff
path: root/arm9/asm/MSL_ARM_abort_exit.s
blob: 1128f4e8fea6512ecbd72abd45dff1b3b74171df (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
	.include "asm/macros.inc"
	.include "global.inc"

	.bss

	.global __console_exit
__console_exit: ; 0x021D6F78
	.space 0x4
	.size __console_exit,.-__console_exit

	.global __stdio_exit
__stdio_exit: ; 0x021D6F7C
	.space 0x4
	.size __stdio_exit,.-__stdio_exit

	.global __atexit_curr_func
__atexit_curr_func: ; 0x021D6F80
	.space 0x4
	.size __atexit_curr_func,.-__atexit_curr_func

	.global __aborting
__aborting: ; 0x021D6F84
	.space 0x4
	.size __aborting,.-__aborting

	.global __atexit_funcs
__atexit_funcs: ; 0x021D6F88
	.space 0x100
	.size __atexit_funcs,.-__atexit_funcs

	.text

	arm_func_start abort
abort: ; 0x020DE14C
	stmdb sp!, {r3,lr}
	mov r0, #0x1
	bl raise
	ldr r1, _020DE16C ; =__aborting - 0xC
	mov r0, #0x1
	str r0, [r1, #0xc]
	bl exit
	ldmia sp!, {r3,pc}
	.balign 4
_020DE16C: .word __aborting - 0xC
	arm_func_end abort

	arm_func_start exit
exit: ; 0x020DE170
	stmdb sp!, {r4,lr}
	ldr r1, _020DE1B8 ; =__aborting - 0xC
	mov r4, r0
	ldr r0, [r1, #0xc]
	cmp r0, #0x0
	bne _020DE1AC
	bl __destroy_global_chain
	ldr r0, _020DE1B8 ; =__stdio_exit - 0x4
	ldr r0, [r0, #0x4]
	cmp r0, #0x0
	beq _020DE1AC
	blx r0
	ldr r0, _020DE1B8 ; =__stdio_exit - 0x4
	mov r1, #0x0
	str r1, [r0, #0x4]
_020DE1AC:
	mov r0, r4
	bl __exit
	ldmia sp!, {r4,pc}
	.balign 4
_020DE1B8: .word __console_exit
	arm_func_end exit

	arm_func_start __exit
__exit: ; 0x020DE1BC
	stmdb sp!, {r3-r5,lr}
	ldr r0, _020DE2CC ; =__cs
	bl OS_TryLockMutex
	cmp r0, #0x0
	bne _020DE1F4
	ldr r0, _020DE2D0 ; =OSi_ThreadInfo
	ldr r1, _020DE2D4 ; =__cs_id
	ldr r2, [r0, #0x4]
	ldr r0, _020DE2D8 ; =__cs_ref
	ldr r3, [r2, #0x6c]
	mov r2, #0x1
	str r3, [r1, #0x0]
	str r2, [r0, #0x0]
	b _020DE24C
_020DE1F4:
	ldr r0, _020DE2D0 ; =OSi_ThreadInfo
	ldr r1, _020DE2D4 ; =__cs_id
	ldr r0, [r0, #0x4]
	ldr r1, [r1, #0x0]
	ldr r0, [r0, #0x6c]
	cmp r1, r0
	bne _020DE224
	ldr r0, _020DE2D8 ; =__cs_ref
	ldr r1, [r0, #0x0]
	add r1, r1, #0x1
	str r1, [r0, #0x0]
	b _020DE24C
_020DE224:
	ldr r0, _020DE2CC ; =__cs
	bl OS_LockMutex
	ldr r0, _020DE2D0 ; =OSi_ThreadInfo
	ldr r1, _020DE2D4 ; =__cs_id
	ldr r2, [r0, #0x4]
	ldr r0, _020DE2D8 ; =__cs_ref
	ldr r3, [r2, #0x6c]
	mov r2, #0x1
	str r3, [r1, #0x0]
	str r2, [r0, #0x0]
_020DE24C:
	ldr r4, _020DE2DC ; =__console_exit
	ldr r0, [r4, #0x8]
	cmp r0, #0x0
	ble _020DE280
	ldr r5, _020DE2E0 ; =__atexit_funcs
_020DE260:
	ldr r0, [r4, #0x8]
	sub r1, r0, #0x1
	ldr r0, [r5, r1, lsl #0x2]
	str r1, [r4, #0x8]
	blx r0
	ldr r0, [r4, #0x8]
	cmp r0, #0x0
	bgt _020DE260
_020DE280:
	ldr r0, _020DE2D8 ; =__cs_ref
	ldr r1, [r0, #0x0]
	subs r1, r1, #0x1
	str r1, [r0, #0x0]
	bne _020DE29C
	ldr r0, _020DE2CC ; =__cs
	bl OS_UnlockMutex
_020DE29C:
	ldr r0, _020DE2DC ; =__console_exit
	ldr r0, [r0, #0x0]
	cmp r0, #0x0
	beq _020DE2BC
	blx r0
	ldr r0, _020DE2DC ; =__console_exit
	mov r1, #0x0
	str r1, [r0, #0x0]
_020DE2BC:
	mov r0, #0x0
	bl fflush
	bl _ExitProcess
	ldmia sp!, {r3-r5,pc}
	.balign 4
_020DE2CC: .word __cs
_020DE2D0: .word OSi_ThreadInfo
_020DE2D4: .word __cs_id
_020DE2D8: .word __cs_ref
_020DE2DC: .word __console_exit
_020DE2E0: .word __atexit_funcs
	arm_func_end __exit

	exception abort, 37, 0x00100000
	exception exit, 77, 0x00100100
	exception __exit, 297, 0x00200300