diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_pr_papr.c')
| -rw-r--r-- | arch/powerpc/kvm/book3s_pr_papr.c | 16 |
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++; |
