diff options
author | Mihai Caraman <mihai.caraman@freescale.com> | 2012-10-11 02:13:27 -0400 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2012-12-05 19:34:19 -0500 |
commit | 38f988240c611f9d2595feb1b8ddcb80b0e97dec (patch) | |
tree | 76890955b85d7d2e5de119353225d55a4858af56 | |
parent | 95e90b43c9c648bde607101e5a158941eec8e514 (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.c | 12 | ||||
-rw-r--r-- | arch/powerpc/kvm/booke.h | 1 | ||||
-rw-r--r-- | arch/powerpc/kvm/booke_emulate.c | 14 |
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 | ||
1476 | void 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 | |||
1476 | void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr) | 1488 | void 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; | |||
69 | void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr); | 69 | void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr); |
70 | void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr); | 70 | void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr); |
71 | 71 | ||
72 | void kvmppc_set_epcr(struct kvm_vcpu *vcpu, u32 new_epcr); | ||
72 | void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr); | 73 | void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr); |
73 | void kvmppc_set_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits); | 74 | void kvmppc_set_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits); |
74 | void kvmppc_clr_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits); | 75 | void 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; |