[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] kvm: Add ioeventfd read test code
From: |
Amey Narkhede |
Subject: |
[PATCH 2/2] kvm: Add ioeventfd read test code |
Date: |
Tue, 20 Oct 2020 22:30:56 +0530 |
This patch adds kvm_set_ioeventfd_read and
dummy_notifier_read functons to test ioeventfd
read support. When the guess writes to address
provided in kvm_set_ioeventfd_read function,
dummy_notifier_read prints to stdio.
Signed-off-by: Amey Narkhede <ameynarkhede03@gmail.com>
---
accel/kvm/kvm-all.c | 55 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index 9ef5daf4c5..357e74d84c 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -1006,6 +1006,43 @@ static uint32_t adjust_ioeventfd_endianness(uint32_t
val, uint32_t size)
return val;
}
+static void dummy_notifier_read(EventNotifier *n)
+{
+ printf("Received ioeventfd read event\n");
+ event_notifier_test_and_clear(n);
+}
+
+static int kvm_set_ioeventfd_read(int fd, hwaddr addr, uint64_t val,
+ uint64_t size, bool datamatch)
+{
+ int ret;
+ struct kvm_ioeventfd ioevent = {
+ .datamatch = datamatch ? adjust_ioeventfd_endianness(val, size)
: 0,
+ .dataread = val,
+ .addr = addr,
+ .len = size,
+ .flags = KVM_IOEVENTFD_FLAG_DATAREAD,
+ .fd = fd,
+ };
+
+ if (!kvm_enabled()) {
+ return -ENOSYS;
+ }
+
+ if (datamatch) {
+ ioevent.flags |= KVM_IOEVENTFD_FLAG_DATAMATCH;
+ }
+
+ ret = kvm_vm_ioctl(kvm_state, KVM_IOEVENTFD, &ioevent);
+
+ if (ret < 0) {
+ return -errno;
+ }
+
+ return 0;
+}
+
+
static int kvm_set_ioeventfd_mmio(int fd, hwaddr addr, uint32_t val,
bool assign, uint32_t size, bool datamatch)
{
@@ -2012,6 +2049,7 @@ static int kvm_init(MachineState *ms)
KVMState *s;
const KVMCapabilityInfo *missing_cap;
int ret;
+ int efd = -1;
int type = 0;
const char *kvm_type;
uint64_t dirty_log_manual_caps;
@@ -2253,6 +2291,22 @@ static int kvm_init(MachineState *ms)
}
cpus_register_accel(&kvm_cpus);
+
+ EventNotifier *e = g_malloc0(sizeof(EventNotifier));
+ ret = event_notifier_init(e, false);
+ if (ret < 0) {
+ printf("Failed to initialize EventNotifier\n");
+ }
+ else {
+ AioContext *ctx = qemu_get_aio_context();
+ efd = event_notifier_get_fd(e);
+ aio_set_event_notifier(ctx, e, false, dummy_notifier_read, NULL);
+ ret = kvm_set_ioeventfd_read(efd, 0xff01003f, 123, 8, false);
+ if (ret < 0)
+ printf("ioeventfd read failed\n");
+ }
+
+
return 0;
err:
@@ -2268,6 +2322,7 @@ err:
return ret;
}
+
void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len)
{
s->sigmask_len = sigmask_len;
--
2.28.0