KVM: PPC: bookehv: Add EPCR support in mtspr/mfspr emulation
authorMihai Caraman <mihai.caraman@freescale.com>
Thu, 11 Oct 2012 06:13:27 +0000 (06:13 +0000)
committerAlexander Graf <agraf@suse.de>
Thu, 6 Dec 2012 00:34:19 +0000 (01:34 +0100)
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>
arch/powerpc/kvm/booke.c
arch/powerpc/kvm/booke.h
arch/powerpc/kvm/booke_emulate.c

index 9457fb1b41c9c799f2e2aac8511a3025370d1cf0..037d045db3f1af6fe86eedc11f89d984094b1525 100644 (file)
@@ -1473,6 +1473,18 @@ void kvmppc_core_flush_memslot(struct kvm *kvm, struct kvm_memory_slot *memslot)
 {
 }
 
+void kvmppc_set_epcr(struct kvm_vcpu *vcpu, u32 new_epcr)
+{
+#if defined(CONFIG_64BIT)
+       vcpu->arch.epcr = new_epcr;
+#ifdef CONFIG_KVM_BOOKE_HV
+       vcpu->arch.shadow_epcr &= ~SPRN_EPCR_GICM;
+       if (vcpu->arch.epcr  & SPRN_EPCR_ICM)
+               vcpu->arch.shadow_epcr |= SPRN_EPCR_GICM;
+#endif
+#endif
+}
+
 void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr)
 {
        vcpu->arch.tcr = new_tcr;
index ba61974c1e20839f454ebb9e33cc8f46e4949d9e..e9b88e433f64a3d835d8b8970ab6ff6a6d0ebf56 100644 (file)
@@ -69,6 +69,7 @@ extern unsigned long kvmppc_booke_handlers;
 void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr);
 void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr);
 
+void kvmppc_set_epcr(struct kvm_vcpu *vcpu, u32 new_epcr);
 void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr);
 void kvmppc_set_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits);
 void kvmppc_clr_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits);
index 514790f41abafa9c752ebdaa90bde9f1e961423f..4685b8cf224959a29d1c6e774109e31f47f5c2e6 100644 (file)
@@ -240,7 +240,14 @@ int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
        case SPRN_MCSR:
                vcpu->arch.mcsr &= ~spr_val;
                break;
-
+#if defined(CONFIG_64BIT)
+       case SPRN_EPCR:
+               kvmppc_set_epcr(vcpu, spr_val);
+#ifdef CONFIG_KVM_BOOKE_HV
+               mtspr(SPRN_EPCR, vcpu->arch.shadow_epcr);
+#endif
+               break;
+#endif
        default:
                emulated = EMULATE_FAIL;
        }
@@ -335,6 +342,11 @@ int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
        case SPRN_MCSR:
                *spr_val = vcpu->arch.mcsr;
                break;
+#if defined(CONFIG_64BIT)
+       case SPRN_EPCR:
+               *spr_val = vcpu->arch.epcr;
+               break;
+#endif
 
        default:
                emulated = EMULATE_FAIL;