aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/powerpc.c
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2011-08-18 16:25:21 -0400
committerAvi Kivity <avi@redhat.com>2012-03-05 07:52:24 -0500
commitdc83b8bc0256ee682506ed83853a98eaba529c6f (patch)
tree0d5f73b725392104320894d606bba10151a9ea3c /arch/powerpc/kvm/powerpc.c
parent0164c0f0c404017fb04defb0ceb23fd1c3c3a53e (diff)
KVM: PPC: e500: MMU API
This implements a shared-memory API for giving host userspace access to the guest's TLB. Signed-off-by: Scott Wood <scottwood@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc/kvm/powerpc.c')
-rw-r--r--arch/powerpc/kvm/powerpc.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index a5671616af8..3cf6fba513a 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -222,6 +222,9 @@ int kvm_dev_ioctl_check_extension(long ext)
222 case KVM_CAP_PPC_PAIRED_SINGLES: 222 case KVM_CAP_PPC_PAIRED_SINGLES:
223 case KVM_CAP_PPC_OSI: 223 case KVM_CAP_PPC_OSI:
224 case KVM_CAP_PPC_GET_PVINFO: 224 case KVM_CAP_PPC_GET_PVINFO:
225#ifdef CONFIG_KVM_E500
226 case KVM_CAP_SW_TLB:
227#endif
225 r = 1; 228 r = 1;
226 break; 229 break;
227 case KVM_CAP_COALESCED_MMIO: 230 case KVM_CAP_COALESCED_MMIO:
@@ -602,6 +605,19 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
602 r = 0; 605 r = 0;
603 vcpu->arch.papr_enabled = true; 606 vcpu->arch.papr_enabled = true;
604 break; 607 break;
608#ifdef CONFIG_KVM_E500
609 case KVM_CAP_SW_TLB: {
610 struct kvm_config_tlb cfg;
611 void __user *user_ptr = (void __user *)(uintptr_t)cap->args[0];
612
613 r = -EFAULT;
614 if (copy_from_user(&cfg, user_ptr, sizeof(cfg)))
615 break;
616
617 r = kvm_vcpu_ioctl_config_tlb(vcpu, &cfg);
618 break;
619 }
620#endif
605 default: 621 default:
606 r = -EINVAL; 622 r = -EINVAL;
607 break; 623 break;
@@ -651,6 +667,18 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
651 r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap); 667 r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
652 break; 668 break;
653 } 669 }
670
671#ifdef CONFIG_KVM_E500
672 case KVM_DIRTY_TLB: {
673 struct kvm_dirty_tlb dirty;
674 r = -EFAULT;
675 if (copy_from_user(&dirty, argp, sizeof(dirty)))
676 goto out;
677 r = kvm_vcpu_ioctl_dirty_tlb(vcpu, &dirty);
678 break;
679 }
680#endif
681
654 default: 682 default:
655 r = -EINVAL; 683 r = -EINVAL;
656 } 684 }