(c) versus (C)
[helenos.git] / kernel / arch / ppc32 / src / exception.S
blobce39212c16208f5f299577964c7eb521c2dd7592
2 # Copyright (c) 2006 Martin Decky
3 # All rights reserved.
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
9 # - Redistributions of source code must retain the above copyright
10 #   notice, this list of conditions and the following disclaimer.
11 # - Redistributions in binary form must reproduce the above copyright
12 #   notice, this list of conditions and the following disclaimer in the
13 #   documentation and/or other materials provided with the distribution.
14 # - The name of the author may not be used to endorse or promote products
15 #   derived from this software without specific prior written permission.
17 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include <arch/asm/regname.h>
30 #include <arch/mm/page.h>
32 .section K_UNMAPPED_TEXT_START, "ax"
34 .macro CONTEXT_STORE
35         
36         # save R12 in SPRG1, backup CR in R12
37         # save SP in SPRG2
39         mtsprg1 r12
40         mfcr r12
41         mtsprg2 sp
42         
43         # check whether SP is in kernel
44         
45         andis. sp, sp, 0x8000
46         bne 1f
47         
48                 # stack is in user-space
49                 
50                 mfsprg0 sp
51         
52         b 2f
53         
54         1:
55         
56                 # stack is in kernel
57                 
58                 mfsprg2 sp
59                 subis sp, sp, 0x8000
60         
61         2:
62         
63         subi sp, sp, 160
64         stw r0, 8(sp)
65         stw r2, 12(sp)
66         stw r3, 16(sp)
67         stw r4, 20(sp)
68         stw r5, 24(sp)
69         stw r6, 28(sp)
70         stw r7, 32(sp)
71         stw r8, 36(sp)
72         stw r9, 40(sp)
73         stw r10, 44(sp)
74         stw r11, 48(sp)
75         stw r13, 52(sp)
76         stw r14, 56(sp)
77         stw r15, 60(sp)
78         stw r16, 64(sp)
79         stw r17, 68(sp)
80         stw r18, 72(sp)
81         stw r19, 76(sp)
82         stw r20, 80(sp)
83         stw r21, 84(sp)
84         stw r22, 88(sp)
85         stw r23, 92(sp)
86         stw r24, 96(sp)
87         stw r25, 100(sp)
88         stw r26, 104(sp)
89         stw r27, 108(sp)
90         stw r28, 112(sp)
91         stw r29, 116(sp)
92         stw r30, 120(sp)
93         stw r31, 124(sp)
94         
95         stw r12, 128(sp)
96         
97         mfsrr0 r12
98         stw r12, 132(sp)
99         
100         mfsrr1 r12
101         stw r12, 136(sp)
102         
103         mflr r12
104         stw r12, 140(sp)
105         
106         mfctr r12
107         stw r12, 144(sp)
108         
109         mfxer r12
110         stw r12, 148(sp)
111         
112         mfsprg1 r12
113         stw r12, 152(sp)
114         
115         mfsprg2 r12
116         stw r12, 156(sp)
117 .endm
119 .org 0x100
120 .global exc_system_reset
121 exc_system_reset:
122         CONTEXT_STORE
123         
124         li r3, 0
125         b jump_to_kernel
127 .org 0x200
128 .global exc_machine_check
129 exc_machine_check:
130         CONTEXT_STORE
131         
132         li r3, 1
133         b jump_to_kernel
135 .org 0x300
136 .global exc_data_storage
137 exc_data_storage:
138         CONTEXT_STORE
139         
140         li r3, 2
141         mr r4, sp
142         addi r4, r4, 8
143         bl pht_real_refill
144         
145         cmpwi r3, 0
146         bne iret_real
147         
148         li r3, 2
149         b jump_to_kernel
151 .org 0x400
152 .global exc_instruction_storage
153 exc_instruction_storage:
154         CONTEXT_STORE
155         
156         li r3, 3
157         mr r4, sp
158         addi r4, r4, 8
159         bl pht_real_refill
160         
161         cmpwi r3, 0
162         bne iret_real
164         li r3, 3
165         b jump_to_kernel
167 .org 0x500
168 .global exc_external
169 exc_external:
170         CONTEXT_STORE
171         
172         li r3, 4
173         b jump_to_kernel
175 .org 0x600
176 .global exc_alignment
177 exc_alignment:
178         CONTEXT_STORE
179         
180         li r3, 5
181         b jump_to_kernel
183 .org 0x700
184 .global exc_program
185 exc_program:
186         CONTEXT_STORE
187         
188         li r3, 6
189         b jump_to_kernel
191 .org 0x800
192 .global exc_fp_unavailable
193 exc_fp_unavailable:
194         CONTEXT_STORE
195         
196         li r3, 7
197         b jump_to_kernel
199 .org 0x900
200 .global exc_decrementer
201 exc_decrementer:
202         CONTEXT_STORE
203         
204         li r3, 8
205         b jump_to_kernel
207 .org 0xa00
208 .global exc_reserved0
209 exc_reserved0:
210         CONTEXT_STORE
211         
212         li r3, 9
213         b jump_to_kernel
215 .org 0xb00
216 .global exc_reserved1
217 exc_reserved1:
218         CONTEXT_STORE
219         
220         li r3, 10
221         b jump_to_kernel
223 .org 0xc00
224 .global exc_syscall
225 exc_syscall:
226         CONTEXT_STORE   
227         
228         b jump_to_kernel_syscall
230 .org 0xd00
231 .global exc_trace
232 exc_trace:
233         CONTEXT_STORE
234         
235         li r3, 12
236         b jump_to_kernel
238 .org 0x4000
239 jump_to_kernel:
240         lis r12, iret@ha
241         addi r12, r12, iret@l
242         mtlr r12
243         
244         lis r12, exc_dispatch@ha
245         addi r12, r12, exc_dispatch@l
246         mtsrr0 r12
247         
248         mfmsr r12
249         ori r12, r12, (msr_ir | msr_dr)@l
250         mtsrr1 r12
251         
252         addis sp, sp, 0x8000
253         mr r4, sp
254         addi r4, r4, 8
255         
256         rfi
258 jump_to_kernel_syscall:
259         lis r12, syscall_handler@ha
260         addi r12, r12, syscall_handler@l
261         mtsrr0 r12
262         
263         lis r12, iret_syscall@ha
264         addi r12, r12, iret_syscall@l
265         mtlr r12
266         
267         mfmsr r12
268         ori r12, r12, (msr_ir | msr_dr)@l
269         mtsrr1 r12
270         
271         addis sp, sp, 0x8000
272         rfi
274 iret_real:
275         
276         lwz r0, 8(sp)
277         lwz r2, 12(sp)
278         lwz r3, 16(sp)
279         lwz r4, 20(sp)
280         lwz r5, 24(sp)
281         lwz r6, 28(sp)
282         lwz r7, 32(sp)
283         lwz r8, 36(sp)
284         lwz r9, 40(sp)
285         lwz r10, 44(sp)
286         lwz r11, 48(sp)
287         lwz r13, 52(sp)
288         lwz r14, 56(sp)
289         lwz r15, 60(sp)
290         lwz r16, 64(sp)
291         lwz r17, 68(sp)
292         lwz r18, 72(sp)
293         lwz r19, 76(sp)
294         lwz r20, 80(sp)
295         lwz r21, 84(sp)
296         lwz r22, 88(sp)
297         lwz r23, 92(sp)
298         lwz r24, 96(sp)
299         lwz r25, 100(sp)
300         lwz r26, 104(sp)
301         lwz r27, 108(sp)
302         lwz r28, 112(sp)
303         lwz r29, 116(sp)
304         lwz r30, 120(sp)
305         lwz r31, 124(sp)
306         
307         lwz r12, 128(sp)
308         mtcr r12
309         
310         lwz r12, 132(sp)
311         mtsrr0 r12
312         
313         lwz r12, 136(sp)
314         mtsrr1 r12
315         
316         lwz r12, 140(sp)
317         mtlr r12
318         
319         lwz r12, 144(sp)
320         mtctr r12
321         
322         lwz r12, 148(sp)
323         mtxer r12
324         
325         lwz r12, 152(sp)
326         lwz sp, 156(sp)
327         
328         rfi