|
@@ -42,6 +42,7 @@
|
|
|
mfspr r13,SPRN_SPRG_PACA; /* get PACA */ \
|
|
|
std r10,PACA_EX##type+EX_R10(r13); \
|
|
|
std r11,PACA_EX##type+EX_R11(r13); \
|
|
|
+ PROLOG_STORE_RESTORE_SCRATCH_##type; \
|
|
|
mfcr r10; /* save CR */ \
|
|
|
mfspr r11,SPRN_##type##_SRR1;/* what are we coming from */ \
|
|
|
DO_KVM intnum,SPRN_##type##_SRR1; /* KVM hook */ \
|
|
@@ -99,6 +100,18 @@
|
|
|
#define GDBELL_EXCEPTION_PROLOG(n, intnum, addition) \
|
|
|
EXCEPTION_PROLOG(n, intnum, GDBELL, addition##_GDBELL(n))
|
|
|
|
|
|
+/*
|
|
|
+ * Store user-visible scratch in PACA exception slots and restore proper value
|
|
|
+ */
|
|
|
+#define PROLOG_STORE_RESTORE_SCRATCH_GEN
|
|
|
+#define PROLOG_STORE_RESTORE_SCRATCH_GDBELL
|
|
|
+#define PROLOG_STORE_RESTORE_SCRATCH_DBG
|
|
|
+#define PROLOG_STORE_RESTORE_SCRATCH_MC
|
|
|
+
|
|
|
+#define PROLOG_STORE_RESTORE_SCRATCH_CRIT \
|
|
|
+ mfspr r10,SPRN_SPRG_CRIT_SCRATCH; /* get r13 */ \
|
|
|
+ std r10,PACA_EXCRIT+EX_R13(r13)
|
|
|
+
|
|
|
/* Variants of the "addition" argument for the prolog
|
|
|
*/
|
|
|
#define PROLOG_ADDITION_NONE_GEN(n)
|
|
@@ -454,7 +467,7 @@ interrupt_end_book3e:
|
|
|
mtcr r10
|
|
|
ld r10,PACA_EXCRIT+EX_R10(r13) /* restore registers */
|
|
|
ld r11,PACA_EXCRIT+EX_R11(r13)
|
|
|
- mfspr r13,SPRN_SPRG_CRIT_SCRATCH
|
|
|
+ ld r13,PACA_EXCRIT+EX_R13(r13)
|
|
|
rfci
|
|
|
|
|
|
/* Normal debug exception */
|
|
@@ -467,7 +480,7 @@ interrupt_end_book3e:
|
|
|
/* Now we mash up things to make it look like we are coming on a
|
|
|
* normal exception
|
|
|
*/
|
|
|
- mfspr r15,SPRN_SPRG_CRIT_SCRATCH
|
|
|
+ ld r15,PACA_EXCRIT+EX_R13(r13)
|
|
|
mtspr SPRN_SPRG_GEN_SCRATCH,r15
|
|
|
mfspr r14,SPRN_DBSR
|
|
|
EXCEPTION_COMMON(0xd00, PACA_EXCRIT, INTS_DISABLE)
|