aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/powerpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kvm/powerpc.c')
-rw-r--r--arch/powerpc/kvm/powerpc.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 646bfd256e5d..9a4dd8146d39 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -151,6 +151,7 @@ int kvm_dev_ioctl_check_extension(long ext)
151 case KVM_CAP_PPC_PAIRED_SINGLES: 151 case KVM_CAP_PPC_PAIRED_SINGLES:
152 case KVM_CAP_PPC_UNSET_IRQ: 152 case KVM_CAP_PPC_UNSET_IRQ:
153 case KVM_CAP_ENABLE_CAP: 153 case KVM_CAP_ENABLE_CAP:
154 case KVM_CAP_PPC_OSI:
154 r = 1; 155 r = 1;
155 break; 156 break;
156 case KVM_CAP_COALESCED_MMIO: 157 case KVM_CAP_COALESCED_MMIO:
@@ -433,6 +434,13 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
433 if (!vcpu->arch.dcr_is_write) 434 if (!vcpu->arch.dcr_is_write)
434 kvmppc_complete_dcr_load(vcpu, run); 435 kvmppc_complete_dcr_load(vcpu, run);
435 vcpu->arch.dcr_needed = 0; 436 vcpu->arch.dcr_needed = 0;
437 } else if (vcpu->arch.osi_needed) {
438 u64 *gprs = run->osi.gprs;
439 int i;
440
441 for (i = 0; i < 32; i++)
442 kvmppc_set_gpr(vcpu, i, gprs[i]);
443 vcpu->arch.osi_needed = 0;
436 } 444 }
437 445
438 kvmppc_core_deliver_interrupts(vcpu); 446 kvmppc_core_deliver_interrupts(vcpu);
@@ -475,6 +483,10 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
475 return -EINVAL; 483 return -EINVAL;
476 484
477 switch (cap->cap) { 485 switch (cap->cap) {
486 case KVM_CAP_PPC_OSI:
487 r = 0;
488 vcpu->arch.osi_enabled = true;
489 break;
478 default: 490 default:
479 r = -EINVAL; 491 r = -EINVAL;
480 break; 492 break;