qemu-kvm: add iosignalfd support
PATCH v3 1/1 qemu-kvm: add iosignalfd support
An iosignalfd allows an eventfd to attach to a specific PIO/MMIO region in the guest. Any guest-writes to that region will trigger an eventfd signal.
[
This userspace patch coorelates to the kvm.git patches, v5, which you can find here: http://lkml.org/lkml/2009/6/3/433, and are based on top of the irqfd userspace patches which have not yet been accepted upstream.
]
Signed-off-by Gregory Haskins <[email protected]>
---
kvm/libkvm/libkvm.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ kvm/libkvm/libkvm.h | 42 ++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 0 deletions(-)
kvm/libkvm/libkvm.c +68 -0
@@ -1493,3 +1493,71 @@ int kvm_irqfd(kvm_context_t kvm, int gsi, int flags) }#endif /* KVM_CAP_IRQFD */ + +#ifdef KVM_CAP_IOSIGNALFD + +#include <sys/eventfd.h> + +int kvm_assign_iosignalfd (kvm_context_t kvm,unsigned long addr,size_t len, +int fd,void *trigger,int flags) +{ +int r; +int type = flags &IOSIGNALFD_FLAG_PIO ; +struct kvm_iosignalfd data = { + .trigger = (__u64 )trigger, + .addr = addr, + .len = len, + .fd = fd, + }; + + data.flags |= trigger ?KVM_IOSIGNALFD_FLAG_TRIGGER :0 ; + data.flags |= type ?KVM_IOSIGNALFD_FLAG_PIO :0 ; + +if (!kvm_check_extension (kvm,KVM_CAP_IOSIGNALFD )) +return -ENOENT ; + + r =ioctl (kvm->vm_fd,KVM_IOSIGNALFD , &data); +if (r ==-1 ) + r = -errno; +return r; +} + +int kvm_deassign_iosignalfd (kvm_context_t kvm,unsigned long addr,int fd, +int flags) +{ +int r; +int type = flags &IOSIGNALFD_FLAG_PIO ; +struct kvm_iosignalfd data = { + .addr = addr, + .fd = fd, + .flags =KVM_IOSIGNALFD_FLAG_DEASSIGN | + (type ?KVM_IOSIGNALFD_FLAG_PIO :0 ), + }; + +if (!kvm_check_extension (kvm,KVM_CAP_IOSIGNALFD )) +return -ENOENT ; + + r =ioctl (kvm->vm_fd,KVM_IOSIGNALFD , &data); +if (r ==-1 ) + r = -errno; +return r; +} + +#else /* KVM_CAP_IOSIGNALFD */ + +int kvm_assign_iosignalfd (kvm_context_t kvm,unsigned long addr,size_t len, +int fd,void *trigger,int flags) +{ +return -ENOSYS ; +} + +int kvm_deassign_iosignalfd (kvm_context_t kvm,unsigned long addr,int fd, +int flags) +{ +return -ENOSYS ; +} + +#endif /* KVM_CAP_IOSIGNALFD */ + + +
kvm/libkvm/libkvm.h +42 -0
48 lines not on this page · raw message