diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_64_emulate.c')
| -rw-r--r-- | arch/powerpc/kvm/book3s_64_emulate.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/arch/powerpc/kvm/book3s_64_emulate.c b/arch/powerpc/kvm/book3s_64_emulate.c index c343e67306e0..1027eac6d474 100644 --- a/arch/powerpc/kvm/book3s_64_emulate.c +++ b/arch/powerpc/kvm/book3s_64_emulate.c | |||
| @@ -185,7 +185,27 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
| 185 | return emulated; | 185 | return emulated; |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | static void kvmppc_write_bat(struct kvm_vcpu *vcpu, int sprn, u64 val) | 188 | void kvmppc_set_bat(struct kvm_vcpu *vcpu, struct kvmppc_bat *bat, bool upper, |
| 189 | u32 val) | ||
| 190 | { | ||
| 191 | if (upper) { | ||
| 192 | /* Upper BAT */ | ||
| 193 | u32 bl = (val >> 2) & 0x7ff; | ||
| 194 | bat->bepi_mask = (~bl << 17); | ||
| 195 | bat->bepi = val & 0xfffe0000; | ||
| 196 | bat->vs = (val & 2) ? 1 : 0; | ||
| 197 | bat->vp = (val & 1) ? 1 : 0; | ||
| 198 | bat->raw = (bat->raw & 0xffffffff00000000ULL) | val; | ||
| 199 | } else { | ||
| 200 | /* Lower BAT */ | ||
| 201 | bat->brpn = val & 0xfffe0000; | ||
| 202 | bat->wimg = (val >> 3) & 0xf; | ||
| 203 | bat->pp = val & 3; | ||
| 204 | bat->raw = (bat->raw & 0x00000000ffffffffULL) | ((u64)val << 32); | ||
| 205 | } | ||
| 206 | } | ||
| 207 | |||
| 208 | static void kvmppc_write_bat(struct kvm_vcpu *vcpu, int sprn, u32 val) | ||
| 189 | { | 209 | { |
| 190 | struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); | 210 | struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); |
| 191 | struct kvmppc_bat *bat; | 211 | struct kvmppc_bat *bat; |
| @@ -207,19 +227,7 @@ static void kvmppc_write_bat(struct kvm_vcpu *vcpu, int sprn, u64 val) | |||
| 207 | BUG(); | 227 | BUG(); |
| 208 | } | 228 | } |
| 209 | 229 | ||
| 210 | if (!(sprn % 2)) { | 230 | kvmppc_set_bat(vcpu, bat, !(sprn % 2), val); |
| 211 | /* Upper BAT */ | ||
| 212 | u32 bl = (val >> 2) & 0x7ff; | ||
| 213 | bat->bepi_mask = (~bl << 17); | ||
| 214 | bat->bepi = val & 0xfffe0000; | ||
| 215 | bat->vs = (val & 2) ? 1 : 0; | ||
| 216 | bat->vp = (val & 1) ? 1 : 0; | ||
| 217 | } else { | ||
| 218 | /* Lower BAT */ | ||
| 219 | bat->brpn = val & 0xfffe0000; | ||
| 220 | bat->wimg = (val >> 3) & 0xf; | ||
| 221 | bat->pp = val & 3; | ||
| 222 | } | ||
| 223 | } | 231 | } |
| 224 | 232 | ||
| 225 | int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) | 233 | int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) |
| @@ -243,7 +251,7 @@ int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) | |||
| 243 | case SPRN_IBAT4U ... SPRN_IBAT7L: | 251 | case SPRN_IBAT4U ... SPRN_IBAT7L: |
| 244 | case SPRN_DBAT0U ... SPRN_DBAT3L: | 252 | case SPRN_DBAT0U ... SPRN_DBAT3L: |
| 245 | case SPRN_DBAT4U ... SPRN_DBAT7L: | 253 | case SPRN_DBAT4U ... SPRN_DBAT7L: |
| 246 | kvmppc_write_bat(vcpu, sprn, vcpu->arch.gpr[rs]); | 254 | kvmppc_write_bat(vcpu, sprn, (u32)vcpu->arch.gpr[rs]); |
| 247 | /* BAT writes happen so rarely that we're ok to flush | 255 | /* BAT writes happen so rarely that we're ok to flush |
| 248 | * everything here */ | 256 | * everything here */ |
| 249 | kvmppc_mmu_pte_flush(vcpu, 0, 0); | 257 | kvmppc_mmu_pte_flush(vcpu, 0, 0); |
