~vojtech-horky/helenos/numa

« back to all changes in this revision

Viewing changes to kernel/arch/ppc32/src/exception.S

  • Committer: Martin Decky
  • Date: 2009-08-04 11:19:19 UTC
  • Revision ID: martin@uranus.dsrg.hide.ms.mff.cuni.cz-20090804111919-evyclddlr3v5lhmp
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# Copyright (c) 2006 Martin Decky
 
3
# All rights reserved.
 
4
#
 
5
# Redistribution and use in source and binary forms, with or without
 
6
# modification, are permitted provided that the following conditions
 
7
# are met:
 
8
#
 
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.
 
16
#
 
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.
 
27
#
 
28
 
 
29
#include <arch/asm/regname.h>
 
30
#include <arch/mm/page.h>
 
31
 
 
32
.section K_UNMAPPED_TEXT_START, "ax"
 
33
 
 
34
.macro CONTEXT_STORE
 
35
        
 
36
        # save R12 in SPRG1, backup CR in R12
 
37
        # save SP in SPRG2
 
38
 
 
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, 164
 
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
        mfdar r12
 
113
        stw r12, 152(sp)
 
114
        
 
115
        mfsprg1 r12
 
116
        stw r12, 156(sp)
 
117
        
 
118
        mfsprg2 r12
 
119
        stw r12, 160(sp)
 
120
.endm
 
121
 
 
122
.org 0x100
 
123
.global exc_system_reset
 
124
exc_system_reset:
 
125
        CONTEXT_STORE
 
126
        
 
127
        li r3, 0
 
128
        b jump_to_kernel
 
129
 
 
130
.org 0x200
 
131
.global exc_machine_check
 
132
exc_machine_check:
 
133
        CONTEXT_STORE
 
134
        
 
135
        li r3, 1
 
136
        b jump_to_kernel
 
137
 
 
138
.org 0x300
 
139
.global exc_data_storage
 
140
exc_data_storage:
 
141
        CONTEXT_STORE
 
142
        
 
143
        b data_storage
 
144
 
 
145
.org 0x400
 
146
.global exc_instruction_storage
 
147
exc_instruction_storage:
 
148
        CONTEXT_STORE
 
149
        
 
150
        b instruction_storage
 
151
 
 
152
.org 0x500
 
153
.global exc_external
 
154
exc_external:
 
155
        CONTEXT_STORE
 
156
        
 
157
        li r3, 4
 
158
        b jump_to_kernel
 
159
 
 
160
.org 0x600
 
161
.global exc_alignment
 
162
exc_alignment:
 
163
        CONTEXT_STORE
 
164
        
 
165
        li r3, 5
 
166
        b jump_to_kernel
 
167
 
 
168
.org 0x700
 
169
.global exc_program
 
170
exc_program:
 
171
        CONTEXT_STORE
 
172
        
 
173
        li r3, 6
 
174
        b jump_to_kernel
 
175
 
 
176
.org 0x800
 
177
.global exc_fp_unavailable
 
178
exc_fp_unavailable:
 
179
        CONTEXT_STORE
 
180
        
 
181
        li r3, 7
 
182
        b jump_to_kernel
 
183
 
 
184
.org 0x900
 
185
.global exc_decrementer
 
186
exc_decrementer:
 
187
        CONTEXT_STORE
 
188
        
 
189
        li r3, 8
 
190
        b jump_to_kernel
 
191
 
 
192
.org 0xa00
 
193
.global exc_reserved0
 
194
exc_reserved0:
 
195
        CONTEXT_STORE
 
196
        
 
197
        li r3, 9
 
198
        b jump_to_kernel
 
199
 
 
200
.org 0xb00
 
201
.global exc_reserved1
 
202
exc_reserved1:
 
203
        CONTEXT_STORE
 
204
        
 
205
        li r3, 10
 
206
        b jump_to_kernel
 
207
 
 
208
.org 0xc00
 
209
.global exc_syscall
 
210
exc_syscall:
 
211
        CONTEXT_STORE
 
212
        
 
213
        b jump_to_kernel_syscall
 
214
 
 
215
.org 0xd00
 
216
.global exc_trace
 
217
exc_trace:
 
218
        CONTEXT_STORE
 
219
        
 
220
        li r3, 12
 
221
        b jump_to_kernel
 
222
 
 
223
.org 0x1000
 
224
.global exc_itlb_miss
 
225
exc_itlb_miss:
 
226
        CONTEXT_STORE
 
227
        
 
228
        b tlb_miss
 
229
 
 
230
.org 0x1100
 
231
.global exc_dtlb_miss_load
 
232
exc_dtlb_miss_load:
 
233
        CONTEXT_STORE
 
234
        
 
235
        b tlb_miss
 
236
 
 
237
.org 0x1200
 
238
.global exc_dtlb_miss_store
 
239
exc_dtlb_miss_store:
 
240
        CONTEXT_STORE
 
241
        
 
242
        b tlb_miss
 
243
 
 
244
.org 0x4000
 
245
data_storage:
 
246
        li r3, 2
 
247
        mr r4, sp
 
248
        addi r4, r4, 8
 
249
        bl pht_refill_real
 
250
        
 
251
        cmpwi r3, 0
 
252
        bne iret_real
 
253
        
 
254
        li r3, 2
 
255
        b jump_to_kernel
 
256
 
 
257
instruction_storage:
 
258
        li r3, 3
 
259
        mr r4, sp
 
260
        addi r4, r4, 8
 
261
        bl pht_refill_real
 
262
        
 
263
        cmpwi r3, 0
 
264
        bne iret_real
 
265
        
 
266
        li r3, 3
 
267
        b jump_to_kernel
 
268
 
 
269
tlb_miss:
 
270
        li r3, 16
 
271
        mfspr r4, tlbmiss
 
272
        mfspr r5, ptehi
 
273
        mfspr r6, ptelo
 
274
        mr r7, sp
 
275
        addi r7, r7, 20
 
276
        
 
277
        bl tlb_refill_real
 
278
        b iret_real
 
279
 
 
280
jump_to_kernel:
 
281
        lis r12, iret@ha
 
282
        addi r12, r12, iret@l
 
283
        mtlr r12
 
284
        
 
285
        lis r12, exc_dispatch@ha
 
286
        addi r12, r12, exc_dispatch@l
 
287
        mtsrr0 r12
 
288
        
 
289
        mfmsr r12
 
290
        ori r12, r12, (msr_ir | msr_dr)@l
 
291
        mtsrr1 r12
 
292
        
 
293
        addis sp, sp, 0x8000
 
294
        mr r4, sp
 
295
        addi r4, r4, 8
 
296
        
 
297
        rfi
 
298
 
 
299
jump_to_kernel_syscall:
 
300
        lis r12, syscall_handler@ha
 
301
        addi r12, r12, syscall_handler@l
 
302
        mtsrr0 r12
 
303
        
 
304
        lis r12, iret_syscall@ha
 
305
        addi r12, r12, iret_syscall@l
 
306
        mtlr r12
 
307
        
 
308
        mfmsr r12
 
309
        ori r12, r12, (msr_ir | msr_dr)@l
 
310
        mtsrr1 r12
 
311
        
 
312
        addis sp, sp, 0x8000
 
313
        rfi
 
314
 
 
315
iret_real:
 
316
        lwz r0, 8(sp)
 
317
        lwz r2, 12(sp)
 
318
        lwz r3, 16(sp)
 
319
        lwz r4, 20(sp)
 
320
        lwz r5, 24(sp)
 
321
        lwz r6, 28(sp)
 
322
        lwz r7, 32(sp)
 
323
        lwz r8, 36(sp)
 
324
        lwz r9, 40(sp)
 
325
        lwz r10, 44(sp)
 
326
        lwz r11, 48(sp)
 
327
        lwz r13, 52(sp)
 
328
        lwz r14, 56(sp)
 
329
        lwz r15, 60(sp)
 
330
        lwz r16, 64(sp)
 
331
        lwz r17, 68(sp)
 
332
        lwz r18, 72(sp)
 
333
        lwz r19, 76(sp)
 
334
        lwz r20, 80(sp)
 
335
        lwz r21, 84(sp)
 
336
        lwz r22, 88(sp)
 
337
        lwz r23, 92(sp)
 
338
        lwz r24, 96(sp)
 
339
        lwz r25, 100(sp)
 
340
        lwz r26, 104(sp)
 
341
        lwz r27, 108(sp)
 
342
        lwz r28, 112(sp)
 
343
        lwz r29, 116(sp)
 
344
        lwz r30, 120(sp)
 
345
        lwz r31, 124(sp)
 
346
        
 
347
        lwz r12, 128(sp)
 
348
        mtcr r12
 
349
        
 
350
        lwz r12, 132(sp)
 
351
        mtsrr0 r12
 
352
        
 
353
        lwz r12, 136(sp)
 
354
        mtsrr1 r12
 
355
        
 
356
        lwz r12, 140(sp)
 
357
        mtlr r12
 
358
        
 
359
        lwz r12, 144(sp)
 
360
        mtctr r12
 
361
        
 
362
        lwz r12, 148(sp)
 
363
        mtxer r12
 
364
        
 
365
        lwz r12, 156(sp)
 
366
        lwz sp, 160(sp)
 
367
        
 
368
        rfi