aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kvm/book3s.c')
-rw-r--r--arch/powerpc/kvm/book3s.c106
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
93static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu) 93static 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
119void kvmppc_inject_interrupt(struct kvm_vcpu *vcpu, int vec, u64 flags) 119void 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);
367static int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, bool data, 371static 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;