[PATCH] ppc64: Turn runlatch on in exception entry
Enable the runlatch at the start of each exception. Unfortunately we are out of space in the 0x300 handler, so I added it a bit later. The SPR write is fairly expensive, perhaps we should cache the runlatch state in the paca and avoid the write when possible. We don't need to turn the runlatch off, we do that in the idle loop. Better to take the hit in the idle loop than for each exception exit. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
a2f7a9ce2a
commit
8dc4fd87f2
|
@ -308,6 +308,7 @@ exception_marker:
|
|||
label##_pSeries: \
|
||||
HMT_MEDIUM; \
|
||||
mtspr SPRG1,r13; /* save r13 */ \
|
||||
RUNLATCH_ON(r13); \
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common)
|
||||
|
||||
#define STD_EXCEPTION_ISERIES(n, label, area) \
|
||||
|
@ -315,6 +316,7 @@ label##_pSeries: \
|
|||
label##_iSeries: \
|
||||
HMT_MEDIUM; \
|
||||
mtspr SPRG1,r13; /* save r13 */ \
|
||||
RUNLATCH_ON(r13); \
|
||||
EXCEPTION_PROLOG_ISERIES_1(area); \
|
||||
EXCEPTION_PROLOG_ISERIES_2; \
|
||||
b label##_common
|
||||
|
@ -324,6 +326,7 @@ label##_iSeries: \
|
|||
label##_iSeries: \
|
||||
HMT_MEDIUM; \
|
||||
mtspr SPRG1,r13; /* save r13 */ \
|
||||
RUNLATCH_ON(r13); \
|
||||
EXCEPTION_PROLOG_ISERIES_1(PACA_EXGEN); \
|
||||
lbz r10,PACAPROCENABLED(r13); \
|
||||
cmpwi 0,r10,0; \
|
||||
|
@ -393,6 +396,7 @@ __start_interrupts:
|
|||
_machine_check_pSeries:
|
||||
HMT_MEDIUM
|
||||
mtspr SPRG1,r13 /* save r13 */
|
||||
RUNLATCH_ON(r13)
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common)
|
||||
|
||||
. = 0x300
|
||||
|
@ -419,6 +423,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
|
|||
data_access_slb_pSeries:
|
||||
HMT_MEDIUM
|
||||
mtspr SPRG1,r13
|
||||
RUNLATCH_ON(r13)
|
||||
mfspr r13,SPRG3 /* get paca address into r13 */
|
||||
std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */
|
||||
std r10,PACA_EXSLB+EX_R10(r13)
|
||||
|
@ -439,6 +444,7 @@ data_access_slb_pSeries:
|
|||
instruction_access_slb_pSeries:
|
||||
HMT_MEDIUM
|
||||
mtspr SPRG1,r13
|
||||
RUNLATCH_ON(r13)
|
||||
mfspr r13,SPRG3 /* get paca address into r13 */
|
||||
std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */
|
||||
std r10,PACA_EXSLB+EX_R10(r13)
|
||||
|
@ -464,6 +470,7 @@ instruction_access_slb_pSeries:
|
|||
.globl system_call_pSeries
|
||||
system_call_pSeries:
|
||||
HMT_MEDIUM
|
||||
RUNLATCH_ON(r9)
|
||||
mr r9,r13
|
||||
mfmsr r10
|
||||
mfspr r13,SPRG3
|
||||
|
@ -707,11 +714,13 @@ fwnmi_data_area:
|
|||
system_reset_fwnmi:
|
||||
HMT_MEDIUM
|
||||
mtspr SPRG1,r13 /* save r13 */
|
||||
RUNLATCH_ON(r13)
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common)
|
||||
.globl machine_check_fwnmi
|
||||
machine_check_fwnmi:
|
||||
HMT_MEDIUM
|
||||
mtspr SPRG1,r13 /* save r13 */
|
||||
RUNLATCH_ON(r13)
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common)
|
||||
|
||||
/*
|
||||
|
@ -848,6 +857,7 @@ unrecov_fer:
|
|||
.align 7
|
||||
.globl data_access_common
|
||||
data_access_common:
|
||||
RUNLATCH_ON(r10) /* It wont fit in the 0x300 handler */
|
||||
mfspr r10,DAR
|
||||
std r10,PACA_EXGEN+EX_DAR(r13)
|
||||
mfspr r10,DSISR
|
||||
|
|
|
@ -524,6 +524,15 @@ static inline void ppc64_runlatch_off(void)
|
|||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define RUNLATCH_ON(REG) \
|
||||
BEGIN_FTR_SECTION \
|
||||
mfspr (REG),SPRN_CTRLF; \
|
||||
ori (REG),(REG),CTRL_RUNLATCH; \
|
||||
mtspr SPRN_CTRLT,(REG); \
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Number of entries in the SLB. If this ever changes we should handle
|
||||
* it with a use a cpu feature fixup.
|
||||
|
|
Loading…
Reference in a new issue