aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Guo <wei.guo.simon@gmail.com>2018-06-08 01:40:03 -0400
committerPaul Mackerras <paulus@ozlabs.org>2018-06-12 19:46:13 -0400
commitf61e0d3cc4aee194014074471658a5a037e311ce (patch)
tree8190e115a148df9b22b0795460d368fb2c70e6c6
parentdb96a04a86c73817b4584aa4fa2a3f60a9aa3c52 (diff)
KVM: PPC: Book3S PR: Fix failure status setting in tabort. emulation
tabort. will perform transaction failure recording and the recording depends on TEXASR FS bit. Currently the TEXASR FS bit is retrieved after tabort., when the TEXASR FS bit is already been updated by tabort. itself. This patch corrects this behavior by retrieving TEXASR val before tabort. tabort. will not immediately leads to transaction failure handling in suspend state. So this patch also remove the mtspr on TEXASR/TFIAR registers to avoid TM bad thing exception. Fixes: 26798f88d58d ("KVM: PPC: Book3S PR: Add emulation for tabort. in privileged state") Signed-off-by: Simon Guo <wei.guo.simon@gmail.com> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
-rw-r--r--arch/powerpc/kvm/book3s_emulate.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
index 05cac5ea79c5..36b11c5a0dbb 100644
--- a/arch/powerpc/kvm/book3s_emulate.c
+++ b/arch/powerpc/kvm/book3s_emulate.c
@@ -212,9 +212,11 @@ void kvmppc_emulate_tabort(struct kvm_vcpu *vcpu, int ra_val)
212 * present. 212 * present.
213 */ 213 */
214 unsigned long guest_msr = kvmppc_get_msr(vcpu); 214 unsigned long guest_msr = kvmppc_get_msr(vcpu);
215 uint64_t org_texasr;
215 216
216 preempt_disable(); 217 preempt_disable();
217 tm_enable(); 218 tm_enable();
219 org_texasr = mfspr(SPRN_TEXASR);
218 tm_abort(ra_val); 220 tm_abort(ra_val);
219 221
220 /* CR0 = 0 | MSR[TS] | 0 */ 222 /* CR0 = 0 | MSR[TS] | 0 */
@@ -227,7 +229,7 @@ void kvmppc_emulate_tabort(struct kvm_vcpu *vcpu, int ra_val)
227 * and tabort will be treated as nops in non-transactional 229 * and tabort will be treated as nops in non-transactional
228 * state. 230 * state.
229 */ 231 */
230 if (!(vcpu->arch.texasr & TEXASR_FS) && 232 if (!(org_texasr & TEXASR_FS) &&
231 MSR_TM_ACTIVE(guest_msr)) { 233 MSR_TM_ACTIVE(guest_msr)) {
232 vcpu->arch.texasr &= ~(TEXASR_PR | TEXASR_HV); 234 vcpu->arch.texasr &= ~(TEXASR_PR | TEXASR_HV);
233 if (guest_msr & MSR_PR) 235 if (guest_msr & MSR_PR)
@@ -237,8 +239,6 @@ void kvmppc_emulate_tabort(struct kvm_vcpu *vcpu, int ra_val)
237 vcpu->arch.texasr |= TEXASR_HV; 239 vcpu->arch.texasr |= TEXASR_HV;
238 240
239 vcpu->arch.tfiar = kvmppc_get_pc(vcpu); 241 vcpu->arch.tfiar = kvmppc_get_pc(vcpu);
240 mtspr(SPRN_TEXASR, vcpu->arch.texasr);
241 mtspr(SPRN_TFIAR, vcpu->arch.tfiar);
242 } 242 }
243 tm_disable(); 243 tm_disable();
244 preempt_enable(); 244 preempt_enable();