|
@@ -296,7 +296,8 @@ ret_from_mc_except:
|
|
|
andi. r10,r11,MSR_PR; /* save stack pointer */ \
|
|
andi. r10,r11,MSR_PR; /* save stack pointer */ \
|
|
|
beq 1f; /* branch around if supervisor */ \
|
|
beq 1f; /* branch around if supervisor */ \
|
|
|
ld r1,PACAKSAVE(r13); /* get kernel stack coming from usr */\
|
|
ld r1,PACAKSAVE(r13); /* get kernel stack coming from usr */\
|
|
|
-1: cmpdi cr1,r1,0; /* check if SP makes sense */ \
|
|
|
|
|
|
|
+1: type##_BTB_FLUSH \
|
|
|
|
|
+ cmpdi cr1,r1,0; /* check if SP makes sense */ \
|
|
|
bge- cr1,exc_##n##_bad_stack;/* bad stack (TODO: out of line) */ \
|
|
bge- cr1,exc_##n##_bad_stack;/* bad stack (TODO: out of line) */ \
|
|
|
mfspr r10,SPRN_##type##_SRR0; /* read SRR0 before touching stack */
|
|
mfspr r10,SPRN_##type##_SRR0; /* read SRR0 before touching stack */
|
|
|
|
|
|
|
@@ -328,6 +329,29 @@ ret_from_mc_except:
|
|
|
#define SPRN_MC_SRR0 SPRN_MCSRR0
|
|
#define SPRN_MC_SRR0 SPRN_MCSRR0
|
|
|
#define SPRN_MC_SRR1 SPRN_MCSRR1
|
|
#define SPRN_MC_SRR1 SPRN_MCSRR1
|
|
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PPC_FSL_BOOK3E
|
|
|
|
|
+#define GEN_BTB_FLUSH \
|
|
|
|
|
+ START_BTB_FLUSH_SECTION \
|
|
|
|
|
+ beq 1f; \
|
|
|
|
|
+ BTB_FLUSH(r10) \
|
|
|
|
|
+ 1: \
|
|
|
|
|
+ END_BTB_FLUSH_SECTION
|
|
|
|
|
+
|
|
|
|
|
+#define CRIT_BTB_FLUSH \
|
|
|
|
|
+ START_BTB_FLUSH_SECTION \
|
|
|
|
|
+ BTB_FLUSH(r10) \
|
|
|
|
|
+ END_BTB_FLUSH_SECTION
|
|
|
|
|
+
|
|
|
|
|
+#define DBG_BTB_FLUSH CRIT_BTB_FLUSH
|
|
|
|
|
+#define MC_BTB_FLUSH CRIT_BTB_FLUSH
|
|
|
|
|
+#define GDBELL_BTB_FLUSH GEN_BTB_FLUSH
|
|
|
|
|
+#else
|
|
|
|
|
+#define GEN_BTB_FLUSH
|
|
|
|
|
+#define CRIT_BTB_FLUSH
|
|
|
|
|
+#define DBG_BTB_FLUSH
|
|
|
|
|
+#define GDBELL_BTB_FLUSH
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
#define NORMAL_EXCEPTION_PROLOG(n, intnum, addition) \
|
|
#define NORMAL_EXCEPTION_PROLOG(n, intnum, addition) \
|
|
|
EXCEPTION_PROLOG(n, intnum, GEN, addition##_GEN(n))
|
|
EXCEPTION_PROLOG(n, intnum, GEN, addition##_GEN(n))
|
|
|
|
|
|