remove const from TPL_OpenTPLFromMemory since the memory is altered
[libogc.git] / libogc / decrementer_handler.S
blob6e824d94becf74e4f1787f974c7556ca58ca2d39
1 /*-------------------------------------------------------------
3 decrementer_handler.S -- PPC decrementer exception support
5 Copyright (C) 2004
6 Michael Wiedenbauer (shagkur)
7 Dave Murphy (WinterMute)
9 This software is provided 'as-is', without any express or implied
10 warranty.  In no event will the authors be held liable for any
11 damages arising from the use of this software.
13 Permission is granted to anyone to use this software for any
14 purpose, including commercial applications, and to alter it and
15 redistribute it freely, subject to the following restrictions:
17 1.      The origin of this software must not be misrepresented; you
18 must not claim that you wrote the original software. If you use
19 this software in a product, an acknowledgment in the product
20 documentation would be appreciated but is not required.
22 2.      Altered source versions must be plainly marked as such, and
23 must not be misrepresented as being the original software.
25 3.      This notice may not be removed or altered from any source
26 distribution.
29 -------------------------------------------------------------*/
32 #include <asm.h>
34 #define EXCEPTION_PROLOG                        \
35         mfspr    r0,912;                                \
36         stw      r0,GQR0_OFFSET(sp);    \
37         mfspr    r0,913;                                \
38         stw      r0,GQR1_OFFSET(sp);    \
39         mfspr    r0,914;                                \
40         stw      r0,GQR2_OFFSET(sp);    \
41         mfspr    r0,915;                                \
42         stw      r0,GQR3_OFFSET(sp);    \
43         mfspr    r0,916;                                \
44         stw      r0,GQR4_OFFSET(sp);    \
45         mfspr    r0,917;                                \
46         stw      r0,GQR5_OFFSET(sp);    \
47         mfspr    r0,918;                                \
48         stw      r0,GQR6_OFFSET(sp);    \
49         mfspr    r0,919;                                \
50         stw      r0,GQR7_OFFSET(sp);    \
51         stw      r6,GPR6_OFFSET(sp);    \
52         stw      r7,GPR7_OFFSET(sp);    \
53         stw      r8,GPR8_OFFSET(sp);    \
54         stw      r9,GPR9_OFFSET(sp);    \
55         stw      r10,GPR10_OFFSET(sp);  \
56         stw      r11,GPR11_OFFSET(sp);  \
57         stw      r12,GPR12_OFFSET(sp);  \
58         stw      r13,GPR13_OFFSET(sp);  \
59         stw      r14,GPR14_OFFSET(sp);  \
60         stw      r15,GPR15_OFFSET(sp)
61         
62 #define EXCEPTION_EPILOG                        \
63         lwz             r4,GQR0_OFFSET(sp);             \
64         mtspr   912,r4;                                 \
65         lwz             r4,GQR1_OFFSET(sp);             \
66         mtspr   913,r4;                                 \
67         lwz             r4,GQR2_OFFSET(sp);             \
68         mtspr   914,r4;                                 \
69         lwz             r4,GQR3_OFFSET(sp);             \
70         mtspr   915,r4;                                 \
71         lwz             r4,GQR4_OFFSET(sp);             \
72         mtspr   916,r4;                                 \
73         lwz             r4,GQR5_OFFSET(sp);             \
74         mtspr   917,r4;                                 \
75         lwz             r4,GQR6_OFFSET(sp);             \
76         mtspr   918,r4;                                 \
77         lwz             r4,GQR7_OFFSET(sp);             \
78         mtspr   919,r4;                                 \
79         lwz             r15,GPR15_OFFSET(sp);   \
80         lwz             r14,GPR14_OFFSET(sp);   \
81         lwz             r13,GPR13_OFFSET(sp);   \
82         lwz             r12,GPR12_OFFSET(sp);   \
83         lwz             r11,GPR11_OFFSET(sp);   \
84         lwz             r10,GPR10_OFFSET(sp);   \
85         lwz             r9,GPR9_OFFSET(sp);             \
86         lwz             r8,GPR8_OFFSET(sp);             \
87         lwz             r7,GPR7_OFFSET(sp);             \
88         lwz             r6,GPR6_OFFSET(sp);             \
89         lwz             r5,GPR5_OFFSET(sp)
91         .extern c_decrementer_handler
92         .globl  dec_exceptionhandler
93 dec_exceptionhandler:
94         stwu    sp,-EXCEPTION_FRAME_END(sp)             //now we're able to adjust the stackpointer with it's cached address
96         EXCEPTION_PROLOG
98         mfmsr   r3
99         ori             r3,r3,MSR_RI
100         mtmsr   r3
101         isync
103         addi    r14,sp,0
104         lis             r15,_thread_dispatch_disable_level@ha
105         
106         mfspr   r3,SPRG0
107         cmpwi   r3,0
108         bne             nested
109         mfspr   sp,SPRG1
111 nested:
112         addi    r3,r3,1
113         lwz             r6,_thread_dispatch_disable_level@l(r15)
114         mtspr   SPRG0,r3
115         addi    r6,r6,1
116         stw             r6,_thread_dispatch_disable_level@l(r15)
118         addi    r3,r14,0x08
119         bl              c_decrementer_handler
120         
121         mfspr   r4,SPRG0
122         lwz             r3,_thread_dispatch_disable_level@l(r15)
123         addi    r4,r4,-1
124         addic.  r3,r3,-1
125         mtspr   SPRG0,r4
126         stw             r3,_thread_dispatch_disable_level@l(r15)
127         addi    sp,r14,0
128         bne             easy_exit
130         lis             r4,_context_switch_want@ha
131         lwz             r5,_context_switch_want@l(r4)
132         cmpwi   r5,0
133         beq             easy_exit
135 switch:
136         bl              __thread_dispatch
138 easy_exit:
139         lwz             r4,CR_OFFSET(sp)
140         mtcr    r4
141         lwz             r4,LR_OFFSET(sp)
142         mtlr    r4
143         lwz             r4,CTR_OFFSET(sp)
144         mtctr   r4
145         lwz             r4,XER_OFFSET(sp)
146         mtxer   r4
148         EXCEPTION_EPILOG
150         mfmsr   r4
151         rlwinm  r4,r4,0,31,29
152         mtmsr   r4
153         isync
155         lwz             r0,GPR0_OFFSET(sp)
156         lwz             toc,GPR2_OFFSET(sp)
158         lwz             r4,SRR0_OFFSET(sp)
159         mtsrr0  r4
160         lwz             r4,SRR1_OFFSET(sp)
161         rlwinm  r4, r4, 0, 19, 17
162         mtsrr1  r4
164         lwz             r4,GPR4_OFFSET(sp)
165         lwz             r3,GPR3_OFFSET(sp)
166         addi    sp,sp,EXCEPTION_FRAME_END
167         rfi