fix for corrupted graphics when manipulating config files
[open-ps2-loader.git] / kpatch_10K / kpatch_asm.S
blob4f8233f0938383278e0a7b515b13d846bed68fa2
1 /*
2  Copyright 2010, jimmikaelkael <jimmikaelkael@wanadoo.fr>
3  Licenced under Academic Free License version 3.0
4  Review Open-PS2-Loader README & LICENSE files for further details.
6  code to be patched into the ExecPS2 syscall on SCPH-10000
7 */
9         .text
11         .set    push
12         .set    noreorder
13         .set    noat
15         .globl p_program_thid
16         .globl p_800125f4
17         .globl p_elfargs
18         .globl p_80017400
19         .globl p_ChangeThreadPriority
20         .globl p_CancelWakeUpThread
21         .globl p_TerminateThread
22         .globl p_DeleteThread
23         .globl p_kFNC80004e68
24         .globl p_kFNC800021b0
25         .globl p_bcopy
26         .globl p_kFNC80002ac0
27         .globl p_kFNC80002a80
28         .globl p_InitializeGS
29         .globl p_SetGSCrt
30         .globl p_InitializeINTC
31         .globl p_InitializeTIMER
32         .globl p_ResetEE
33         .globl p_InitializeFPU
34         .globl p_InitializeScratchPad
36         .globl  SoftPeripheralEEReset
37         .globl  ExecPS2CleanUp
40  * SoftPeripheralEEReset
41  */
42         .ent    SoftPeripheralEEReset
43 SoftPeripheralEEReset:
44         addiu   $sp, $sp, -0x10
45         sd      $ra, 0x0000($sp)
47         /* INTC reg stuff */
48         lui     $a0, 0x1000
49         ori     $v0, $a0, 0xf000
50         addiu   $v1, $zero, 4
51         sw      $v1, 0x0000($v0)
52         ori     $a0, $a0, 0xf000
54         lw      $v0, 0x0000($a0)
55         andi    $v0, $v0, 4
56         nop
57         nop
58         nop
59         beq     $v0, $zero, 1b
60         nop
62         /* Initialize GS */
63         sw      $v1, 0x0000($a0)
64         lw      $v0, p_InitializeGS
65         jalr    $v0
66         nop
68         /* SetGSCrt mode */
69         lw      $v0, p_SetGSCrt
70         addiu   $a0, $zero, 1
71         addiu   $a1, $zero, 2
72         jalr    $v0
73         addiu   $a2, $zero, 1
75         /* Initialize INTC */
76         lw      $v0, p_InitializeINTC
77         jalr    $v0
78         ori     $a0, $zero, 0xdffd
80         /* Initialize TIMER */
81         lw      $v0, p_InitializeTIMER
82         jalr    $v0
83         nop
85         /* Do a ResetEE (initialize DMAC, VU0, VU1, GIF, VIF0, VIF1, IPU) */
86         lw      $v0, p_ResetEE
87         jalr    $v0
88         addiu   $a0, $zero, 0x7f
90         /* Initialize FPU */
91         lw      $v0, p_InitializeFPU
92         jalr    $v0
93         nop
95         /* Initialize Scratch Pad */
96         lw      $v0, p_InitializeScratchPad
97         jalr    $v0
98         nop
100         ld      $ra, 0x0000($sp)
101         jr      $ra
102         addiu   $sp, $sp, 0x10
103         .end    SoftPeripheralEEReset
107  * ExecPS2CleanUp
108  */
109         .ent    ExecPS2CleanUp
110 ExecPS2CleanUp:
111         addiu   $sp, $sp, -0xB0
112         sd      $ra, 0x00a0($sp)
113         sd      $fp, 0x0090($sp)
114         sd      $s7, 0x0080($sp)
115         sd      $s6, 0x0070($sp)
116         sd      $s5, 0x0060($sp)
117         sd      $s4, 0x0050($sp)
118         sd      $s3, 0x0040($sp)
119         sd      $s2, 0x0030($sp)
120         sd      $s1, 0x0020($sp)
121         sd      $s0, 0x0010($sp)
123         addiu   $fp, $zero, 16
124         daddu   $s5, $a0, $zero         /* store elf entry point into s5 */
125         daddu   $s4, $a2, $zero         /* store argc into s4 */
126         addiu   $s1, $zero, 0x4c
127         addiu   $s0, $zero, 1
129         sw      $a1, 0x0000($sp)        /* store gp pointer */
130         sw      $a3, 0x0004($sp)        /* store argv */
132         lw      $t0, p_program_thid
133         lw      $s3, 0x0000($t0)
135         lw      $v0, p_CancelWakeUpThread
136         jalr    $v0
137         daddu   $a0, $s3, $zero
139         daddu   $a0, $s3, $zero
140         lw      $v0, p_ChangeThreadPriority
141         jalr    $v0
142         daddu   $a1, $zero, $zero
143         nop
145         /* terminate all threads */
147         lw      $v0, p_80017400
148         addu    $v0, $s1, $v0
149         lw      $v0, 0x0008($v0)
150         beql    $v0, $zero, 3f
151         addiu   $s0, $s0, 1
152         beql    $s0, $s3, 3f
153         addiu   $s0, $s0, 1
154         bne     $v0, $fp, 2f
155         nop
156         lw      $v0, p_DeleteThread
157         jalr    $v0
158         daddu   $a0, $s0, $zero
159         beq     $zero, $zero, 3f
160         addiu   $s0, $s0, 1
162         lw      $v0, p_TerminateThread
163         jalr    $v0
164         daddu   $a0, $s0, $zero
165         lw      $v0, p_DeleteThread
166         jalr    $v0
167         daddu   $a0, $s0, $zero
168         addiu   $s0, $s0, 1
170         slti    $v0, $s0, 256
171         bne     $v0, $zero, 1b
172         addiu   $s1, $s1, 0x4c
174         lw      $v0, p_kFNC80004e68
175         jalr    $v0
176         daddu   $s0, $zero, $zero
178         lw      $v0, p_kFNC800021b0
179         jalr    $v0
180         nop
182         /* Does a soft pheripheral EE reset */
183         lw      $v0, p_800125f4
184         jal     SoftPeripheralEEReset
185         sw      $zero, 0x0000($v0)
187         /* copy elf args to kernel memory */
188         blez    $s4, 5f
189         nop
191         lw      $a0, p_elfargs          /* pointer where to store elf args in kernel memory */
192         lw      $a1, 0x0004($sp)
194         sll     $v1, $s0, 2
195         addiu   $s0, $s0, 1
196         addu    $v1, $v1, $a1
197         lw      $v0, p_bcopy
198         jalr    $v0
199         lw      $a1, 0x0000($v1)
200         daddu   $a0, $v0, $zero
201         slt     $v0, $s0, $s4
202         bne     $v0, $zero, 4b
203         lw      $a1, 0x0004($sp)
205         /* */
207         addiu   $v0, $zero, 0x4c
208         mult    $v0, $s3, $v0
209         lw      $a1, p_80017400
210         lw      $a0, p_elfargs
211         lw      $a2, p_kFNC80002ac0
212         addu    $v0, $v0, $a1
213         sw      $a0, 0x0038($v0)
214         lw      $a1, 0x0000($sp)
215         sw      $s4, 0x0034($v0)
216         sw      $s5, 0x000c($v0)
217         sw      $s5, 0x0030($v0)
218         sw      $a1, 0x0014($v0)
219         sh      $zero, 0x001a($v0)
220         sh      $zero, 0x0018($v0)
221         sw      $zero, 0x0024($v0)
222         sw      $zero, 0x001c($v0)
223         jalr    $a2
224         sw      $zero, 0x0020($v0)
225         
226         lw      $v1, p_kFNC80002a80
227         jalr    $v1
228         nop
230         /* return entry point */
231         daddu   $v0, $s5, $zero
233         ld      $s0, 0x0010($sp)
234         ld      $s1, 0x0020($sp)
235         ld      $s2, 0x0030($sp)
236         ld      $s3, 0x0040($sp)
237         ld      $s4, 0x0050($sp)
238         ld      $s5, 0x0060($sp)
239         ld      $s6, 0x0070($sp)
240         ld      $s7, 0x0080($sp)
241         ld      $fp, 0x0090($sp)
242         ld      $ra, 0x00a0($sp)
243         jr      $ra
244         addiu   $sp, $sp, 0xB0
245         .end    ExecPS2CleanUp
249  * rodata section
250  */
252         .section .rodata
254 p_program_thid:
255         .word   0x800125ec
257 p_800125f4:
258         .word   0x800125f4
260 p_elfargs:
261         .word   0x80012608
263 p_80017400:
264         .word   0x80017400
266 p_CancelWakeUpThread:
267         .word   0x80004970
269 p_ChangeThreadPriority:
270         .word   0x80004288
272 p_TerminateThread:
273         .word   0x80003e00
275 p_DeleteThread:
276         .word   0x80003f00
278 p_kFNC80004e68:
279         .word   0x80004e68
281 p_kFNC800021b0:
282         .word   0x800021b0
284 p_bcopy:
285         .word   0x80005560
287 p_kFNC80002ac0:
288         .word   0x80002ac0
290 p_kFNC80002a80:
291         .word   0x80002a80
293 p_InitializeGS:
294         .word   0x8000aa60
296 p_SetGSCrt:
297         .word   0x8000a060
299 p_InitializeINTC:
300         .word   0x8000b8d0
302 p_InitializeTIMER:
303         .word   0x8000b900
305 p_ResetEE:
306         .word   0x8000ad68
308 p_InitializeFPU:
309         .word   0x8000b7a8
311 p_InitializeScratchPad:
312         .word   0x8000b840
314         .set    pop