source: mainline/kernel/arch/ppc32/src/exception.S

Last change on this file was 95d45482, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

XXX to NOTE

  • Property mode set to 100644
File size: 5.9 KB
Line 
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 <abi/asmtool.h>
30#include <arch/asm/regname.h>
31#include <arch/msr.h>
32#include <arch/mm/page.h>
33#include <arch/istate_struct.h>
34#include <arch/stack.h>
35#include <align.h>
36
37.section K_UNMAPPED_TEXT_START, "ax"
38
39.macro CONTEXT_STORE
40
41 # save r12 in SPRG1, backup CR in r12
42 # save SP in SPRG2
43
44 mtsprg1 r12
45 mfcr r12
46 mtsprg2 sp
47
48 # check whether the previous mode was user or kernel
49
50 mfsrr1 sp # use sp as a temporary register to hold SRR1
51 andi. sp, sp, MSR_PR
52 bne 1f
53 # previous mode was kernel
54
55 mfsprg2 sp
56 subis sp, sp, 0x8000
57 b 2f
58
59 1:
60 # previous mode was user
61
62 mfsprg0 sp
63 2:
64
65 subi sp, sp, ALIGN_UP(ISTATE_SIZE, STACK_ALIGNMENT)
66 stw r0, ISTATE_OFFSET_R0(sp)
67 stw r2, ISTATE_OFFSET_R2(sp)
68 stw r3, ISTATE_OFFSET_R3(sp)
69 stw r4, ISTATE_OFFSET_R4(sp)
70 stw r5, ISTATE_OFFSET_R5(sp)
71 stw r6, ISTATE_OFFSET_R6(sp)
72 stw r7, ISTATE_OFFSET_R7(sp)
73 stw r8, ISTATE_OFFSET_R8(sp)
74 stw r9, ISTATE_OFFSET_R9(sp)
75 stw r10, ISTATE_OFFSET_R10(sp)
76 stw r11, ISTATE_OFFSET_R11(sp)
77 stw r13, ISTATE_OFFSET_R13(sp)
78 stw r14, ISTATE_OFFSET_R14(sp)
79 stw r15, ISTATE_OFFSET_R15(sp)
80 stw r16, ISTATE_OFFSET_R16(sp)
81 stw r17, ISTATE_OFFSET_R17(sp)
82 stw r18, ISTATE_OFFSET_R18(sp)
83 stw r19, ISTATE_OFFSET_R19(sp)
84 stw r20, ISTATE_OFFSET_R20(sp)
85 stw r21, ISTATE_OFFSET_R21(sp)
86 stw r22, ISTATE_OFFSET_R22(sp)
87 stw r23, ISTATE_OFFSET_R23(sp)
88 stw r24, ISTATE_OFFSET_R24(sp)
89 stw r25, ISTATE_OFFSET_R25(sp)
90 stw r26, ISTATE_OFFSET_R26(sp)
91 stw r27, ISTATE_OFFSET_R27(sp)
92 stw r28, ISTATE_OFFSET_R28(sp)
93 stw r29, ISTATE_OFFSET_R29(sp)
94 stw r30, ISTATE_OFFSET_R30(sp)
95 stw r31, ISTATE_OFFSET_R31(sp)
96
97 stw r12, ISTATE_OFFSET_CR(sp)
98
99 mfsrr0 r12
100 stw r12, ISTATE_OFFSET_PC(sp)
101
102 mfsrr1 r12
103 stw r12, ISTATE_OFFSET_SRR1(sp)
104
105 mflr r12
106 stw r12, ISTATE_OFFSET_LR(sp)
107
108 mfctr r12
109 stw r12, ISTATE_OFFSET_CTR(sp)
110
111 mfxer r12
112 stw r12, ISTATE_OFFSET_XER(sp)
113
114 mfdar r12
115 stw r12, ISTATE_OFFSET_DAR(sp)
116
117 mfsprg1 r12
118 stw r12, ISTATE_OFFSET_R12(sp)
119
120 mfsprg2 r12
121 stw r12, ISTATE_OFFSET_SP(sp)
122
123 li r12, 0
124 stw r12, ISTATE_OFFSET_LR_FRAME(sp)
125 stw r12, ISTATE_OFFSET_SP_FRAME(sp)
126.endm
127
128// NOTE: K_UNMAPPED_TEXT_START section starts at 0x100,
129// so all the following .org directives are relative to that.
130#define ABSOLUTE(x) ((x) - 0x100)
131
132.org ABSOLUTE(0x100)
133SYMBOL(exc_system_reset)
134 CONTEXT_STORE
135
136 li r3, 0
137 b jump_to_kernel
138
139.org ABSOLUTE(0x200)
140SYMBOL(exc_machine_check)
141 CONTEXT_STORE
142
143 li r3, 1
144 b jump_to_kernel
145
146.org ABSOLUTE(0x300)
147SYMBOL(exc_data_storage)
148 CONTEXT_STORE
149
150 li r3, 2
151 b jump_to_kernel
152
153.org ABSOLUTE(0x400)
154SYMBOL(exc_instruction_storage)
155 CONTEXT_STORE
156
157 li r3, 3
158 b jump_to_kernel
159
160.org ABSOLUTE(0x500)
161SYMBOL(exc_external)
162 CONTEXT_STORE
163
164 li r3, 4
165 b jump_to_kernel
166
167.org ABSOLUTE(0x600)
168SYMBOL(exc_alignment)
169 CONTEXT_STORE
170
171 li r3, 5
172 b jump_to_kernel
173
174.org ABSOLUTE(0x700)
175SYMBOL(exc_program)
176 CONTEXT_STORE
177
178 li r3, 6
179 b jump_to_kernel
180
181.org ABSOLUTE(0x800)
182SYMBOL(exc_fp_unavailable)
183 CONTEXT_STORE
184
185 li r3, 7
186 b jump_to_kernel
187
188.org ABSOLUTE(0x900)
189SYMBOL(exc_decrementer)
190 CONTEXT_STORE
191
192 li r3, 8
193 b jump_to_kernel
194
195.org ABSOLUTE(0xa00)
196SYMBOL(exc_reserved0)
197 CONTEXT_STORE
198
199 li r3, 9
200 b jump_to_kernel
201
202.org ABSOLUTE(0xb00)
203SYMBOL(exc_reserved1)
204 CONTEXT_STORE
205
206 li r3, 10
207 b jump_to_kernel
208
209.org ABSOLUTE(0xc00)
210SYMBOL(exc_syscall)
211 CONTEXT_STORE
212
213 b jump_to_kernel_syscall
214
215.org ABSOLUTE(0xd00)
216SYMBOL(exc_trace)
217 CONTEXT_STORE
218
219 li r3, 12
220 b jump_to_kernel
221
222.org ABSOLUTE(0x1000)
223SYMBOL(exc_itlb_miss)
224 CONTEXT_STORE
225
226 li r3, 13
227 b jump_to_kernel
228
229.org ABSOLUTE(0x1100)
230SYMBOL(exc_dtlb_miss_load)
231 CONTEXT_STORE
232
233 li r3, 14
234 b jump_to_kernel
235
236.org ABSOLUTE(0x1200)
237SYMBOL(exc_dtlb_miss_store)
238 CONTEXT_STORE
239
240 li r3, 15
241 b jump_to_kernel
242
243.org ABSOLUTE(0x4000)
244jump_to_kernel:
245 mfsrr1 r5
246 andi. r5, r5, MSR_PR
247 bne 1f
248 # Previous mode was kernel.
249 # We can construct a proper frame linkage.
250
251 mfsrr0 r12
252 stw r12, ISTATE_OFFSET_LR_FRAME(sp)
253 mfsprg2 r12
254 stw r12, ISTATE_OFFSET_SP_FRAME(sp)
255 1:
256
257 lis r12, iret@ha
258 addi r12, r12, iret@l
259 mtlr r12
260
261 lis r12, exc_dispatch@ha
262 addi r12, r12, exc_dispatch@l
263 mtsrr0 r12
264
265 mfmsr r12
266 mfsrr1 r5
267 andi. r5, r5, MSR_FP
268 or r12, r12, r5 # Propagate MSR_FP from SRR1 to MSR
269 ori r12, r12, (MSR_IR | MSR_DR)
270 mtsrr1 r12
271
272 addis sp, sp, 0x8000
273 mr r4, sp
274
275 rfi
276
277jump_to_kernel_syscall:
278 lis r12, syscall_handler@ha
279 addi r12, r12, syscall_handler@l
280 mtsrr0 r12
281
282 lis r12, iret_syscall@ha
283 addi r12, r12, iret_syscall@l
284 mtlr r12
285
286 mfsrr1 r0
287 andi. r0, r0, MSR_FP
288 mfmsr r12
289 or r12, r12, r0 # Propagate MSR_FP from SRR1 to MSR
290 ori r12, r12, (MSR_IR | MSR_DR | MSR_EE)
291 mtsrr1 r12
292
293 addis sp, sp, 0x8000
294 rfi
295
296/* Rest is for stack. */
297
298.org ABSOLUTE(0x8000)
Note: See TracBrowser for help on using the repository browser.