aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s_pr_papr.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kvm/book3s_pr_papr.c')
-rw-r--r--arch/powerpc/kvm/book3s_pr_papr.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/arch/powerpc/kvm/book3s_pr_papr.c b/arch/powerpc/kvm/book3s_pr_papr.c
index 5efa97b993d8..52a63bfe3f07 100644
--- a/arch/powerpc/kvm/book3s_pr_papr.c
+++ b/arch/powerpc/kvm/book3s_pr_papr.c
@@ -57,7 +57,7 @@ static int kvmppc_h_pr_enter(struct kvm_vcpu *vcpu)
57 for (i = 0; ; ++i) { 57 for (i = 0; ; ++i) {
58 if (i == 8) 58 if (i == 8)
59 goto done; 59 goto done;
60 if ((*hpte & HPTE_V_VALID) == 0) 60 if ((be64_to_cpu(*hpte) & HPTE_V_VALID) == 0)
61 break; 61 break;
62 hpte += 2; 62 hpte += 2;
63 } 63 }
@@ -67,8 +67,8 @@ static int kvmppc_h_pr_enter(struct kvm_vcpu *vcpu)
67 goto done; 67 goto done;
68 } 68 }
69 69
70 hpte[0] = kvmppc_get_gpr(vcpu, 6); 70 hpte[0] = cpu_to_be64(kvmppc_get_gpr(vcpu, 6));
71 hpte[1] = kvmppc_get_gpr(vcpu, 7); 71 hpte[1] = cpu_to_be64(kvmppc_get_gpr(vcpu, 7));
72 pteg_addr += i * HPTE_SIZE; 72 pteg_addr += i * HPTE_SIZE;
73 copy_to_user((void __user *)pteg_addr, hpte, HPTE_SIZE); 73 copy_to_user((void __user *)pteg_addr, hpte, HPTE_SIZE);
74 kvmppc_set_gpr(vcpu, 4, pte_index | i); 74 kvmppc_set_gpr(vcpu, 4, pte_index | i);
@@ -93,6 +93,8 @@ static int kvmppc_h_pr_remove(struct kvm_vcpu *vcpu)
93 pteg = get_pteg_addr(vcpu, pte_index); 93 pteg = get_pteg_addr(vcpu, pte_index);
94 mutex_lock(&vcpu->kvm->arch.hpt_mutex); 94 mutex_lock(&vcpu->kvm->arch.hpt_mutex);
95 copy_from_user(pte, (void __user *)pteg, sizeof(pte)); 95 copy_from_user(pte, (void __user *)pteg, sizeof(pte));
96 pte[0] = be64_to_cpu(pte[0]);
97 pte[1] = be64_to_cpu(pte[1]);
96 98
97 ret = H_NOT_FOUND; 99 ret = H_NOT_FOUND;
98 if ((pte[0] & HPTE_V_VALID) == 0 || 100 if ((pte[0] & HPTE_V_VALID) == 0 ||
@@ -169,6 +171,8 @@ static int kvmppc_h_pr_bulk_remove(struct kvm_vcpu *vcpu)
169 171
170 pteg = get_pteg_addr(vcpu, tsh & H_BULK_REMOVE_PTEX); 172 pteg = get_pteg_addr(vcpu, tsh & H_BULK_REMOVE_PTEX);
171 copy_from_user(pte, (void __user *)pteg, sizeof(pte)); 173 copy_from_user(pte, (void __user *)pteg, sizeof(pte));
174 pte[0] = be64_to_cpu(pte[0]);
175 pte[1] = be64_to_cpu(pte[1]);
172 176
173 /* tsl = AVPN */ 177 /* tsl = AVPN */
174 flags = (tsh & H_BULK_REMOVE_FLAGS) >> 26; 178 flags = (tsh & H_BULK_REMOVE_FLAGS) >> 26;
@@ -207,6 +211,8 @@ static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu)
207 pteg = get_pteg_addr(vcpu, pte_index); 211 pteg = get_pteg_addr(vcpu, pte_index);
208 mutex_lock(&vcpu->kvm->arch.hpt_mutex); 212 mutex_lock(&vcpu->kvm->arch.hpt_mutex);
209 copy_from_user(pte, (void __user *)pteg, sizeof(pte)); 213 copy_from_user(pte, (void __user *)pteg, sizeof(pte));
214 pte[0] = be64_to_cpu(pte[0]);
215 pte[1] = be64_to_cpu(pte[1]);
210 216
211 ret = H_NOT_FOUND; 217 ret = H_NOT_FOUND;
212 if ((pte[0] & HPTE_V_VALID) == 0 || 218 if ((pte[0] & HPTE_V_VALID) == 0 ||
@@ -225,6 +231,8 @@ static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu)
225 231
226 rb = compute_tlbie_rb(v, r, pte_index); 232 rb = compute_tlbie_rb(v, r, pte_index);
227 vcpu->arch.mmu.tlbie(vcpu, rb, rb & 1 ? true : false); 233 vcpu->arch.mmu.tlbie(vcpu, rb, rb & 1 ? true : false);
234 pte[0] = cpu_to_be64(pte[0]);
235 pte[1] = cpu_to_be64(pte[1]);
228 copy_to_user((void __user *)pteg, pte, sizeof(pte)); 236 copy_to_user((void __user *)pteg, pte, sizeof(pte));
229 ret = H_SUCCESS; 237 ret = H_SUCCESS;
230 238
@@ -270,7 +278,7 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
270 case H_PUT_TCE: 278 case H_PUT_TCE:
271 return kvmppc_h_pr_put_tce(vcpu); 279 return kvmppc_h_pr_put_tce(vcpu);
272 case H_CEDE: 280 case H_CEDE:
273 vcpu->arch.shared->msr |= MSR_EE; 281 kvmppc_set_msr_fast(vcpu, kvmppc_get_msr(vcpu) | MSR_EE);
274 kvm_vcpu_block(vcpu); 282 kvm_vcpu_block(vcpu);
275 clear_bit(KVM_REQ_UNHALT, &vcpu->requests); 283 clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
276 vcpu->stat.halt_wakeup++; 284 vcpu->stat.halt_wakeup++;