aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s_hv_ras.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kvm/book3s_hv_ras.c')
-rw-r--r--arch/powerpc/kvm/book3s_hv_ras.c18
1 files changed, 4 insertions, 14 deletions
diff --git a/arch/powerpc/kvm/book3s_hv_ras.c b/arch/powerpc/kvm/book3s_hv_ras.c
index a353c485808c..5c427b41a2f5 100644
--- a/arch/powerpc/kvm/book3s_hv_ras.c
+++ b/arch/powerpc/kvm/book3s_hv_ras.c
@@ -58,18 +58,6 @@ static void reload_slb(struct kvm_vcpu *vcpu)
58 } 58 }
59} 59}
60 60
61/* POWER7 TLB flush */
62static void flush_tlb_power7(struct kvm_vcpu *vcpu)
63{
64 unsigned long i, rb;
65
66 rb = TLBIEL_INVAL_SET_LPID;
67 for (i = 0; i < POWER7_TLB_SETS; ++i) {
68 asm volatile("tlbiel %0" : : "r" (rb));
69 rb += 1 << TLBIEL_INVAL_SET_SHIFT;
70 }
71}
72
73/* 61/*
74 * On POWER7, see if we can handle a machine check that occurred inside 62 * On POWER7, see if we can handle a machine check that occurred inside
75 * the guest in real mode, without switching to the host partition. 63 * the guest in real mode, without switching to the host partition.
@@ -96,7 +84,8 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)
96 DSISR_MC_SLB_PARITY | DSISR_MC_DERAT_MULTI); 84 DSISR_MC_SLB_PARITY | DSISR_MC_DERAT_MULTI);
97 } 85 }
98 if (dsisr & DSISR_MC_TLB_MULTI) { 86 if (dsisr & DSISR_MC_TLB_MULTI) {
99 flush_tlb_power7(vcpu); 87 if (cur_cpu_spec && cur_cpu_spec->flush_tlb)
88 cur_cpu_spec->flush_tlb(TLBIEL_INVAL_SET_LPID);
100 dsisr &= ~DSISR_MC_TLB_MULTI; 89 dsisr &= ~DSISR_MC_TLB_MULTI;
101 } 90 }
102 /* Any other errors we don't understand? */ 91 /* Any other errors we don't understand? */
@@ -113,7 +102,8 @@ static long kvmppc_realmode_mc_power7(struct kvm_vcpu *vcpu)
113 reload_slb(vcpu); 102 reload_slb(vcpu);
114 break; 103 break;
115 case SRR1_MC_IFETCH_TLBMULTI: 104 case SRR1_MC_IFETCH_TLBMULTI:
116 flush_tlb_power7(vcpu); 105 if (cur_cpu_spec && cur_cpu_spec->flush_tlb)
106 cur_cpu_spec->flush_tlb(TLBIEL_INVAL_SET_LPID);
117 break; 107 break;
118 default: 108 default:
119 handled = 0; 109 handled = 0;