aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S36
1 files changed, 26 insertions, 10 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 680197df4aea..99312328ee66 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -582,12 +582,25 @@ EXC_REAL_END(data_access, 0x300, 0x80)
582 582
583TRAMP_REAL_BEGIN(tramp_real_data_access) 583TRAMP_REAL_BEGIN(tramp_real_data_access)
584EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, 0x300) 584EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, 0x300)
585 /*
586 * DAR/DSISR must be read before setting MSR[RI], because
587 * a d-side MCE will clobber those registers so is not
588 * recoverable if they are live.
589 */
590 mfspr r10,SPRN_DAR
591 mfspr r11,SPRN_DSISR
592 std r10,PACA_EXGEN+EX_DAR(r13)
593 stw r11,PACA_EXGEN+EX_DSISR(r13)
585EXCEPTION_PROLOG_2(data_access_common, EXC_STD) 594EXCEPTION_PROLOG_2(data_access_common, EXC_STD)
586 595
587EXC_VIRT_BEGIN(data_access, 0x4300, 0x80) 596EXC_VIRT_BEGIN(data_access, 0x4300, 0x80)
588SET_SCRATCH0(r13) /* save r13 */ 597SET_SCRATCH0(r13) /* save r13 */
589EXCEPTION_PROLOG_0(PACA_EXGEN) 598EXCEPTION_PROLOG_0(PACA_EXGEN)
590EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0x300) 599EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0x300)
600 mfspr r10,SPRN_DAR
601 mfspr r11,SPRN_DSISR
602 std r10,PACA_EXGEN+EX_DAR(r13)
603 stw r11,PACA_EXGEN+EX_DSISR(r13)
591EXCEPTION_PROLOG_2_RELON(data_access_common, EXC_STD) 604EXCEPTION_PROLOG_2_RELON(data_access_common, EXC_STD)
592EXC_VIRT_END(data_access, 0x4300, 0x80) 605EXC_VIRT_END(data_access, 0x4300, 0x80)
593 606
@@ -598,11 +611,8 @@ EXC_COMMON_BEGIN(data_access_common)
598 * Here r13 points to the paca, r9 contains the saved CR, 611 * Here r13 points to the paca, r9 contains the saved CR,
599 * SRR0 and SRR1 are saved in r11 and r12, 612 * SRR0 and SRR1 are saved in r11 and r12,
600 * r9 - r13 are saved in paca->exgen. 613 * r9 - r13 are saved in paca->exgen.
614 * EX_DAR and EX_DSISR have saved DAR/DSISR
601 */ 615 */
602 mfspr r10,SPRN_DAR
603 std r10,PACA_EXGEN+EX_DAR(r13)
604 mfspr r10,SPRN_DSISR
605 stw r10,PACA_EXGEN+EX_DSISR(r13)
606 EXCEPTION_PROLOG_COMMON(0x300, PACA_EXGEN) 616 EXCEPTION_PROLOG_COMMON(0x300, PACA_EXGEN)
607 RECONCILE_IRQ_STATE(r10, r11) 617 RECONCILE_IRQ_STATE(r10, r11)
608 ld r12,_MSR(r1) 618 ld r12,_MSR(r1)
@@ -626,20 +636,22 @@ EXC_REAL_END(data_access_slb, 0x380, 0x80)
626 636
627TRAMP_REAL_BEGIN(tramp_real_data_access_slb) 637TRAMP_REAL_BEGIN(tramp_real_data_access_slb)
628EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x380) 638EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x380)
639 mfspr r10,SPRN_DAR
640 std r10,PACA_EXSLB+EX_DAR(r13)
629EXCEPTION_PROLOG_2(data_access_slb_common, EXC_STD) 641EXCEPTION_PROLOG_2(data_access_slb_common, EXC_STD)
630 642
631EXC_VIRT_BEGIN(data_access_slb, 0x4380, 0x80) 643EXC_VIRT_BEGIN(data_access_slb, 0x4380, 0x80)
632SET_SCRATCH0(r13) /* save r13 */ 644SET_SCRATCH0(r13) /* save r13 */
633EXCEPTION_PROLOG_0(PACA_EXSLB) 645EXCEPTION_PROLOG_0(PACA_EXSLB)
634EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380) 646EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380)
647 mfspr r10,SPRN_DAR
648 std r10,PACA_EXSLB+EX_DAR(r13)
635EXCEPTION_PROLOG_2_RELON(data_access_slb_common, EXC_STD) 649EXCEPTION_PROLOG_2_RELON(data_access_slb_common, EXC_STD)
636EXC_VIRT_END(data_access_slb, 0x4380, 0x80) 650EXC_VIRT_END(data_access_slb, 0x4380, 0x80)
637 651
638TRAMP_KVM_SKIP(PACA_EXSLB, 0x380) 652TRAMP_KVM_SKIP(PACA_EXSLB, 0x380)
639 653
640EXC_COMMON_BEGIN(data_access_slb_common) 654EXC_COMMON_BEGIN(data_access_slb_common)
641 mfspr r10,SPRN_DAR
642 std r10,PACA_EXSLB+EX_DAR(r13)
643 EXCEPTION_PROLOG_COMMON(0x380, PACA_EXSLB) 655 EXCEPTION_PROLOG_COMMON(0x380, PACA_EXSLB)
644 ld r4,PACA_EXSLB+EX_DAR(r13) 656 ld r4,PACA_EXSLB+EX_DAR(r13)
645 std r4,_DAR(r1) 657 std r4,_DAR(r1)
@@ -739,6 +751,10 @@ EXC_REAL_BEGIN(alignment, 0x600, 0x100)
739SET_SCRATCH0(r13) /* save r13 */ 751SET_SCRATCH0(r13) /* save r13 */
740EXCEPTION_PROLOG_0(PACA_EXGEN) 752EXCEPTION_PROLOG_0(PACA_EXGEN)
741EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, 0x600) 753EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, 0x600)
754 mfspr r10,SPRN_DAR
755 mfspr r11,SPRN_DSISR
756 std r10,PACA_EXGEN+EX_DAR(r13)
757 stw r11,PACA_EXGEN+EX_DSISR(r13)
742EXCEPTION_PROLOG_2(alignment_common, EXC_STD) 758EXCEPTION_PROLOG_2(alignment_common, EXC_STD)
743EXC_REAL_END(alignment, 0x600, 0x100) 759EXC_REAL_END(alignment, 0x600, 0x100)
744 760
@@ -746,15 +762,15 @@ EXC_VIRT_BEGIN(alignment, 0x4600, 0x100)
746SET_SCRATCH0(r13) /* save r13 */ 762SET_SCRATCH0(r13) /* save r13 */
747EXCEPTION_PROLOG_0(PACA_EXGEN) 763EXCEPTION_PROLOG_0(PACA_EXGEN)
748EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0x600) 764EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0x600)
765 mfspr r10,SPRN_DAR
766 mfspr r11,SPRN_DSISR
767 std r10,PACA_EXGEN+EX_DAR(r13)
768 stw r11,PACA_EXGEN+EX_DSISR(r13)
749EXCEPTION_PROLOG_2_RELON(alignment_common, EXC_STD) 769EXCEPTION_PROLOG_2_RELON(alignment_common, EXC_STD)
750EXC_VIRT_END(alignment, 0x4600, 0x100) 770EXC_VIRT_END(alignment, 0x4600, 0x100)
751 771
752TRAMP_KVM(PACA_EXGEN, 0x600) 772TRAMP_KVM(PACA_EXGEN, 0x600)
753EXC_COMMON_BEGIN(alignment_common) 773EXC_COMMON_BEGIN(alignment_common)
754 mfspr r10,SPRN_DAR
755 std r10,PACA_EXGEN+EX_DAR(r13)
756 mfspr r10,SPRN_DSISR
757 stw r10,PACA_EXGEN+EX_DSISR(r13)
758 EXCEPTION_PROLOG_COMMON(0x600, PACA_EXGEN) 774 EXCEPTION_PROLOG_COMMON(0x600, PACA_EXGEN)
759 ld r3,PACA_EXGEN+EX_DAR(r13) 775 ld r3,PACA_EXGEN+EX_DAR(r13)
760 lwz r4,PACA_EXGEN+EX_DSISR(r13) 776 lwz r4,PACA_EXGEN+EX_DSISR(r13)