diff options
author | Scott Wood <scottwood@freescale.com> | 2011-08-18 16:25:21 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-03-05 07:52:24 -0500 |
commit | dc83b8bc0256ee682506ed83853a98eaba529c6f (patch) | |
tree | 0d5f73b725392104320894d606bba10151a9ea3c /arch/powerpc/kvm/powerpc.c | |
parent | 0164c0f0c404017fb04defb0ceb23fd1c3c3a53e (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.c | 28 |
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 | } |