aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/virtual/kvm/api.txt3
-rw-r--r--arch/powerpc/include/uapi/asm/kvm.h1
-rw-r--r--arch/powerpc/kvm/book3s_hv.c13
-rw-r--r--arch/powerpc/kvm/book3s_pr.c2
4 files changed, 16 insertions, 3 deletions
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 69553183ef0f..884f819e1908 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -1869,7 +1869,8 @@ registers, find a list below:
1869 PPC | KVM_REG_PPC_PID | 64 1869 PPC | KVM_REG_PPC_PID | 64
1870 PPC | KVM_REG_PPC_ACOP | 64 1870 PPC | KVM_REG_PPC_ACOP | 64
1871 PPC | KVM_REG_PPC_VRSAVE | 32 1871 PPC | KVM_REG_PPC_VRSAVE | 32
1872 PPC | KVM_REG_PPC_LPCR | 64 1872 PPC | KVM_REG_PPC_LPCR | 32
1873 PPC | KVM_REG_PPC_LPCR_64 | 64
1873 PPC | KVM_REG_PPC_PPR | 64 1874 PPC | KVM_REG_PPC_PPR | 64
1874 PPC | KVM_REG_PPC_ARCH_COMPAT 32 1875 PPC | KVM_REG_PPC_ARCH_COMPAT 32
1875 PPC | KVM_REG_PPC_DABRX | 32 1876 PPC | KVM_REG_PPC_DABRX | 32
diff --git a/arch/powerpc/include/uapi/asm/kvm.h b/arch/powerpc/include/uapi/asm/kvm.h
index 0e56d9e7b2d6..e0e49dbb145d 100644
--- a/arch/powerpc/include/uapi/asm/kvm.h
+++ b/arch/powerpc/include/uapi/asm/kvm.h
@@ -548,6 +548,7 @@ struct kvm_get_htab_header {
548 548
549#define KVM_REG_PPC_VRSAVE (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb4) 549#define KVM_REG_PPC_VRSAVE (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb4)
550#define KVM_REG_PPC_LPCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb5) 550#define KVM_REG_PPC_LPCR (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb5)
551#define KVM_REG_PPC_LPCR_64 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb5)
551#define KVM_REG_PPC_PPR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb6) 552#define KVM_REG_PPC_PPR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb6)
552 553
553/* Architecture compatibility level */ 554/* Architecture compatibility level */
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index f1281c4c381c..0c5266e75a2e 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -863,7 +863,8 @@ static int kvm_arch_vcpu_ioctl_set_sregs_hv(struct kvm_vcpu *vcpu,
863 return 0; 863 return 0;
864} 864}
865 865
866static void kvmppc_set_lpcr(struct kvm_vcpu *vcpu, u64 new_lpcr) 866static void kvmppc_set_lpcr(struct kvm_vcpu *vcpu, u64 new_lpcr,
867 bool preserve_top32)
867{ 868{
868 struct kvmppc_vcore *vc = vcpu->arch.vcore; 869 struct kvmppc_vcore *vc = vcpu->arch.vcore;
869 u64 mask; 870 u64 mask;
@@ -898,6 +899,10 @@ static void kvmppc_set_lpcr(struct kvm_vcpu *vcpu, u64 new_lpcr)
898 mask = LPCR_DPFD | LPCR_ILE | LPCR_TC; 899 mask = LPCR_DPFD | LPCR_ILE | LPCR_TC;
899 if (cpu_has_feature(CPU_FTR_ARCH_207S)) 900 if (cpu_has_feature(CPU_FTR_ARCH_207S))
900 mask |= LPCR_AIL; 901 mask |= LPCR_AIL;
902
903 /* Broken 32-bit version of LPCR must not clear top bits */
904 if (preserve_top32)
905 mask &= 0xFFFFFFFF;
901 vc->lpcr = (vc->lpcr & ~mask) | (new_lpcr & mask); 906 vc->lpcr = (vc->lpcr & ~mask) | (new_lpcr & mask);
902 spin_unlock(&vc->lock); 907 spin_unlock(&vc->lock);
903} 908}
@@ -1011,6 +1016,7 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
1011 *val = get_reg_val(id, vcpu->arch.vcore->tb_offset); 1016 *val = get_reg_val(id, vcpu->arch.vcore->tb_offset);
1012 break; 1017 break;
1013 case KVM_REG_PPC_LPCR: 1018 case KVM_REG_PPC_LPCR:
1019 case KVM_REG_PPC_LPCR_64:
1014 *val = get_reg_val(id, vcpu->arch.vcore->lpcr); 1020 *val = get_reg_val(id, vcpu->arch.vcore->lpcr);
1015 break; 1021 break;
1016 case KVM_REG_PPC_PPR: 1022 case KVM_REG_PPC_PPR:
@@ -1216,7 +1222,10 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
1216 ALIGN(set_reg_val(id, *val), 1UL << 24); 1222 ALIGN(set_reg_val(id, *val), 1UL << 24);
1217 break; 1223 break;
1218 case KVM_REG_PPC_LPCR: 1224 case KVM_REG_PPC_LPCR:
1219 kvmppc_set_lpcr(vcpu, set_reg_val(id, *val)); 1225 kvmppc_set_lpcr(vcpu, set_reg_val(id, *val), true);
1226 break;
1227 case KVM_REG_PPC_LPCR_64:
1228 kvmppc_set_lpcr(vcpu, set_reg_val(id, *val), false);
1220 break; 1229 break;
1221 case KVM_REG_PPC_PPR: 1230 case KVM_REG_PPC_PPR:
1222 vcpu->arch.ppr = set_reg_val(id, *val); 1231 vcpu->arch.ppr = set_reg_val(id, *val);
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index b18f2d4fac59..e7a1fa2517b1 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -1314,6 +1314,7 @@ static int kvmppc_get_one_reg_pr(struct kvm_vcpu *vcpu, u64 id,
1314 *val = get_reg_val(id, to_book3s(vcpu)->hior); 1314 *val = get_reg_val(id, to_book3s(vcpu)->hior);
1315 break; 1315 break;
1316 case KVM_REG_PPC_LPCR: 1316 case KVM_REG_PPC_LPCR:
1317 case KVM_REG_PPC_LPCR_64:
1317 /* 1318 /*
1318 * We are only interested in the LPCR_ILE bit 1319 * We are only interested in the LPCR_ILE bit
1319 */ 1320 */
@@ -1349,6 +1350,7 @@ static int kvmppc_set_one_reg_pr(struct kvm_vcpu *vcpu, u64 id,
1349 to_book3s(vcpu)->hior_explicit = true; 1350 to_book3s(vcpu)->hior_explicit = true;
1350 break; 1351 break;
1351 case KVM_REG_PPC_LPCR: 1352 case KVM_REG_PPC_LPCR:
1353 case KVM_REG_PPC_LPCR_64:
1352 kvmppc_set_lpcr_pr(vcpu, set_reg_val(id, *val)); 1354 kvmppc_set_lpcr_pr(vcpu, set_reg_val(id, *val));
1353 break; 1355 break;
1354 default: 1356 default: