aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/powerpc.c
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2013-04-17 16:30:00 -0400
committerAlexander Graf <agraf@suse.de>2013-04-26 14:27:29 -0400
commit8e591cb7204739efa8e15967ea334eb367039dde (patch)
tree3fa76d3875c8133eeafc2e36372aaf83232fc54f /arch/powerpc/kvm/powerpc.c
parent91194919a6b07d70081fe185a79b129efee84fff (diff)
KVM: PPC: Book3S: Add infrastructure to implement kernel-side RTAS calls
For pseries machine emulation, in order to move the interrupt controller code to the kernel, we need to intercept some RTAS calls in the kernel itself. This adds an infrastructure to allow in-kernel handlers to be registered for RTAS services by name. A new ioctl, KVM_PPC_RTAS_DEFINE_TOKEN, then allows userspace to associate token values with those service names. Then, when the guest requests an RTAS service with one of those token values, it will be handled by the relevant in-kernel handler rather than being passed up to userspace as at present. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org> [agraf: fix warning] Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/kvm/powerpc.c')
-rw-r--r--arch/powerpc/kvm/powerpc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index d8e81e6c1afe..d4fd443ae7bd 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -341,6 +341,7 @@ int kvm_dev_ioctl_check_extension(long ext)
341#ifdef CONFIG_PPC_BOOK3S_64 341#ifdef CONFIG_PPC_BOOK3S_64
342 case KVM_CAP_SPAPR_TCE: 342 case KVM_CAP_SPAPR_TCE:
343 case KVM_CAP_PPC_ALLOC_HTAB: 343 case KVM_CAP_PPC_ALLOC_HTAB:
344 case KVM_CAP_PPC_RTAS:
344 r = 1; 345 r = 1;
345 break; 346 break;
346#endif /* CONFIG_PPC_BOOK3S_64 */ 347#endif /* CONFIG_PPC_BOOK3S_64 */
@@ -986,6 +987,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
986#ifdef CONFIG_KVM_BOOK3S_64_HV 987#ifdef CONFIG_KVM_BOOK3S_64_HV
987 case KVM_ALLOCATE_RMA: { 988 case KVM_ALLOCATE_RMA: {
988 struct kvm_allocate_rma rma; 989 struct kvm_allocate_rma rma;
990 struct kvm *kvm = filp->private_data;
989 991
990 r = kvm_vm_ioctl_allocate_rma(kvm, &rma); 992 r = kvm_vm_ioctl_allocate_rma(kvm, &rma);
991 if (r >= 0 && copy_to_user(argp, &rma, sizeof(rma))) 993 if (r >= 0 && copy_to_user(argp, &rma, sizeof(rma)))
@@ -1030,6 +1032,12 @@ long kvm_arch_vm_ioctl(struct file *filp,
1030 r = -EFAULT; 1032 r = -EFAULT;
1031 break; 1033 break;
1032 } 1034 }
1035 case KVM_PPC_RTAS_DEFINE_TOKEN: {
1036 struct kvm *kvm = filp->private_data;
1037
1038 r = kvm_vm_ioctl_rtas_define_token(kvm, argp);
1039 break;
1040 }
1033#endif /* CONFIG_PPC_BOOK3S_64 */ 1041#endif /* CONFIG_PPC_BOOK3S_64 */
1034 default: 1042 default:
1035 r = -ENOTTY; 1043 r = -ENOTTY;