diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s.c')
| -rw-r--r-- | arch/powerpc/kvm/book3s.c | 106 |
1 files changed, 70 insertions, 36 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c index 94e597e6f15c..52c654dbd41a 100644 --- a/arch/powerpc/kvm/book3s.c +++ b/arch/powerpc/kvm/book3s.c | |||
| @@ -85,9 +85,9 @@ static inline void kvmppc_update_int_pending(struct kvm_vcpu *vcpu, | |||
| 85 | if (is_kvmppc_hv_enabled(vcpu->kvm)) | 85 | if (is_kvmppc_hv_enabled(vcpu->kvm)) |
| 86 | return; | 86 | return; |
| 87 | if (pending_now) | 87 | if (pending_now) |
| 88 | vcpu->arch.shared->int_pending = 1; | 88 | kvmppc_set_int_pending(vcpu, 1); |
| 89 | else if (old_pending) | 89 | else if (old_pending) |
| 90 | vcpu->arch.shared->int_pending = 0; | 90 | kvmppc_set_int_pending(vcpu, 0); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu) | 93 | static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu) |
| @@ -99,11 +99,11 @@ static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu) | |||
| 99 | if (is_kvmppc_hv_enabled(vcpu->kvm)) | 99 | if (is_kvmppc_hv_enabled(vcpu->kvm)) |
| 100 | return false; | 100 | return false; |
| 101 | 101 | ||
| 102 | crit_raw = vcpu->arch.shared->critical; | 102 | crit_raw = kvmppc_get_critical(vcpu); |
| 103 | crit_r1 = kvmppc_get_gpr(vcpu, 1); | 103 | crit_r1 = kvmppc_get_gpr(vcpu, 1); |
| 104 | 104 | ||
| 105 | /* Truncate crit indicators in 32 bit mode */ | 105 | /* Truncate crit indicators in 32 bit mode */ |
| 106 | if (!(vcpu->arch.shared->msr & MSR_SF)) { | 106 | if (!(kvmppc_get_msr(vcpu) & MSR_SF)) { |
| 107 | crit_raw &= 0xffffffff; | 107 | crit_raw &= 0xffffffff; |
| 108 | crit_r1 &= 0xffffffff; | 108 | crit_r1 &= 0xffffffff; |
| 109 | } | 109 | } |
| @@ -111,15 +111,15 @@ static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu) | |||
| 111 | /* Critical section when crit == r1 */ | 111 | /* Critical section when crit == r1 */ |
| 112 | crit = (crit_raw == crit_r1); | 112 | crit = (crit_raw == crit_r1); |
| 113 | /* ... and we're in supervisor mode */ | 113 | /* ... and we're in supervisor mode */ |
| 114 | crit = crit && !(vcpu->arch.shared->msr & MSR_PR); | 114 | crit = crit && !(kvmppc_get_msr(vcpu) & MSR_PR); |
| 115 | 115 | ||
| 116 | return crit; | 116 | return crit; |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | void kvmppc_inject_interrupt(struct kvm_vcpu *vcpu, int vec, u64 flags) | 119 | void kvmppc_inject_interrupt(struct kvm_vcpu *vcpu, int vec, u64 flags) |
| 120 | { | 120 | { |
| 121 | vcpu->arch.shared->srr0 = kvmppc_get_pc(vcpu); | 121 | kvmppc_set_srr0(vcpu, kvmppc_get_pc(vcpu)); |
| 122 | vcpu->arch.shared->srr1 = vcpu->arch.shared->msr | flags; | 122 | kvmppc_set_srr1(vcpu, kvmppc_get_msr(vcpu) | flags); |
| 123 | kvmppc_set_pc(vcpu, kvmppc_interrupt_offset(vcpu) + vec); | 123 | kvmppc_set_pc(vcpu, kvmppc_interrupt_offset(vcpu) + vec); |
| 124 | vcpu->arch.mmu.reset_msr(vcpu); | 124 | vcpu->arch.mmu.reset_msr(vcpu); |
| 125 | } | 125 | } |
| @@ -145,6 +145,7 @@ static int kvmppc_book3s_vec2irqprio(unsigned int vec) | |||
| 145 | case 0xd00: prio = BOOK3S_IRQPRIO_DEBUG; break; | 145 | case 0xd00: prio = BOOK3S_IRQPRIO_DEBUG; break; |
| 146 | case 0xf20: prio = BOOK3S_IRQPRIO_ALTIVEC; break; | 146 | case 0xf20: prio = BOOK3S_IRQPRIO_ALTIVEC; break; |
| 147 | case 0xf40: prio = BOOK3S_IRQPRIO_VSX; break; | 147 | case 0xf40: prio = BOOK3S_IRQPRIO_VSX; break; |
| 148 | case 0xf60: prio = BOOK3S_IRQPRIO_FAC_UNAVAIL; break; | ||
| 148 | default: prio = BOOK3S_IRQPRIO_MAX; break; | 149 | default: prio = BOOK3S_IRQPRIO_MAX; break; |
| 149 | } | 150 | } |
| 150 | 151 | ||
| @@ -225,12 +226,12 @@ int kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu, unsigned int priority) | |||
| 225 | 226 | ||
| 226 | switch (priority) { | 227 | switch (priority) { |
| 227 | case BOOK3S_IRQPRIO_DECREMENTER: | 228 | case BOOK3S_IRQPRIO_DECREMENTER: |
| 228 | deliver = (vcpu->arch.shared->msr & MSR_EE) && !crit; | 229 | deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit; |
| 229 | vec = BOOK3S_INTERRUPT_DECREMENTER; | 230 | vec = BOOK3S_INTERRUPT_DECREMENTER; |
| 230 | break; | 231 | break; |
| 231 | case BOOK3S_IRQPRIO_EXTERNAL: | 232 | case BOOK3S_IRQPRIO_EXTERNAL: |
| 232 | case BOOK3S_IRQPRIO_EXTERNAL_LEVEL: | 233 | case BOOK3S_IRQPRIO_EXTERNAL_LEVEL: |
| 233 | deliver = (vcpu->arch.shared->msr & MSR_EE) && !crit; | 234 | deliver = (kvmppc_get_msr(vcpu) & MSR_EE) && !crit; |
| 234 | vec = BOOK3S_INTERRUPT_EXTERNAL; | 235 | vec = BOOK3S_INTERRUPT_EXTERNAL; |
| 235 | break; | 236 | break; |
| 236 | case BOOK3S_IRQPRIO_SYSTEM_RESET: | 237 | case BOOK3S_IRQPRIO_SYSTEM_RESET: |
| @@ -275,6 +276,9 @@ int kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu, unsigned int priority) | |||
| 275 | case BOOK3S_IRQPRIO_PERFORMANCE_MONITOR: | 276 | case BOOK3S_IRQPRIO_PERFORMANCE_MONITOR: |
| 276 | vec = BOOK3S_INTERRUPT_PERFMON; | 277 | vec = BOOK3S_INTERRUPT_PERFMON; |
| 277 | break; | 278 | break; |
| 279 | case BOOK3S_IRQPRIO_FAC_UNAVAIL: | ||
| 280 | vec = BOOK3S_INTERRUPT_FAC_UNAVAIL; | ||
| 281 | break; | ||
| 278 | default: | 282 | default: |
| 279 | deliver = 0; | 283 | deliver = 0; |
| 280 | printk(KERN_ERR "KVM: Unknown interrupt: 0x%x\n", priority); | 284 | printk(KERN_ERR "KVM: Unknown interrupt: 0x%x\n", priority); |
| @@ -343,7 +347,7 @@ pfn_t kvmppc_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn, bool writing, | |||
| 343 | { | 347 | { |
| 344 | ulong mp_pa = vcpu->arch.magic_page_pa; | 348 | ulong mp_pa = vcpu->arch.magic_page_pa; |
| 345 | 349 | ||
| 346 | if (!(vcpu->arch.shared->msr & MSR_SF)) | 350 | if (!(kvmppc_get_msr(vcpu) & MSR_SF)) |
| 347 | mp_pa = (uint32_t)mp_pa; | 351 | mp_pa = (uint32_t)mp_pa; |
| 348 | 352 | ||
| 349 | /* Magic page override */ | 353 | /* Magic page override */ |
| @@ -367,7 +371,7 @@ EXPORT_SYMBOL_GPL(kvmppc_gfn_to_pfn); | |||
| 367 | static int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, bool data, | 371 | static int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, bool data, |
| 368 | bool iswrite, struct kvmppc_pte *pte) | 372 | bool iswrite, struct kvmppc_pte *pte) |
| 369 | { | 373 | { |
| 370 | int relocated = (vcpu->arch.shared->msr & (data ? MSR_DR : MSR_IR)); | 374 | int relocated = (kvmppc_get_msr(vcpu) & (data ? MSR_DR : MSR_IR)); |
| 371 | int r; | 375 | int r; |
| 372 | 376 | ||
| 373 | if (relocated) { | 377 | if (relocated) { |
| @@ -498,18 +502,18 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
| 498 | regs->ctr = kvmppc_get_ctr(vcpu); | 502 | regs->ctr = kvmppc_get_ctr(vcpu); |
| 499 | regs->lr = kvmppc_get_lr(vcpu); | 503 | regs->lr = kvmppc_get_lr(vcpu); |
| 500 | regs->xer = kvmppc_get_xer(vcpu); | 504 | regs->xer = kvmppc_get_xer(vcpu); |
| 501 | regs->msr = vcpu->arch.shared->msr; | 505 | regs->msr = kvmppc_get_msr(vcpu); |
| 502 | regs->srr0 = vcpu->arch.shared->srr0; | 506 | regs->srr0 = kvmppc_get_srr0(vcpu); |
| 503 | regs->srr1 = vcpu->arch.shared->srr1; | 507 | regs->srr1 = kvmppc_get_srr1(vcpu); |
| 504 | regs->pid = vcpu->arch.pid; | 508 | regs->pid = vcpu->arch.pid; |
| 505 | regs->sprg0 = vcpu->arch.shared->sprg0; | 509 | regs->sprg0 = kvmppc_get_sprg0(vcpu); |
| 506 | regs->sprg1 = vcpu->arch.shared->sprg1; | 510 | regs->sprg1 = kvmppc_get_sprg1(vcpu); |
| 507 | regs->sprg2 = vcpu->arch.shared->sprg2; | 511 | regs->sprg2 = kvmppc_get_sprg2(vcpu); |
| 508 | regs->sprg3 = vcpu->arch.shared->sprg3; | 512 | regs->sprg3 = kvmppc_get_sprg3(vcpu); |
| 509 | regs->sprg4 = vcpu->arch.shared->sprg4; | 513 | regs->sprg4 = kvmppc_get_sprg4(vcpu); |
| 510 | regs->sprg5 = vcpu->arch.shared->sprg5; | 514 | regs->sprg5 = kvmppc_get_sprg5(vcpu); |
| 511 | regs->sprg6 = vcpu->arch.shared->sprg6; | 515 | regs->sprg6 = kvmppc_get_sprg6(vcpu); |
| 512 | regs->sprg7 = vcpu->arch.shared->sprg7; | 516 | regs->sprg7 = kvmppc_get_sprg7(vcpu); |
| 513 | 517 | ||
| 514 | for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) | 518 | for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) |
| 515 | regs->gpr[i] = kvmppc_get_gpr(vcpu, i); | 519 | regs->gpr[i] = kvmppc_get_gpr(vcpu, i); |
| @@ -527,16 +531,16 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
| 527 | kvmppc_set_lr(vcpu, regs->lr); | 531 | kvmppc_set_lr(vcpu, regs->lr); |
| 528 | kvmppc_set_xer(vcpu, regs->xer); | 532 | kvmppc_set_xer(vcpu, regs->xer); |
| 529 | kvmppc_set_msr(vcpu, regs->msr); | 533 | kvmppc_set_msr(vcpu, regs->msr); |
| 530 | vcpu->arch.shared->srr0 = regs->srr0; | 534 | kvmppc_set_srr0(vcpu, regs->srr0); |
| 531 | vcpu->arch.shared->srr1 = regs->srr1; | 535 | kvmppc_set_srr1(vcpu, regs->srr1); |
| 532 | vcpu->arch.shared->sprg0 = regs->sprg0; | 536 | kvmppc_set_sprg0(vcpu, regs->sprg0); |
| 533 | vcpu->arch.shared->sprg1 = regs->sprg1; | 537 | kvmppc_set_sprg1(vcpu, regs->sprg1); |
| 534 | vcpu->arch.shared->sprg2 = regs->sprg2; | 538 | kvmppc_set_sprg2(vcpu, regs->sprg2); |
| 535 | vcpu->arch.shared->sprg3 = regs->sprg3; | 539 | kvmppc_set_sprg3(vcpu, regs->sprg3); |
| 536 | vcpu->arch.shared->sprg4 = regs->sprg4; | 540 | kvmppc_set_sprg4(vcpu, regs->sprg4); |
| 537 | vcpu->arch.shared->sprg5 = regs->sprg5; | 541 | kvmppc_set_sprg5(vcpu, regs->sprg5); |
| 538 | vcpu->arch.shared->sprg6 = regs->sprg6; | 542 | kvmppc_set_sprg6(vcpu, regs->sprg6); |
| 539 | vcpu->arch.shared->sprg7 = regs->sprg7; | 543 | kvmppc_set_sprg7(vcpu, regs->sprg7); |
| 540 | 544 | ||
| 541 | for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) | 545 | for (i = 0; i < ARRAY_SIZE(regs->gpr); i++) |
| 542 | kvmppc_set_gpr(vcpu, i, regs->gpr[i]); | 546 | kvmppc_set_gpr(vcpu, i, regs->gpr[i]); |
| @@ -570,10 +574,10 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) | |||
| 570 | r = 0; | 574 | r = 0; |
| 571 | switch (reg->id) { | 575 | switch (reg->id) { |
| 572 | case KVM_REG_PPC_DAR: | 576 | case KVM_REG_PPC_DAR: |
| 573 | val = get_reg_val(reg->id, vcpu->arch.shared->dar); | 577 | val = get_reg_val(reg->id, kvmppc_get_dar(vcpu)); |
| 574 | break; | 578 | break; |
| 575 | case KVM_REG_PPC_DSISR: | 579 | case KVM_REG_PPC_DSISR: |
| 576 | val = get_reg_val(reg->id, vcpu->arch.shared->dsisr); | 580 | val = get_reg_val(reg->id, kvmppc_get_dsisr(vcpu)); |
| 577 | break; | 581 | break; |
| 578 | case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31: | 582 | case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31: |
| 579 | i = reg->id - KVM_REG_PPC_FPR0; | 583 | i = reg->id - KVM_REG_PPC_FPR0; |
| @@ -627,6 +631,21 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) | |||
| 627 | val = get_reg_val(reg->id, kvmppc_xics_get_icp(vcpu)); | 631 | val = get_reg_val(reg->id, kvmppc_xics_get_icp(vcpu)); |
| 628 | break; | 632 | break; |
| 629 | #endif /* CONFIG_KVM_XICS */ | 633 | #endif /* CONFIG_KVM_XICS */ |
| 634 | case KVM_REG_PPC_FSCR: | ||
| 635 | val = get_reg_val(reg->id, vcpu->arch.fscr); | ||
| 636 | break; | ||
| 637 | case KVM_REG_PPC_TAR: | ||
| 638 | val = get_reg_val(reg->id, vcpu->arch.tar); | ||
| 639 | break; | ||
| 640 | case KVM_REG_PPC_EBBHR: | ||
| 641 | val = get_reg_val(reg->id, vcpu->arch.ebbhr); | ||
| 642 | break; | ||
| 643 | case KVM_REG_PPC_EBBRR: | ||
| 644 | val = get_reg_val(reg->id, vcpu->arch.ebbrr); | ||
| 645 | break; | ||
| 646 | case KVM_REG_PPC_BESCR: | ||
| 647 | val = get_reg_val(reg->id, vcpu->arch.bescr); | ||
| 648 | break; | ||
| 630 | default: | 649 | default: |
| 631 | r = -EINVAL; | 650 | r = -EINVAL; |
| 632 | break; | 651 | break; |
| @@ -660,10 +679,10 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) | |||
| 660 | r = 0; | 679 | r = 0; |
| 661 | switch (reg->id) { | 680 | switch (reg->id) { |
| 662 | case KVM_REG_PPC_DAR: | 681 | case KVM_REG_PPC_DAR: |
| 663 | vcpu->arch.shared->dar = set_reg_val(reg->id, val); | 682 | kvmppc_set_dar(vcpu, set_reg_val(reg->id, val)); |
| 664 | break; | 683 | break; |
| 665 | case KVM_REG_PPC_DSISR: | 684 | case KVM_REG_PPC_DSISR: |
| 666 | vcpu->arch.shared->dsisr = set_reg_val(reg->id, val); | 685 | kvmppc_set_dsisr(vcpu, set_reg_val(reg->id, val)); |
| 667 | break; | 686 | break; |
| 668 | case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31: | 687 | case KVM_REG_PPC_FPR0 ... KVM_REG_PPC_FPR31: |
| 669 | i = reg->id - KVM_REG_PPC_FPR0; | 688 | i = reg->id - KVM_REG_PPC_FPR0; |
| @@ -716,6 +735,21 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) | |||
| 716 | set_reg_val(reg->id, val)); | 735 | set_reg_val(reg->id, val)); |
| 717 | break; | 736 | break; |
| 718 | #endif /* CONFIG_KVM_XICS */ | 737 | #endif /* CONFIG_KVM_XICS */ |
| 738 | case KVM_REG_PPC_FSCR: | ||
| 739 | vcpu->arch.fscr = set_reg_val(reg->id, val); | ||
| 740 | break; | ||
| 741 | case KVM_REG_PPC_TAR: | ||
| 742 | vcpu->arch.tar = set_reg_val(reg->id, val); | ||
| 743 | break; | ||
| 744 | case KVM_REG_PPC_EBBHR: | ||
| 745 | vcpu->arch.ebbhr = set_reg_val(reg->id, val); | ||
| 746 | break; | ||
| 747 | case KVM_REG_PPC_EBBRR: | ||
| 748 | vcpu->arch.ebbrr = set_reg_val(reg->id, val); | ||
| 749 | break; | ||
| 750 | case KVM_REG_PPC_BESCR: | ||
| 751 | vcpu->arch.bescr = set_reg_val(reg->id, val); | ||
| 752 | break; | ||
| 719 | default: | 753 | default: |
| 720 | r = -EINVAL; | 754 | r = -EINVAL; |
| 721 | break; | 755 | break; |
