aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMihai Caraman <mihai.caraman@freescale.com>2012-10-11 02:13:27 -0400
committerAlexander Graf <agraf@suse.de>2012-12-05 19:34:19 -0500
commit38f988240c611f9d2595feb1b8ddcb80b0e97dec (patch)
tree76890955b85d7d2e5de119353225d55a4858af56
parent95e90b43c9c648bde607101e5a158941eec8e514 (diff)
KVM: PPC: bookehv: Add EPCR support in mtspr/mfspr emulation
Add EPCR support in booke mtspr/mfspr emulation. EPCR register is defined only for 64-bit and HV categories, we will expose it at this point only to 64-bit virtual processors running on 64-bit HV hosts. Define a reusable setter function for vcpu's EPCR. Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com> [agraf: move HV dependency in the code] Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r--arch/powerpc/kvm/booke.c12
-rw-r--r--arch/powerpc/kvm/booke.h1
-rw-r--r--arch/powerpc/kvm/booke_emulate.c14
3 files changed, 26 insertions, 1 deletions
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 9457fb1b41c9..037d045db3f1 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -1473,6 +1473,18 @@ void kvmppc_core_flush_memslot(struct kvm *kvm, struct kvm_memory_slot *memslot)
1473{ 1473{
1474} 1474}
1475 1475
1476void kvmppc_set_epcr(struct kvm_vcpu *vcpu, u32 new_epcr)
1477{
1478#if defined(CONFIG_64BIT)
1479 vcpu->arch.epcr = new_epcr;
1480#ifdef CONFIG_KVM_BOOKE_HV
1481 vcpu->arch.shadow_epcr &= ~SPRN_EPCR_GICM;
1482 if (vcpu->arch.epcr & SPRN_EPCR_ICM)
1483 vcpu->arch.shadow_epcr |= SPRN_EPCR_GICM;
1484#endif
1485#endif
1486}
1487
1476void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr) 1488void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr)
1477{ 1489{
1478 vcpu->arch.tcr = new_tcr; 1490 vcpu->arch.tcr = new_tcr;
diff --git a/arch/powerpc/kvm/booke.h b/arch/powerpc/kvm/booke.h
index ba61974c1e20..e9b88e433f64 100644
--- a/arch/powerpc/kvm/booke.h
+++ b/arch/powerpc/kvm/booke.h
@@ -69,6 +69,7 @@ extern unsigned long kvmppc_booke_handlers;
69void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr); 69void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr);
70void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr); 70void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr);
71 71
72void kvmppc_set_epcr(struct kvm_vcpu *vcpu, u32 new_epcr);
72void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr); 73void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr);
73void kvmppc_set_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits); 74void kvmppc_set_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits);
74void kvmppc_clr_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits); 75void kvmppc_clr_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits);
diff --git a/arch/powerpc/kvm/booke_emulate.c b/arch/powerpc/kvm/booke_emulate.c
index 514790f41aba..4685b8cf2249 100644
--- a/arch/powerpc/kvm/booke_emulate.c
+++ b/arch/powerpc/kvm/booke_emulate.c
@@ -240,7 +240,14 @@ int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
240 case SPRN_MCSR: 240 case SPRN_MCSR:
241 vcpu->arch.mcsr &= ~spr_val; 241 vcpu->arch.mcsr &= ~spr_val;
242 break; 242 break;
243 243#if defined(CONFIG_64BIT)
244 case SPRN_EPCR:
245 kvmppc_set_epcr(vcpu, spr_val);
246#ifdef CONFIG_KVM_BOOKE_HV
247 mtspr(SPRN_EPCR, vcpu->arch.shadow_epcr);
248#endif
249 break;
250#endif
244 default: 251 default:
245 emulated = EMULATE_FAIL; 252 emulated = EMULATE_FAIL;
246 } 253 }
@@ -335,6 +342,11 @@ int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
335 case SPRN_MCSR: 342 case SPRN_MCSR:
336 *spr_val = vcpu->arch.mcsr; 343 *spr_val = vcpu->arch.mcsr;
337 break; 344 break;
345#if defined(CONFIG_64BIT)
346 case SPRN_EPCR:
347 *spr_val = vcpu->arch.epcr;
348 break;
349#endif
338 350
339 default: 351 default:
340 emulated = EMULATE_FAIL; 352 emulated = EMULATE_FAIL;