summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_fatal.S
blob: 1cb97e350a6f49eb51fcb907261f367c3c04e05c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
/*
 * Copyright (c) 2011, 2017 embedded brains GmbH.  All rights reserved.
 *
 *  embedded brains GmbH
 *  Dornierstr. 4
 *  82178 Puchheim
 *  Germany
 *  <rtems@embedded-brains.de>
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.org/license/LICENSE.
 */

#include <bspopts.h>
#include <rtems/score/percpu.h>
#include <bsp/vectors.h>

#define SCRATCH_REGISTER_0 r3
#define SCRATCH_REGISTER_1 r4

	.global	ppc_exc_fatal_normal
	.global	ppc_exc_fatal_critical
	.global	ppc_exc_fatal_machine_check
	.global	ppc_exc_fatal_debug

ppc_exc_fatal_critical:

	PPC_REG_STORE	SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
	mfcsrr0	SCRATCH_REGISTER_1
	PPC_REG_STORE	SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
	mfcsrr1	SCRATCH_REGISTER_1
	PPC_REG_STORE	SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
	b	.Lppc_exc_fatal

ppc_exc_fatal_machine_check:

	PPC_REG_STORE	SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
	mfmcsrr0	SCRATCH_REGISTER_1
	PPC_REG_STORE	SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
	mfmcsrr1	SCRATCH_REGISTER_1
	PPC_REG_STORE	SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
	b	.Lppc_exc_fatal

ppc_exc_fatal_debug:

	PPC_REG_STORE	SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
	mfspr	SCRATCH_REGISTER_1, BOOKE_DSRR0
	PPC_REG_STORE	SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
	mfspr	SCRATCH_REGISTER_1, BOOKE_DSRR1
	PPC_REG_STORE	SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
	b	.Lppc_exc_fatal

ppc_exc_fatal_normal:

	PPC_REG_STORE	SCRATCH_REGISTER_1, GPR4_OFFSET(r1)
	mfsrr0	SCRATCH_REGISTER_1
	PPC_REG_STORE	SCRATCH_REGISTER_1, SRR0_FRAME_OFFSET(r1)
	mfsrr1	SCRATCH_REGISTER_1
	PPC_REG_STORE	SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)

.Lppc_exc_fatal:

	stw	r3, EXCEPTION_NUMBER_OFFSET(r1)
	mfcr	SCRATCH_REGISTER_1
	stw	SCRATCH_REGISTER_1, EXC_CR_OFFSET(r1)
	mfxer	SCRATCH_REGISTER_1
	stw	SCRATCH_REGISTER_1, EXC_XER_OFFSET(r1)
	mfctr	SCRATCH_REGISTER_1
	PPC_REG_STORE	SCRATCH_REGISTER_1, EXC_CTR_OFFSET(r1)
	mflr	SCRATCH_REGISTER_1
	PPC_REG_STORE	SCRATCH_REGISTER_1, EXC_LR_OFFSET(r1)
	PPC_REG_STORE	r0, GPR0_OFFSET(r1)
	PPC_REG_STORE	r1, GPR1_OFFSET(r1)
	PPC_REG_STORE	r2, GPR2_OFFSET(r1)
	PPC_REG_STORE	r5, GPR5_OFFSET(r1)
	PPC_REG_STORE	r6, GPR6_OFFSET(r1)
	PPC_REG_STORE	r7, GPR7_OFFSET(r1)
	PPC_REG_STORE	r8, GPR8_OFFSET(r1)
	PPC_REG_STORE	r9, GPR9_OFFSET(r1)
	PPC_REG_STORE	r10, GPR10_OFFSET(r1)
	PPC_REG_STORE	r11, GPR11_OFFSET(r1)
	PPC_REG_STORE	r12, GPR12_OFFSET(r1)
	PPC_REG_STORE	r13, GPR13_OFFSET(r1)
	PPC_REG_STORE	r14, GPR14_OFFSET(r1)
	PPC_REG_STORE	r15, GPR15_OFFSET(r1)
	PPC_REG_STORE	r16, GPR16_OFFSET(r1)
	PPC_REG_STORE	r17, GPR17_OFFSET(r1)
	PPC_REG_STORE	r18, GPR18_OFFSET(r1)
	PPC_REG_STORE	r19, GPR19_OFFSET(r1)
	PPC_REG_STORE	r20, GPR20_OFFSET(r1)
	PPC_REG_STORE	r21, GPR21_OFFSET(r1)
	PPC_REG_STORE	r22, GPR22_OFFSET(r1)
	PPC_REG_STORE	r23, GPR23_OFFSET(r1)
	PPC_REG_STORE	r24, GPR24_OFFSET(r1)
	PPC_REG_STORE	r25, GPR25_OFFSET(r1)
	PPC_REG_STORE	r26, GPR26_OFFSET(r1)
	PPC_REG_STORE	r27, GPR27_OFFSET(r1)
	PPC_REG_STORE	r28, GPR28_OFFSET(r1)
	PPC_REG_STORE	r29, GPR29_OFFSET(r1)
	PPC_REG_STORE	r30, GPR30_OFFSET(r1)
	PPC_REG_STORE	r31, GPR31_OFFSET(r1)

	/* Enable FPU and/or AltiVec */
#if defined(PPC_MULTILIB_FPU) || defined(PPC_MULTILIB_ALTIVEC)
	mfmsr	SCRATCH_REGISTER_1
#ifdef PPC_MULTILIB_FPU
	ori	SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, MSR_FP
#endif
#ifdef PPC_MULTILIB_ALTIVEC
	oris	SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, MSR_VE >> 16
#endif
	mtmsr	SCRATCH_REGISTER_1
	isync
#endif

#ifdef PPC_MULTILIB_ALTIVEC
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(0)
	stvx	v0, r1, SCRATCH_REGISTER_1
	mfvscr	v0
	li	SCRATCH_REGISTER_1, PPC_EXC_VSCR_OFFSET
	stvewx	v0, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(1)
	stvx	v1, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(2)
	stvx	v2, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(3)
	stvx	v3, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(4)
	stvx	v4, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(5)
	stvx	v5, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(6)
	stvx	v6, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(7)
	stvx	v7, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(8)
	stvx	v8, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(9)
	stvx	v9, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(10)
	stvx	v10, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(11)
	stvx	v11, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(12)
	stvx	v12, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(13)
	stvx	v13, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(14)
	stvx	v14, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(15)
	stvx	v15, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(16)
	stvx	v16, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(17)
	stvx	v17, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(18)
	stvx	v18, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(19)
	stvx	v19, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(20)
	stvx	v20, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(21)
	stvx	v21, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(22)
	stvx	v22, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(23)
	stvx	v23, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(24)
	stvx	v24, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(25)
	stvx	v25, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(26)
	stvx	v26, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(27)
	stvx	v27, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(28)
	stvx	v28, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(29)
	stvx	v29, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(30)
	stvx	v30, r1, SCRATCH_REGISTER_1
	li	SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(31)
	stvx	v31, r1, SCRATCH_REGISTER_1
	mfvrsave	SCRATCH_REGISTER_1
	stw	SCRATCH_REGISTER_1, PPC_EXC_VRSAVE_OFFSET(r1)
#endif

#ifdef PPC_MULTILIB_FPU
	stfd	f0, PPC_EXC_FR_OFFSET(0)(r1)
	mffs	f0
	stfd	f0, PPC_EXC_FPSCR_OFFSET(r1)
	stfd	f1, PPC_EXC_FR_OFFSET(1)(r1)
	stfd	f2, PPC_EXC_FR_OFFSET(2)(r1)
	stfd	f3, PPC_EXC_FR_OFFSET(3)(r1)
	stfd	f4, PPC_EXC_FR_OFFSET(4)(r1)
	stfd	f5, PPC_EXC_FR_OFFSET(5)(r1)
	stfd	f6, PPC_EXC_FR_OFFSET(6)(r1)
	stfd	f7, PPC_EXC_FR_OFFSET(7)(r1)
	stfd	f8, PPC_EXC_FR_OFFSET(8)(r1)
	stfd	f9, PPC_EXC_FR_OFFSET(9)(r1)
	stfd	f10, PPC_EXC_FR_OFFSET(10)(r1)
	stfd	f11, PPC_EXC_FR_OFFSET(11)(r1)
	stfd	f12, PPC_EXC_FR_OFFSET(12)(r1)
	stfd	f13, PPC_EXC_FR_OFFSET(13)(r1)
	stfd	f14, PPC_EXC_FR_OFFSET(14)(r1)
	stfd	f15, PPC_EXC_FR_OFFSET(15)(r1)
	stfd	f16, PPC_EXC_FR_OFFSET(16)(r1)
	stfd	f17, PPC_EXC_FR_OFFSET(17)(r1)
	stfd	f18, PPC_EXC_FR_OFFSET(18)(r1)
	stfd	f19, PPC_EXC_FR_OFFSET(19)(r1)
	stfd	f20, PPC_EXC_FR_OFFSET(20)(r1)
	stfd	f21, PPC_EXC_FR_OFFSET(21)(r1)
	stfd	f22, PPC_EXC_FR_OFFSET(22)(r1)
	stfd	f23, PPC_EXC_FR_OFFSET(23)(r1)
	stfd	f24, PPC_EXC_FR_OFFSET(24)(r1)
	stfd	f25, PPC_EXC_FR_OFFSET(25)(r1)
	stfd	f26, PPC_EXC_FR_OFFSET(26)(r1)
	stfd	f27, PPC_EXC_FR_OFFSET(27)(r1)
	stfd	f28, PPC_EXC_FR_OFFSET(28)(r1)
	stfd	f29, PPC_EXC_FR_OFFSET(29)(r1)
	stfd	f30, PPC_EXC_FR_OFFSET(30)(r1)
	stfd	f31, PPC_EXC_FR_OFFSET(31)(r1)
#endif

	li	r3, 9
	addi	r4, r1, FRAME_LINK_SPACE
	b	_Terminate
	PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE