aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2014-01-08 05:25:24 -0500
committerAlexander Graf <agraf@suse.de>2014-01-27 10:01:06 -0500
commit5557ae0ec77c2b4b5bbce2883c0603054ab66e68 (patch)
treef9b858e122722953e0b945772a6b2cd7035c981b /arch/powerpc/kvm
parentbd3048b80caace9cf0ae9ad22b2fbb8333b44a97 (diff)
KVM: PPC: Book3S HV: Implement architecture compatibility modes for POWER8
This allows us to select architecture 2.05 (POWER6) or 2.06 (POWER7) compatibility modes on a POWER8 processor. (Note that transactional memory is disabled for usermode if either or both of the PCR_TM_DIS and PCR_ARCH_206 bits are set.) Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/kvm')
-rw-r--r--arch/powerpc/kvm/book3s_hv.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 1bf681e8a05f..1e9f4b45432b 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -184,14 +184,28 @@ int kvmppc_set_arch_compat(struct kvm_vcpu *vcpu, u32 arch_compat)
184 184
185 switch (arch_compat) { 185 switch (arch_compat) {
186 case PVR_ARCH_205: 186 case PVR_ARCH_205:
187 pcr = PCR_ARCH_205; 187 /*
188 * If an arch bit is set in PCR, all the defined
189 * higher-order arch bits also have to be set.
190 */
191 pcr = PCR_ARCH_206 | PCR_ARCH_205;
188 break; 192 break;
189 case PVR_ARCH_206: 193 case PVR_ARCH_206:
190 case PVR_ARCH_206p: 194 case PVR_ARCH_206p:
195 pcr = PCR_ARCH_206;
196 break;
197 case PVR_ARCH_207:
191 break; 198 break;
192 default: 199 default:
193 return -EINVAL; 200 return -EINVAL;
194 } 201 }
202
203 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
204 /* POWER7 can't emulate POWER8 */
205 if (!(pcr & PCR_ARCH_206))
206 return -EINVAL;
207 pcr &= ~PCR_ARCH_206;
208 }
195 } 209 }
196 210
197 spin_lock(&vc->lock); 211 spin_lock(&vc->lock);