diff options
| -rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 36 |
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 | ||
| 583 | TRAMP_REAL_BEGIN(tramp_real_data_access) | 583 | TRAMP_REAL_BEGIN(tramp_real_data_access) |
| 584 | EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, 0x300) | 584 | EXCEPTION_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) | ||
| 585 | EXCEPTION_PROLOG_2(data_access_common, EXC_STD) | 594 | EXCEPTION_PROLOG_2(data_access_common, EXC_STD) |
| 586 | 595 | ||
| 587 | EXC_VIRT_BEGIN(data_access, 0x4300, 0x80) | 596 | EXC_VIRT_BEGIN(data_access, 0x4300, 0x80) |
| 588 | SET_SCRATCH0(r13) /* save r13 */ | 597 | SET_SCRATCH0(r13) /* save r13 */ |
| 589 | EXCEPTION_PROLOG_0(PACA_EXGEN) | 598 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
| 590 | EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0x300) | 599 | EXCEPTION_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) | ||
| 591 | EXCEPTION_PROLOG_2_RELON(data_access_common, EXC_STD) | 604 | EXCEPTION_PROLOG_2_RELON(data_access_common, EXC_STD) |
| 592 | EXC_VIRT_END(data_access, 0x4300, 0x80) | 605 | EXC_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 | ||
| 627 | TRAMP_REAL_BEGIN(tramp_real_data_access_slb) | 637 | TRAMP_REAL_BEGIN(tramp_real_data_access_slb) |
| 628 | EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x380) | 638 | EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x380) |
| 639 | mfspr r10,SPRN_DAR | ||
| 640 | std r10,PACA_EXSLB+EX_DAR(r13) | ||
| 629 | EXCEPTION_PROLOG_2(data_access_slb_common, EXC_STD) | 641 | EXCEPTION_PROLOG_2(data_access_slb_common, EXC_STD) |
| 630 | 642 | ||
| 631 | EXC_VIRT_BEGIN(data_access_slb, 0x4380, 0x80) | 643 | EXC_VIRT_BEGIN(data_access_slb, 0x4380, 0x80) |
| 632 | SET_SCRATCH0(r13) /* save r13 */ | 644 | SET_SCRATCH0(r13) /* save r13 */ |
| 633 | EXCEPTION_PROLOG_0(PACA_EXSLB) | 645 | EXCEPTION_PROLOG_0(PACA_EXSLB) |
| 634 | EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380) | 646 | EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380) |
| 647 | mfspr r10,SPRN_DAR | ||
| 648 | std r10,PACA_EXSLB+EX_DAR(r13) | ||
| 635 | EXCEPTION_PROLOG_2_RELON(data_access_slb_common, EXC_STD) | 649 | EXCEPTION_PROLOG_2_RELON(data_access_slb_common, EXC_STD) |
| 636 | EXC_VIRT_END(data_access_slb, 0x4380, 0x80) | 650 | EXC_VIRT_END(data_access_slb, 0x4380, 0x80) |
| 637 | 651 | ||
| 638 | TRAMP_KVM_SKIP(PACA_EXSLB, 0x380) | 652 | TRAMP_KVM_SKIP(PACA_EXSLB, 0x380) |
| 639 | 653 | ||
| 640 | EXC_COMMON_BEGIN(data_access_slb_common) | 654 | EXC_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) | |||
| 739 | SET_SCRATCH0(r13) /* save r13 */ | 751 | SET_SCRATCH0(r13) /* save r13 */ |
| 740 | EXCEPTION_PROLOG_0(PACA_EXGEN) | 752 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
| 741 | EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, 0x600) | 753 | EXCEPTION_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) | ||
| 742 | EXCEPTION_PROLOG_2(alignment_common, EXC_STD) | 758 | EXCEPTION_PROLOG_2(alignment_common, EXC_STD) |
| 743 | EXC_REAL_END(alignment, 0x600, 0x100) | 759 | EXC_REAL_END(alignment, 0x600, 0x100) |
| 744 | 760 | ||
| @@ -746,15 +762,15 @@ EXC_VIRT_BEGIN(alignment, 0x4600, 0x100) | |||
| 746 | SET_SCRATCH0(r13) /* save r13 */ | 762 | SET_SCRATCH0(r13) /* save r13 */ |
| 747 | EXCEPTION_PROLOG_0(PACA_EXGEN) | 763 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
| 748 | EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0x600) | 764 | EXCEPTION_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) | ||
| 749 | EXCEPTION_PROLOG_2_RELON(alignment_common, EXC_STD) | 769 | EXCEPTION_PROLOG_2_RELON(alignment_common, EXC_STD) |
| 750 | EXC_VIRT_END(alignment, 0x4600, 0x100) | 770 | EXC_VIRT_END(alignment, 0x4600, 0x100) |
| 751 | 771 | ||
| 752 | TRAMP_KVM(PACA_EXGEN, 0x600) | 772 | TRAMP_KVM(PACA_EXGEN, 0x600) |
| 753 | EXC_COMMON_BEGIN(alignment_common) | 773 | EXC_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) |
