Skip to contentSkip to conversation

qemu-kvm: add iosignalfd support

PATCH New Gregory Haskins 1 participant 1 message Jun 3, 2009 KVM

v3 of 10 New Latest is v10 →

lore
Share & tools
lore
#0 lore raw

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.
]

---

 kvm/libkvm/libkvm.c |   68 +++++++++++++++++++++++++++++++++++++++++++++++++++
 kvm/libkvm/libkvm.h |   42 ++++++++++++++++++++++++++++++++
 2 files changed, 110 insertions(+), 0 deletions(-)
kvm/libkvm/libkvm.c +68 -0
index 0ada15c..cb558fc 100644
@@ -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