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
RevLine 
[edc89bd0]1#
[df4ed85]2# Copyright (c) 2006 Martin Decky
[edc89bd0]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
[b66cc97]29#include <abi/asmtool.h>
[edc89bd0]30#include <arch/asm/regname.h>
[c0699467]31#include <arch/msr.h>
[91d5ad6]32#include <arch/mm/page.h>
[beb16cfa]33#include <arch/istate_struct.h>
34#include <arch/stack.h>
[0871296]35#include <align.h>
[edc89bd0]36
37.section K_UNMAPPED_TEXT_START, "ax"
38
[613bc54]39.macro CONTEXT_STORE
[a35b458]40
[ffe276f]41 # save r12 in SPRG1, backup CR in r12
[e34a141]42 # save SP in SPRG2
[a35b458]43
[e34a141]44 mtsprg1 r12
[762a824]45 mfcr r12
[e34a141]46 mtsprg2 sp
[a35b458]47
[0871296]48 # check whether the previous mode was user or kernel
[a35b458]49
[0871296]50 mfsrr1 sp # use sp as a temporary register to hold SRR1
[1b20da0]51 andi. sp, sp, MSR_PR
[762a824]52 bne 1f
[0871296]53 # previous mode was kernel
[a35b458]54
[0871296]55 mfsprg2 sp
56 subis sp, sp, 0x8000
[762a824]57 b 2f
[a35b458]58
[762a824]59 1:
[0871296]60 # previous mode was user
[a35b458]61
[0871296]62 mfsprg0 sp
[762a824]63 2:
[a35b458]64
[beb16cfa]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)
[a35b458]96
[beb16cfa]97 stw r12, ISTATE_OFFSET_CR(sp)
[a35b458]98
[e34a141]99 mfsrr0 r12
[beb16cfa]100 stw r12, ISTATE_OFFSET_PC(sp)
[a35b458]101
[e34a141]102 mfsrr1 r12
[beb16cfa]103 stw r12, ISTATE_OFFSET_SRR1(sp)
[a35b458]104
[e34a141]105 mflr r12
[beb16cfa]106 stw r12, ISTATE_OFFSET_LR(sp)
[a35b458]107
[e34a141]108 mfctr r12
[beb16cfa]109 stw r12, ISTATE_OFFSET_CTR(sp)
[a35b458]110
[e34a141]111 mfxer r12
[beb16cfa]112 stw r12, ISTATE_OFFSET_XER(sp)
[a35b458]113
[826c203]114 mfdar r12
[beb16cfa]115 stw r12, ISTATE_OFFSET_DAR(sp)
[a35b458]116
[826c203]117 mfsprg1 r12
[beb16cfa]118 stw r12, ISTATE_OFFSET_R12(sp)
[a35b458]119
[826c203]120 mfsprg2 r12
[beb16cfa]121 stw r12, ISTATE_OFFSET_SP(sp)
[3ab2d1e]122
123 li r12, 0
[beb16cfa]124 stw r12, ISTATE_OFFSET_LR_FRAME(sp)
125 stw r12, ISTATE_OFFSET_SP_FRAME(sp)
[613bc54]126.endm
127
[95d45482]128// NOTE: K_UNMAPPED_TEXT_START section starts at 0x100,
[cfdeedc]129// so all the following .org directives are relative to that.
130#define ABSOLUTE(x) ((x) - 0x100)
131
132.org ABSOLUTE(0x100)
[b66cc97]133SYMBOL(exc_system_reset)
[c782434]134 CONTEXT_STORE
[a35b458]135
[c782434]136 li r3, 0
137 b jump_to_kernel
[613bc54]138
[cfdeedc]139.org ABSOLUTE(0x200)
[b66cc97]140SYMBOL(exc_machine_check)
[c782434]141 CONTEXT_STORE
[a35b458]142
[c782434]143 li r3, 1
144 b jump_to_kernel
[613bc54]145
[cfdeedc]146.org ABSOLUTE(0x300)
[b66cc97]147SYMBOL(exc_data_storage)
[613bc54]148 CONTEXT_STORE
[a35b458]149
[6c3106f]150 li r3, 2
151 b jump_to_kernel
[613bc54]152
[cfdeedc]153.org ABSOLUTE(0x400)
[b66cc97]154SYMBOL(exc_instruction_storage)
[762a824]155 CONTEXT_STORE
[a35b458]156
[6c3106f]157 li r3, 3
158 b jump_to_kernel
[613bc54]159
[cfdeedc]160.org ABSOLUTE(0x500)
[b66cc97]161SYMBOL(exc_external)
[982f0fe]162 CONTEXT_STORE
[a35b458]163
[c782434]164 li r3, 4
[982f0fe]165 b jump_to_kernel
[613bc54]166
[cfdeedc]167.org ABSOLUTE(0x600)
[b66cc97]168SYMBOL(exc_alignment)
[c782434]169 CONTEXT_STORE
[a35b458]170
[c782434]171 li r3, 5
172 b jump_to_kernel
[613bc54]173
[cfdeedc]174.org ABSOLUTE(0x700)
[b66cc97]175SYMBOL(exc_program)
[c782434]176 CONTEXT_STORE
[a35b458]177
[c782434]178 li r3, 6
179 b jump_to_kernel
[613bc54]180
[cfdeedc]181.org ABSOLUTE(0x800)
[b66cc97]182SYMBOL(exc_fp_unavailable)
[c782434]183 CONTEXT_STORE
[a35b458]184
[c782434]185 li r3, 7
186 b jump_to_kernel
[613bc54]187
[cfdeedc]188.org ABSOLUTE(0x900)
[b66cc97]189SYMBOL(exc_decrementer)
[a33c990]190 CONTEXT_STORE
[a35b458]191
[c782434]192 li r3, 8
[e34a141]193 b jump_to_kernel
[edc89bd0]194
[cfdeedc]195.org ABSOLUTE(0xa00)
[b66cc97]196SYMBOL(exc_reserved0)
[c782434]197 CONTEXT_STORE
[a35b458]198
[c782434]199 li r3, 9
200 b jump_to_kernel
[edc89bd0]201
[cfdeedc]202.org ABSOLUTE(0xb00)
[b66cc97]203SYMBOL(exc_reserved1)
[c782434]204 CONTEXT_STORE
[a35b458]205
[c782434]206 li r3, 10
207 b jump_to_kernel
[edc89bd0]208
[cfdeedc]209.org ABSOLUTE(0xc00)
[b66cc97]210SYMBOL(exc_syscall)
[0867321]211 CONTEXT_STORE
[a35b458]212
[e34a141]213 b jump_to_kernel_syscall
[edc89bd0]214
[cfdeedc]215.org ABSOLUTE(0xd00)
[b66cc97]216SYMBOL(exc_trace)
[c782434]217 CONTEXT_STORE
[a35b458]218
[c782434]219 li r3, 12
220 b jump_to_kernel
[898d9f8]221
[cfdeedc]222.org ABSOLUTE(0x1000)
[b66cc97]223SYMBOL(exc_itlb_miss)
[0867321]224 CONTEXT_STORE
[a35b458]225
[6c3106f]226 li r3, 13
227 b jump_to_kernel
[0867321]228
[cfdeedc]229.org ABSOLUTE(0x1100)
[b66cc97]230SYMBOL(exc_dtlb_miss_load)
[0867321]231 CONTEXT_STORE
[a35b458]232
[6c3106f]233 li r3, 14
234 b jump_to_kernel
[0867321]235
[cfdeedc]236.org ABSOLUTE(0x1200)
[b66cc97]237SYMBOL(exc_dtlb_miss_store)
[0867321]238 CONTEXT_STORE
[a35b458]239
[6c3106f]240 li r3, 15
[826c203]241 b jump_to_kernel
242
[cfdeedc]243.org ABSOLUTE(0x4000)
[898d9f8]244jump_to_kernel:
[3fde837]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.
[a35b458]250
[3fde837]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
[898d9f8]257 lis r12, iret@ha
258 addi r12, r12, iret@l
259 mtlr r12
[3fde837]260
[fbb8b2b]261 lis r12, exc_dispatch@ha
262 addi r12, r12, exc_dispatch@l
263 mtsrr0 r12
[0871296]264
[898d9f8]265 mfmsr r12
[3fde837]266 mfsrr1 r5
267 andi. r5, r5, MSR_FP
[df7f5cea]268 or r12, r12, r5 # Propagate MSR_FP from SRR1 to MSR
[3fde837]269 ori r12, r12, (MSR_IR | MSR_DR)
[898d9f8]270 mtsrr1 r12
[a35b458]271
[898d9f8]272 addis sp, sp, 0x8000
273 mr r4, sp
[a35b458]274
[898d9f8]275 rfi
276
277jump_to_kernel_syscall:
278 lis r12, syscall_handler@ha
279 addi r12, r12, syscall_handler@l
280 mtsrr0 r12
[a35b458]281
[898d9f8]282 lis r12, iret_syscall@ha
283 addi r12, r12, iret_syscall@l
284 mtlr r12
[df7f5cea]285
286 mfsrr1 r0
287 andi. r0, r0, MSR_FP
[898d9f8]288 mfmsr r12
[df7f5cea]289 or r12, r12, r0 # Propagate MSR_FP from SRR1 to MSR
[8c7d5ad]290 ori r12, r12, (MSR_IR | MSR_DR | MSR_EE)
[898d9f8]291 mtsrr1 r12
[a35b458]292
[898d9f8]293 addis sp, sp, 0x8000
294 rfi
[cfdeedc]295
296/* Rest is for stack. */
297
298.org ABSOLUTE(0x8000)
Note: See TracBrowser for help on using the repository browser.