aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s_hv.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kvm/book3s_hv.c')
-rw-r--r--arch/powerpc/kvm/book3s_hv.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 2a0e38feec1d..e42fb5448608 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -166,6 +166,35 @@ void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr)
166 vcpu->arch.pvr = pvr; 166 vcpu->arch.pvr = pvr;
167} 167}
168 168
169int kvmppc_set_arch_compat(struct kvm_vcpu *vcpu, u32 arch_compat)
170{
171 unsigned long pcr = 0;
172 struct kvmppc_vcore *vc = vcpu->arch.vcore;
173
174 if (arch_compat) {
175 if (!cpu_has_feature(CPU_FTR_ARCH_206))
176 return -EINVAL; /* 970 has no compat mode support */
177
178 switch (arch_compat) {
179 case PVR_ARCH_205:
180 pcr = PCR_ARCH_205;
181 break;
182 case PVR_ARCH_206:
183 case PVR_ARCH_206p:
184 break;
185 default:
186 return -EINVAL;
187 }
188 }
189
190 spin_lock(&vc->lock);
191 vc->arch_compat = arch_compat;
192 vc->pcr = pcr;
193 spin_unlock(&vc->lock);
194
195 return 0;
196}
197
169void kvmppc_dump_regs(struct kvm_vcpu *vcpu) 198void kvmppc_dump_regs(struct kvm_vcpu *vcpu)
170{ 199{
171 int r; 200 int r;
@@ -826,6 +855,9 @@ int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id, union kvmppc_one_reg *val)
826 case KVM_REG_PPC_PPR: 855 case KVM_REG_PPC_PPR:
827 *val = get_reg_val(id, vcpu->arch.ppr); 856 *val = get_reg_val(id, vcpu->arch.ppr);
828 break; 857 break;
858 case KVM_REG_PPC_ARCH_COMPAT:
859 *val = get_reg_val(id, vcpu->arch.vcore->arch_compat);
860 break;
829 default: 861 default:
830 r = -EINVAL; 862 r = -EINVAL;
831 break; 863 break;
@@ -936,6 +968,9 @@ int kvmppc_set_one_reg(struct kvm_vcpu *vcpu, u64 id, union kvmppc_one_reg *val)
936 case KVM_REG_PPC_PPR: 968 case KVM_REG_PPC_PPR:
937 vcpu->arch.ppr = set_reg_val(id, *val); 969 vcpu->arch.ppr = set_reg_val(id, *val);
938 break; 970 break;
971 case KVM_REG_PPC_ARCH_COMPAT:
972 r = kvmppc_set_arch_compat(vcpu, set_reg_val(id, *val));
973 break;
939 default: 974 default:
940 r = -EINVAL; 975 r = -EINVAL;
941 break; 976 break;