diff options
author | Nicholas Piggin <npiggin@gmail.com> | 2016-08-10 06:48:43 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2016-08-21 21:09:33 -0400 |
commit | a74599a5041979ae83aec7a6d5c8df9131db2ce6 (patch) | |
tree | b6fd23af69287eb9f0f73387169cf7b9a5ae93f9 | |
parent | 3f3b5dc14c25254d3fe98115c71b2a1f3ed97798 (diff) |
powerpc/pseries: PACA save area fix for MCE vs MCE
MCE must not enable MSR_RI until PACA_EXMC is no longer being used.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 034b7eaf68d2..bffec73dbffc 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -485,7 +485,23 @@ machine_check_fwnmi: | |||
485 | EXCEPTION_PROLOG_0(PACA_EXMC) | 485 | EXCEPTION_PROLOG_0(PACA_EXMC) |
486 | machine_check_pSeries_0: | 486 | machine_check_pSeries_0: |
487 | EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200) | 487 | EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200) |
488 | EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD) | 488 | /* |
489 | * The following is essentially EXCEPTION_PROLOG_PSERIES_1 with the | ||
490 | * difference that MSR_RI is not enabled, because PACA_EXMC is being | ||
491 | * used, so nested machine check corrupts it. machine_check_common | ||
492 | * enables MSR_RI. | ||
493 | */ | ||
494 | ld r12,PACAKBASE(r13) | ||
495 | ld r10,PACAKMSR(r13) | ||
496 | xori r10,r10,MSR_RI | ||
497 | mfspr r11,SPRN_SRR0 | ||
498 | LOAD_HANDLER(r12, machine_check_common) | ||
499 | mtspr SPRN_SRR0,r12 | ||
500 | mfspr r12,SPRN_SRR1 | ||
501 | mtspr SPRN_SRR1,r10 | ||
502 | rfid | ||
503 | b . /* prevent speculative execution */ | ||
504 | |||
489 | KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200) | 505 | KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200) |
490 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300) | 506 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300) |
491 | KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380) | 507 | KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380) |
@@ -977,6 +993,9 @@ machine_check_common: | |||
977 | RECONCILE_IRQ_STATE(r10, r11) | 993 | RECONCILE_IRQ_STATE(r10, r11) |
978 | ld r3,PACA_EXMC+EX_DAR(r13) | 994 | ld r3,PACA_EXMC+EX_DAR(r13) |
979 | lwz r4,PACA_EXMC+EX_DSISR(r13) | 995 | lwz r4,PACA_EXMC+EX_DSISR(r13) |
996 | /* Enable MSR_RI when finished with PACA_EXMC */ | ||
997 | li r10,MSR_RI | ||
998 | mtmsrd r10,1 | ||
980 | std r3,_DAR(r1) | 999 | std r3,_DAR(r1) |
981 | std r4,_DSISR(r1) | 1000 | std r4,_DSISR(r1) |
982 | bl save_nvgprs | 1001 | bl save_nvgprs |