aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2011-09-14 04:02:41 -0400
committerAvi Kivity <avi@redhat.com>2012-03-05 07:52:40 -0500
commite24ed81fedd551e80378be62fa0b0532480ea7d4 (patch)
tree254bcf7fbe858bc75087432667c7409e58b35575 /arch
parent6b75e6bfef7ba108ac3df0d430d80dea68fde4bf (diff)
KVM: PPC: Add generic single register ioctls
Right now we transfer a static struct every time we want to get or set registers. Unfortunately, over time we realize that there are more of these than we thought of before and the extensibility and flexibility of transferring a full struct every time is limited. So this is a new approach to the problem. With these new ioctls, we can get and set a single register that is identified by an ID. This allows for very precise and limited transmittal of data. When we later realize that it's a better idea to shove over multiple registers at once, we can reuse most of the infrastructure and simply implement a GET_MANY_REGS / SET_MANY_REGS interface. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/kvm/powerpc.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index f4380cb264e0..089c61bf0e16 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -217,6 +217,7 @@ int kvm_dev_ioctl_check_extension(long ext)
217 case KVM_CAP_PPC_UNSET_IRQ: 217 case KVM_CAP_PPC_UNSET_IRQ:
218 case KVM_CAP_PPC_IRQ_LEVEL: 218 case KVM_CAP_PPC_IRQ_LEVEL:
219 case KVM_CAP_ENABLE_CAP: 219 case KVM_CAP_ENABLE_CAP:
220 case KVM_CAP_ONE_REG:
220 r = 1; 221 r = 1;
221 break; 222 break;
222#ifndef CONFIG_KVM_BOOK3S_64_HV 223#ifndef CONFIG_KVM_BOOK3S_64_HV
@@ -645,6 +646,32 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
645 return r; 646 return r;
646} 647}
647 648
649static int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu,
650 struct kvm_one_reg *reg)
651{
652 int r = -EINVAL;
653
654 switch (reg->id) {
655 default:
656 break;
657 }
658
659 return r;
660}
661
662static int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu,
663 struct kvm_one_reg *reg)
664{
665 int r = -EINVAL;
666
667 switch (reg->id) {
668 default:
669 break;
670 }
671
672 return r;
673}
674
648int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, 675int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
649 struct kvm_mp_state *mp_state) 676 struct kvm_mp_state *mp_state)
650{ 677{
@@ -684,6 +711,20 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
684 break; 711 break;
685 } 712 }
686 713
714 case KVM_SET_ONE_REG:
715 case KVM_GET_ONE_REG:
716 {
717 struct kvm_one_reg reg;
718 r = -EFAULT;
719 if (copy_from_user(&reg, argp, sizeof(reg)))
720 goto out;
721 if (ioctl == KVM_SET_ONE_REG)
722 r = kvm_vcpu_ioctl_set_one_reg(vcpu, &reg);
723 else
724 r = kvm_vcpu_ioctl_get_one_reg(vcpu, &reg);
725 break;
726 }
727
687#ifdef CONFIG_KVM_E500 728#ifdef CONFIG_KVM_E500
688 case KVM_DIRTY_TLB: { 729 case KVM_DIRTY_TLB: {
689 struct kvm_dirty_tlb dirty; 730 struct kvm_dirty_tlb dirty;