Blame view

arch/powerpc/kernel/head_booke.h 16 KB
63dafe572   Becky Bruce   [PATCH] powerpc: ...
1
2
  #ifndef __HEAD_BOOKE_H__
  #define __HEAD_BOOKE_H__
471c70ff3   Torez Smith   powerpc/booke: Ad...
3
  #include <asm/ptrace.h>	/* for STACK_FRAME_REGS_MARKER */
63dafe572   Becky Bruce   [PATCH] powerpc: ...
4
5
6
7
8
9
10
11
  /*
   * Macros used for common Book-e exception handling
   */
  
  #define SET_IVOR(vector_number, vector_label)		\
  		li	r26,vector_label@l; 		\
  		mtspr	SPRN_IVOR##vector_number,r26;	\
  		sync
e12401222   Yuri Tikhonov   powerpc/44x: Supp...
12
13
14
15
16
17
18
19
  #if (THREAD_SHIFT < 15)
  #define ALLOC_STACK_FRAME(reg, val)			\
  	addi reg,reg,val
  #else
  #define ALLOC_STACK_FRAME(reg, val)			\
  	addis	reg,reg,val@ha;				\
  	addi	reg,reg,val@l
  #endif
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
20
21
22
23
24
25
26
  /*
   * Macro used to get to thread save registers.
   * Note that entries 0-3 are used for the prolog code, and the remaining
   * entries are available for specific exception use in the event a handler
   * requires more than 4 scratch registers.
   */
  #define THREAD_NORMSAVE(offset)	(THREAD_NORMSAVES + (offset * 4))
63dafe572   Becky Bruce   [PATCH] powerpc: ...
27
  #define NORMAL_EXCEPTION_PROLOG						     \
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
28
29
30
31
32
  	mtspr	SPRN_SPRG_WSCRATCH0, r10;	/* save one register */	     \
  	mfspr	r10, SPRN_SPRG_THREAD;					     \
  	stw	r11, THREAD_NORMSAVE(0)(r10);				     \
  	stw	r13, THREAD_NORMSAVE(2)(r10);				     \
  	mfcr	r13;			/* save CR in r13 for now	   */\
63dafe572   Becky Bruce   [PATCH] powerpc: ...
33
34
  	mfspr	r11,SPRN_SRR1;		/* check whether user or kernel    */\
  	andi.	r11,r11,MSR_PR;						     \
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
35
  	mr	r11, r1;						     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
36
  	beq	1f;							     \
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
37
38
39
40
41
  	/* if from user, start at top of this thread's kernel stack */       \
  	lwz	r11, THREAD_INFO-THREAD(r10);				     \
  	ALLOC_STACK_FRAME(r11, THREAD_SIZE);				     \
  1 :	subi	r11, r11, INT_FRAME_SIZE; /* Allocate exception frame */     \
  	stw	r13, _CCR(r11);		/* save various registers */	     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
42
43
  	stw	r12,GPR12(r11);						     \
  	stw	r9,GPR9(r11);						     \
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
44
45
46
  	mfspr	r13, SPRN_SPRG_RSCRATCH0;				     \
  	stw	r13, GPR10(r11);					     \
  	lwz	r12, THREAD_NORMSAVE(0)(r10);				     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
47
  	stw	r12,GPR11(r11);						     \
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
48
  	lwz	r13, THREAD_NORMSAVE(2)(r10); /* restore r13 */		     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
49
50
  	mflr	r10;							     \
  	stw	r10,_LINK(r11);						     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
51
  	mfspr	r12,SPRN_SRR0;						     \
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
52
  	stw	r1, GPR1(r11);						     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
53
  	mfspr	r9,SPRN_SRR1;						     \
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
54
55
  	stw	r1, 0(r11);						     \
  	mr	r1, r11;						     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
56
57
  	rlwinm	r9,r9,0,14,12;		/* clear MSR_WE (necessary?)	   */\
  	stw	r0,GPR0(r11);						     \
471c70ff3   Torez Smith   powerpc/booke: Ad...
58
59
60
  	lis	r10, STACK_FRAME_REGS_MARKER@ha;/* exception frame marker */ \
  	addi	r10, r10, STACK_FRAME_REGS_MARKER@l;			     \
  	stw	r10, 8(r11);						     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
61
62
63
64
  	SAVE_4GPRS(3, r11);						     \
  	SAVE_2GPRS(7, r11)
  
  /* To handle the additional exception priority levels on 40x and Book-E
bcf0b0880   Kumar Gala   [POWERPC] Move to...
65
   * processors we allocate a stack per additional priority level.
63dafe572   Becky Bruce   [PATCH] powerpc: ...
66
67
68
69
70
71
72
73
74
75
   *
   * On 40x critical is the only additional level
   * On 44x/e500 we have critical and machine check
   * On e200 we have critical and debug (machine check occurs via critical)
   *
   * Additionally we reserve a SPRG for each priority level so we can free up a
   * GPR to use as the base for indirect access to the exception stacks.  This
   * is necessary since the MMU is always on, for Book-E parts, and the stacks
   * are offset from KERNELBASE.
   *
eb0cd5fd2   Kumar Gala   [POWERPC] Rework ...
76
77
78
79
   * There is some space optimization to be had here if desired.  However
   * to allow for a common kernel with support for debug exceptions either
   * going to critical or their own debug level we aren't currently
   * providing configurations that micro-optimize space usage.
63dafe572   Becky Bruce   [PATCH] powerpc: ...
80
   */
63dafe572   Becky Bruce   [PATCH] powerpc: ...
81

ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
82
  #define MC_STACK_BASE		mcheckirq_ctx
bcf0b0880   Kumar Gala   [POWERPC] Move to...
83
  #define CRIT_STACK_BASE		critirq_ctx
63dafe572   Becky Bruce   [PATCH] powerpc: ...
84

3dfa87736   Kumar Gala   powerpc/booke: Ad...
85
  /* only on e500mc/e200 */
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
86
  #define DBG_STACK_BASE		dbgirq_ctx
63dafe572   Becky Bruce   [PATCH] powerpc: ...
87

fca622c5b   Kumar Gala   [POWERPC] 40x/Boo...
88
  #define EXC_LVL_FRAME_OVERHEAD	(THREAD_SIZE - INT_FRAME_SIZE - EXC_LVL_SIZE)
369e757b6   Kumar Gala   [POWERPC] Rework ...
89

63dafe572   Becky Bruce   [PATCH] powerpc: ...
90
91
92
  #ifdef CONFIG_SMP
  #define BOOKE_LOAD_EXC_LEVEL_STACK(level)		\
  	mfspr	r8,SPRN_PIR;				\
bcf0b0880   Kumar Gala   [POWERPC] Move to...
93
94
95
  	slwi	r8,r8,2;				\
  	addis	r8,r8,level##_STACK_BASE@ha;		\
  	lwz	r8,level##_STACK_BASE@l(r8);		\
369e757b6   Kumar Gala   [POWERPC] Rework ...
96
  	addi	r8,r8,EXC_LVL_FRAME_OVERHEAD;
63dafe572   Becky Bruce   [PATCH] powerpc: ...
97
98
  #else
  #define BOOKE_LOAD_EXC_LEVEL_STACK(level)		\
bcf0b0880   Kumar Gala   [POWERPC] Move to...
99
100
  	lis	r8,level##_STACK_BASE@ha;		\
  	lwz	r8,level##_STACK_BASE@l(r8);		\
369e757b6   Kumar Gala   [POWERPC] Rework ...
101
  	addi	r8,r8,EXC_LVL_FRAME_OVERHEAD;
63dafe572   Becky Bruce   [PATCH] powerpc: ...
102
103
104
105
106
107
108
109
110
111
112
  #endif
  
  /*
   * Exception prolog for critical/machine check exceptions.  This is a
   * little different from the normal exception prolog above since a
   * critical/machine check exception can potentially occur at any point
   * during normal exception processing. Thus we cannot use the same SPRG
   * registers as the normal prolog above. Instead we use a portion of the
   * critical/machine check exception stack at low physical addresses.
   */
  #define EXC_LEVEL_EXCEPTION_PROLOG(exc_level, exc_level_srr0, exc_level_srr1) \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
113
  	mtspr	SPRN_SPRG_WSCRATCH_##exc_level,r8;			     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
114
  	BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \
369e757b6   Kumar Gala   [POWERPC] Rework ...
115
116
117
118
119
120
121
  	stw	r9,GPR9(r8);		/* save various registers	   */\
  	mfcr	r9;			/* save CR in r9 for now	   */\
  	stw	r10,GPR10(r8);						     \
  	stw	r11,GPR11(r8);						     \
  	stw	r9,_CCR(r8);		/* save CR on stack		   */\
  	mfspr	r10,exc_level_srr1;	/* check whether user or kernel    */\
  	andi.	r10,r10,MSR_PR;						     \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
122
  	mfspr	r11,SPRN_SPRG_THREAD;	/* if from user, start at top of   */\
63dafe572   Becky Bruce   [PATCH] powerpc: ...
123
  	lwz	r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
369e757b6   Kumar Gala   [POWERPC] Rework ...
124
125
126
127
128
129
130
131
  	addi	r11,r11,EXC_LVL_FRAME_OVERHEAD;	/* allocate stack frame    */\
  	beq	1f;							     \
  	/* COMING FROM USER MODE */					     \
  	stw	r9,_CCR(r11);		/* save CR			   */\
  	lwz	r10,GPR10(r8);		/* copy regs from exception stack  */\
  	lwz	r9,GPR9(r8);						     \
  	stw	r10,GPR10(r11);						     \
  	lwz	r10,GPR11(r8);						     \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
132
  	stw	r9,GPR9(r11);						     \
369e757b6   Kumar Gala   [POWERPC] Rework ...
133
134
135
136
137
138
139
140
141
142
  	stw	r10,GPR11(r11);						     \
  	b	2f;							     \
  	/* COMING FROM PRIV MODE */					     \
  1:	lwz	r9,TI_FLAGS-EXC_LVL_FRAME_OVERHEAD(r11);		     \
  	lwz	r10,TI_PREEMPT-EXC_LVL_FRAME_OVERHEAD(r11);		     \
  	stw	r9,TI_FLAGS-EXC_LVL_FRAME_OVERHEAD(r8);			     \
  	stw	r10,TI_PREEMPT-EXC_LVL_FRAME_OVERHEAD(r8);		     \
  	lwz	r9,TI_TASK-EXC_LVL_FRAME_OVERHEAD(r11);			     \
  	stw	r9,TI_TASK-EXC_LVL_FRAME_OVERHEAD(r8);			     \
  	mr	r11,r8;							     \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
143
  2:	mfspr	r8,SPRN_SPRG_RSCRATCH_##exc_level;			     \
369e757b6   Kumar Gala   [POWERPC] Rework ...
144
  	stw	r12,GPR12(r11);		/* save various registers	   */\
63dafe572   Becky Bruce   [PATCH] powerpc: ...
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  	mflr	r10;							     \
  	stw	r10,_LINK(r11);						     \
  	mfspr	r12,SPRN_DEAR;		/* save DEAR and ESR in the frame  */\
  	stw	r12,_DEAR(r11);		/* since they may have had stuff   */\
  	mfspr	r9,SPRN_ESR;		/* in them at the point where the  */\
  	stw	r9,_ESR(r11);		/* exception was taken		   */\
  	mfspr	r12,exc_level_srr0;					     \
  	stw	r1,GPR1(r11);						     \
  	mfspr	r9,exc_level_srr1;					     \
  	stw	r1,0(r11);						     \
  	mr	r1,r11;							     \
  	rlwinm	r9,r9,0,14,12;		/* clear MSR_WE (necessary?)	   */\
  	stw	r0,GPR0(r11);						     \
  	SAVE_4GPRS(3, r11);						     \
  	SAVE_2GPRS(7, r11)
  
  #define CRITICAL_EXCEPTION_PROLOG \
  		EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1)
  #define DEBUG_EXCEPTION_PROLOG \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
164
  		EXC_LEVEL_EXCEPTION_PROLOG(DBG, SPRN_DSRR0, SPRN_DSRR1)
63dafe572   Becky Bruce   [PATCH] powerpc: ...
165
  #define MCHECK_EXCEPTION_PROLOG \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
166
  		EXC_LEVEL_EXCEPTION_PROLOG(MC, SPRN_MCSRR0, SPRN_MCSRR1)
63dafe572   Becky Bruce   [PATCH] powerpc: ...
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
  
  /*
   * Exception vectors.
   */
  #define	START_EXCEPTION(label)						     \
          .align 5;              						     \
  label:
  
  #define FINISH_EXCEPTION(func)					\
  	bl	transfer_to_handler_full;			\
  	.long	func;						\
  	.long	ret_from_except_full
  
  #define EXCEPTION(n, label, hdlr, xfer)				\
  	START_EXCEPTION(label);					\
  	NORMAL_EXCEPTION_PROLOG;				\
  	addi	r3,r1,STACK_FRAME_OVERHEAD;			\
  	xfer(n, hdlr)
  
  #define CRITICAL_EXCEPTION(n, label, hdlr)			\
  	START_EXCEPTION(label);					\
  	CRITICAL_EXCEPTION_PROLOG;				\
  	addi	r3,r1,STACK_FRAME_OVERHEAD;			\
  	EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
  			  NOCOPY, crit_transfer_to_handler, \
  			  ret_from_crit_exc)
  
  #define MCHECK_EXCEPTION(n, label, hdlr)			\
  	START_EXCEPTION(label);					\
  	MCHECK_EXCEPTION_PROLOG;				\
  	mfspr	r5,SPRN_ESR;					\
  	stw	r5,_ESR(r11);					\
  	addi	r3,r1,STACK_FRAME_OVERHEAD;			\
47c0bd1ae   Benjamin Herrenschmidt   [POWERPC] Reworki...
200
  	EXC_XFER_TEMPLATE(hdlr, n+4, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
  			  NOCOPY, mcheck_transfer_to_handler,   \
  			  ret_from_mcheck_exc)
  
  #define EXC_XFER_TEMPLATE(hdlr, trap, msr, copyee, tfer, ret)	\
  	li	r10,trap;					\
  	stw	r10,_TRAP(r11);					\
  	lis	r10,msr@h;					\
  	ori	r10,r10,msr@l;					\
  	copyee(r10, r9);					\
  	bl	tfer;		 				\
  	.long	hdlr;						\
  	.long	ret
  
  #define COPY_EE(d, s)		rlwimi d,s,0,16,16
  #define NOCOPY(d, s)
  
  #define EXC_XFER_STD(n, hdlr)		\
  	EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, NOCOPY, transfer_to_handler_full, \
  			  ret_from_except_full)
  
  #define EXC_XFER_LITE(n, hdlr)		\
  	EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, NOCOPY, transfer_to_handler, \
  			  ret_from_except)
  
  #define EXC_XFER_EE(n, hdlr)		\
  	EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, COPY_EE, transfer_to_handler_full, \
  			  ret_from_except_full)
  
  #define EXC_XFER_EE_LITE(n, hdlr)	\
  	EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, COPY_EE, transfer_to_handler, \
  			  ret_from_except)
  
  /* Check for a single step debug exception while in an exception
   * handler before state has been saved.  This is to catch the case
   * where an instruction that we are trying to single step causes
   * an exception (eg ITLB/DTLB miss) and thus the first instruction of
   * the exception handler generates a single step debug exception.
   *
   * If we get a debug trap on the first instruction of an exception handler,
   * we reset the MSR_DE in the _exception handler's_ MSR (the debug trap is
   * a critical exception, so we are using SPRN_CSRR1 to manipulate the MSR).
   * The exception handler was handling a non-critical interrupt, so it will
   * save (and later restore) the MSR via SPRN_CSRR1, which will still have
   * the MSR_DE bit set.
   */
eb0cd5fd2   Kumar Gala   [POWERPC] Rework ...
246
247
  #define DEBUG_DEBUG_EXCEPTION						      \
  	START_EXCEPTION(DebugDebug);					      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
248
249
250
251
252
253
254
255
  	DEBUG_EXCEPTION_PROLOG;						      \
  									      \
  	/*								      \
  	 * If there is a single step or branch-taken exception in an	      \
  	 * exception entry sequence, it was probably meant to apply to	      \
  	 * the code where the exception occurred (since exception entry	      \
  	 * doesn't turn off DE automatically).  We simulate the effect	      \
  	 * of turning off DE on entry to an exception handler by turning      \
fec6a8228   Kumar Gala   powerpc/booke: Fi...
256
  	 * off DE in the DSRR1 value and clearing the debug status.	      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
257
258
  	 */								      \
  	mfspr	r10,SPRN_DBSR;		/* check single-step/branch taken */  \
ec097c84d   Roland McGrath   powerpc: Add PTRA...
259
  	andis.	r10,r10,(DBSR_IC|DBSR_BT)@h;				      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
260
261
262
263
264
265
266
  	beq+	2f;							      \
  									      \
  	lis	r10,KERNELBASE@h;	/* check if exception in vectors */   \
  	ori	r10,r10,KERNELBASE@l;					      \
  	cmplw	r12,r10;						      \
  	blt+	2f;			/* addr below exception vectors */    \
  									      \
eb0cd5fd2   Kumar Gala   [POWERPC] Rework ...
267
268
  	lis	r10,DebugDebug@h;					      \
  	ori	r10,r10,DebugDebug@l;					      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
269
270
271
272
273
  	cmplw	r12,r10;						      \
  	bgt+	2f;			/* addr above exception vectors */    \
  									      \
  	/* here it looks like we got an inappropriate debug exception. */     \
  1:	rlwinm	r9,r9,0,~MSR_DE;	/* clear DE in the CDRR1 value */     \
ec097c84d   Roland McGrath   powerpc: Add PTRA...
274
  	lis	r10,(DBSR_IC|DBSR_BT)@h;	/* clear the IC event */      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
275
276
277
278
279
280
281
282
283
284
  	mtspr	SPRN_DBSR,r10;						      \
  	/* restore state and get out */					      \
  	lwz	r10,_CCR(r11);						      \
  	lwz	r0,GPR0(r11);						      \
  	lwz	r1,GPR1(r11);						      \
  	mtcrf	0x80,r10;						      \
  	mtspr	SPRN_DSRR0,r12;						      \
  	mtspr	SPRN_DSRR1,r9;						      \
  	lwz	r9,GPR9(r11);						      \
  	lwz	r12,GPR12(r11);						      \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
285
286
  	mtspr	SPRN_SPRG_WSCRATCH_DBG,r8;				      \
  	BOOKE_LOAD_EXC_LEVEL_STACK(DBG); /* r8 points to the debug stack */ \
369e757b6   Kumar Gala   [POWERPC] Rework ...
287
288
  	lwz	r10,GPR10(r8);						      \
  	lwz	r11,GPR11(r8);						      \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
289
  	mfspr	r8,SPRN_SPRG_RSCRATCH_DBG;				      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
290
  									      \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
291
  	PPC_RFDI;							      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
292
293
  	b	.;							      \
  									      \
fec6a8228   Kumar Gala   powerpc/booke: Fi...
294
  	/* continue normal handling for a debug exception... */		      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
295
296
  2:	mfspr	r4,SPRN_DBSR;						      \
  	addi	r3,r1,STACK_FRAME_OVERHEAD;				      \
663276b7c   Kumar Gala   [POWERPC] Set low...
297
  	EXC_XFER_TEMPLATE(DebugException, 0x2008, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), NOCOPY, debug_transfer_to_handler, ret_from_debug_exc)
eb0cd5fd2   Kumar Gala   [POWERPC] Rework ...
298
299
300
  
  #define DEBUG_CRIT_EXCEPTION						      \
  	START_EXCEPTION(DebugCrit);					      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
301
302
303
304
305
306
307
308
309
310
311
  	CRITICAL_EXCEPTION_PROLOG;					      \
  									      \
  	/*								      \
  	 * If there is a single step or branch-taken exception in an	      \
  	 * exception entry sequence, it was probably meant to apply to	      \
  	 * the code where the exception occurred (since exception entry	      \
  	 * doesn't turn off DE automatically).  We simulate the effect	      \
  	 * of turning off DE on entry to an exception handler by turning      \
  	 * off DE in the CSRR1 value and clearing the debug status.	      \
  	 */								      \
  	mfspr	r10,SPRN_DBSR;		/* check single-step/branch taken */  \
ec097c84d   Roland McGrath   powerpc: Add PTRA...
312
  	andis.	r10,r10,(DBSR_IC|DBSR_BT)@h;				      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
313
314
315
316
317
318
319
  	beq+	2f;							      \
  									      \
  	lis	r10,KERNELBASE@h;	/* check if exception in vectors */   \
  	ori	r10,r10,KERNELBASE@l;					      \
  	cmplw	r12,r10;						      \
  	blt+	2f;			/* addr below exception vectors */    \
  									      \
ec097c84d   Roland McGrath   powerpc: Add PTRA...
320
  	lis	r10,DebugCrit@h;					      \
eb0cd5fd2   Kumar Gala   [POWERPC] Rework ...
321
  	ori	r10,r10,DebugCrit@l;					      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
322
323
324
325
326
  	cmplw	r12,r10;						      \
  	bgt+	2f;			/* addr above exception vectors */    \
  									      \
  	/* here it looks like we got an inappropriate debug exception. */     \
  1:	rlwinm	r9,r9,0,~MSR_DE;	/* clear DE in the CSRR1 value */     \
ec097c84d   Roland McGrath   powerpc: Add PTRA...
327
  	lis	r10,(DBSR_IC|DBSR_BT)@h;	/* clear the IC event */      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
328
329
330
331
332
333
334
335
336
337
  	mtspr	SPRN_DBSR,r10;						      \
  	/* restore state and get out */					      \
  	lwz	r10,_CCR(r11);						      \
  	lwz	r0,GPR0(r11);						      \
  	lwz	r1,GPR1(r11);						      \
  	mtcrf	0x80,r10;						      \
  	mtspr	SPRN_CSRR0,r12;						      \
  	mtspr	SPRN_CSRR1,r9;						      \
  	lwz	r9,GPR9(r11);						      \
  	lwz	r12,GPR12(r11);						      \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
338
  	mtspr	SPRN_SPRG_WSCRATCH_CRIT,r8;				      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
339
  	BOOKE_LOAD_EXC_LEVEL_STACK(CRIT); /* r8 points to the debug stack */  \
369e757b6   Kumar Gala   [POWERPC] Rework ...
340
341
  	lwz	r10,GPR10(r8);						      \
  	lwz	r11,GPR11(r8);						      \
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
342
  	mfspr	r8,SPRN_SPRG_RSCRATCH_CRIT;				      \
63dafe572   Becky Bruce   [PATCH] powerpc: ...
343
344
345
346
347
348
349
350
  									      \
  	rfci;								      \
  	b	.;							      \
  									      \
  	/* continue normal handling for a critical exception... */	      \
  2:	mfspr	r4,SPRN_DBSR;						      \
  	addi	r3,r1,STACK_FRAME_OVERHEAD;				      \
  	EXC_XFER_TEMPLATE(DebugException, 0x2002, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), NOCOPY, crit_transfer_to_handler, ret_from_crit_exc)
63dafe572   Becky Bruce   [PATCH] powerpc: ...
351

1bc54c031   Benjamin Herrenschmidt   powerpc: rework 4...
352
353
354
355
356
357
358
  #define DATA_STORAGE_EXCEPTION						      \
  	START_EXCEPTION(DataStorage)					      \
  	NORMAL_EXCEPTION_PROLOG;					      \
  	mfspr	r5,SPRN_ESR;		/* Grab the ESR and save it */	      \
  	stw	r5,_ESR(r11);						      \
  	mfspr	r4,SPRN_DEAR;		/* Grab the DEAR */		      \
  	EXC_XFER_EE_LITE(0x0300, handle_page_fault)
63dafe572   Becky Bruce   [PATCH] powerpc: ...
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
  #define INSTRUCTION_STORAGE_EXCEPTION					      \
  	START_EXCEPTION(InstructionStorage)				      \
  	NORMAL_EXCEPTION_PROLOG;					      \
  	mfspr	r5,SPRN_ESR;		/* Grab the ESR and save it */	      \
  	stw	r5,_ESR(r11);						      \
  	mr      r4,r12;                 /* Pass SRR0 as arg2 */		      \
  	li      r5,0;                   /* Pass zero as arg3 */		      \
  	EXC_XFER_EE_LITE(0x0400, handle_page_fault)
  
  #define ALIGNMENT_EXCEPTION						      \
  	START_EXCEPTION(Alignment)					      \
  	NORMAL_EXCEPTION_PROLOG;					      \
  	mfspr   r4,SPRN_DEAR;           /* Grab the DEAR and save it */	      \
  	stw     r4,_DEAR(r11);						      \
  	addi    r3,r1,STACK_FRAME_OVERHEAD;				      \
  	EXC_XFER_EE(0x0600, alignment_exception)
  
  #define PROGRAM_EXCEPTION						      \
  	START_EXCEPTION(Program)					      \
  	NORMAL_EXCEPTION_PROLOG;					      \
  	mfspr	r4,SPRN_ESR;		/* Grab the ESR and save it */	      \
  	stw	r4,_ESR(r11);						      \
  	addi	r3,r1,STACK_FRAME_OVERHEAD;				      \
  	EXC_XFER_STD(0x0700, program_check_exception)
  
  #define DECREMENTER_EXCEPTION						      \
  	START_EXCEPTION(Decrementer)					      \
  	NORMAL_EXCEPTION_PROLOG;					      \
  	lis     r0,TSR_DIS@h;           /* Setup the DEC interrupt mask */    \
  	mtspr   SPRN_TSR,r0;		/* Clear the DEC interrupt */	      \
  	addi    r3,r1,STACK_FRAME_OVERHEAD;				      \
  	EXC_XFER_LITE(0x0900, timer_interrupt)
  
  #define FP_UNAVAILABLE_EXCEPTION					      \
  	START_EXCEPTION(FloatingPointUnavailable)			      \
  	NORMAL_EXCEPTION_PROLOG;					      \
6f3d8e694   Michael Neuling   powerpc: Make loa...
395
396
397
398
  	beq	1f;							      \
  	bl	load_up_fpu;		/* if from user, just load it up */   \
  	b	fast_exception_return;					      \
  1:	addi	r3,r1,STACK_FRAME_OVERHEAD;				      \
66f2d025e   Becky Bruce   [PATCH] powerpc: ...
399
  	EXC_XFER_EE_LITE(0x800, kernel_fp_unavailable_exception)
63dafe572   Becky Bruce   [PATCH] powerpc: ...
400

fca622c5b   Kumar Gala   [POWERPC] 40x/Boo...
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
  #ifndef __ASSEMBLY__
  struct exception_regs {
  	unsigned long mas0;
  	unsigned long mas1;
  	unsigned long mas2;
  	unsigned long mas3;
  	unsigned long mas6;
  	unsigned long mas7;
  	unsigned long srr0;
  	unsigned long srr1;
  	unsigned long csrr0;
  	unsigned long csrr1;
  	unsigned long dsrr0;
  	unsigned long dsrr1;
  	unsigned long saved_ksp_limit;
  };
  
  /* ensure this structure is always sized to a multiple of the stack alignment */
  #define STACK_EXC_LVL_FRAME_SIZE	_ALIGN_UP(sizeof (struct exception_regs), 16)
  
  #endif /* __ASSEMBLY__ */
63dafe572   Becky Bruce   [PATCH] powerpc: ...
422
  #endif /* __HEAD_BOOKE_H__ */