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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since bf05c74 was cfdeedc, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

Keep kernel in ELF format

By keeping kernel in an ELF file (instead of converting it to
a flat binary), we can use the information it contains, like
symbol table and debug info.

We can also later implement more advanced functionality, like
loading kernel at multiple discontiguous blocks, or loading
a position-independent kernel at a randomized address.

Currently the functionality is quite restricted, to keep changes
to a minimum. Code in boot/generic/src/kernel.c validates that
the kernel image was built with the same addresses as the boot
loader uses, giving an extra level of sanity checking compared
to a flat binary.

  • 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// XXX: 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.