|
@@ -1449,6 +1449,90 @@ masked_##_H##interrupt: \
|
|
b .; \
|
|
b .; \
|
|
MASKED_DEC_HANDLER(_H)
|
|
MASKED_DEC_HANDLER(_H)
|
|
|
|
|
|
|
|
+TRAMP_REAL_BEGIN(rfi_flush_fallback)
|
|
|
|
+ SET_SCRATCH0(r13);
|
|
|
|
+ GET_PACA(r13);
|
|
|
|
+ std r9,PACA_EXRFI+EX_R9(r13)
|
|
|
|
+ std r10,PACA_EXRFI+EX_R10(r13)
|
|
|
|
+ std r11,PACA_EXRFI+EX_R11(r13)
|
|
|
|
+ std r12,PACA_EXRFI+EX_R12(r13)
|
|
|
|
+ std r8,PACA_EXRFI+EX_R13(r13)
|
|
|
|
+ mfctr r9
|
|
|
|
+ ld r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
|
|
|
|
+ ld r11,PACA_L1D_FLUSH_SETS(r13)
|
|
|
|
+ ld r12,PACA_L1D_FLUSH_CONGRUENCE(r13)
|
|
|
|
+ /*
|
|
|
|
+ * The load adresses are at staggered offsets within cachelines,
|
|
|
|
+ * which suits some pipelines better (on others it should not
|
|
|
|
+ * hurt).
|
|
|
|
+ */
|
|
|
|
+ addi r12,r12,8
|
|
|
|
+ mtctr r11
|
|
|
|
+ DCBT_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
|
|
|
|
+
|
|
|
|
+ /* order ld/st prior to dcbt stop all streams with flushing */
|
|
|
|
+ sync
|
|
|
|
+1: li r8,0
|
|
|
|
+ .rept 8 /* 8-way set associative */
|
|
|
|
+ ldx r11,r10,r8
|
|
|
|
+ add r8,r8,r12
|
|
|
|
+ xor r11,r11,r11 // Ensure r11 is 0 even if fallback area is not
|
|
|
|
+ add r8,r8,r11 // Add 0, this creates a dependency on the ldx
|
|
|
|
+ .endr
|
|
|
|
+ addi r10,r10,128 /* 128 byte cache line */
|
|
|
|
+ bdnz 1b
|
|
|
|
+
|
|
|
|
+ mtctr r9
|
|
|
|
+ ld r9,PACA_EXRFI+EX_R9(r13)
|
|
|
|
+ ld r10,PACA_EXRFI+EX_R10(r13)
|
|
|
|
+ ld r11,PACA_EXRFI+EX_R11(r13)
|
|
|
|
+ ld r12,PACA_EXRFI+EX_R12(r13)
|
|
|
|
+ ld r8,PACA_EXRFI+EX_R13(r13)
|
|
|
|
+ GET_SCRATCH0(r13);
|
|
|
|
+ rfid
|
|
|
|
+
|
|
|
|
+TRAMP_REAL_BEGIN(hrfi_flush_fallback)
|
|
|
|
+ SET_SCRATCH0(r13);
|
|
|
|
+ GET_PACA(r13);
|
|
|
|
+ std r9,PACA_EXRFI+EX_R9(r13)
|
|
|
|
+ std r10,PACA_EXRFI+EX_R10(r13)
|
|
|
|
+ std r11,PACA_EXRFI+EX_R11(r13)
|
|
|
|
+ std r12,PACA_EXRFI+EX_R12(r13)
|
|
|
|
+ std r8,PACA_EXRFI+EX_R13(r13)
|
|
|
|
+ mfctr r9
|
|
|
|
+ ld r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
|
|
|
|
+ ld r11,PACA_L1D_FLUSH_SETS(r13)
|
|
|
|
+ ld r12,PACA_L1D_FLUSH_CONGRUENCE(r13)
|
|
|
|
+ /*
|
|
|
|
+ * The load adresses are at staggered offsets within cachelines,
|
|
|
|
+ * which suits some pipelines better (on others it should not
|
|
|
|
+ * hurt).
|
|
|
|
+ */
|
|
|
|
+ addi r12,r12,8
|
|
|
|
+ mtctr r11
|
|
|
|
+ DCBT_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
|
|
|
|
+
|
|
|
|
+ /* order ld/st prior to dcbt stop all streams with flushing */
|
|
|
|
+ sync
|
|
|
|
+1: li r8,0
|
|
|
|
+ .rept 8 /* 8-way set associative */
|
|
|
|
+ ldx r11,r10,r8
|
|
|
|
+ add r8,r8,r12
|
|
|
|
+ xor r11,r11,r11 // Ensure r11 is 0 even if fallback area is not
|
|
|
|
+ add r8,r8,r11 // Add 0, this creates a dependency on the ldx
|
|
|
|
+ .endr
|
|
|
|
+ addi r10,r10,128 /* 128 byte cache line */
|
|
|
|
+ bdnz 1b
|
|
|
|
+
|
|
|
|
+ mtctr r9
|
|
|
|
+ ld r9,PACA_EXRFI+EX_R9(r13)
|
|
|
|
+ ld r10,PACA_EXRFI+EX_R10(r13)
|
|
|
|
+ ld r11,PACA_EXRFI+EX_R11(r13)
|
|
|
|
+ ld r12,PACA_EXRFI+EX_R12(r13)
|
|
|
|
+ ld r8,PACA_EXRFI+EX_R13(r13)
|
|
|
|
+ GET_SCRATCH0(r13);
|
|
|
|
+ hrfid
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Real mode exceptions actually use this too, but alternate
|
|
* Real mode exceptions actually use this too, but alternate
|
|
* instruction code patches (which end up in the common .text area)
|
|
* instruction code patches (which end up in the common .text area)
|