qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v3 1/3] memory: add a memory API about ioeventfd for


From: zanghongyong
Subject: [Qemu-devel] [PATCH v3 1/3] memory: add a memory API about ioeventfd for PIO long
Date: Tue, 13 Dec 2011 09:42:46 +0800

From: Hongyong Zang <address@hidden>

The new memory API, named kvm_set_ioeventfd_pio_long, is about ioeventfd for 
PIO long.

Signed-off-by: Hongyong Zang <address@hidden>
---
 kvm-all.c  |   23 +++++++++++++++++++++++
 kvm-stub.c |    5 +++++
 kvm.h      |    1 +
 memory.c   |   20 ++++++++++++++++----
 4 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/kvm-all.c b/kvm-all.c
index 4c466d6..4614c5d 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1365,6 +1365,29 @@ int kvm_set_ioeventfd_mmio_long(int fd, uint32_t addr, 
uint32_t val, bool assign
     return 0;
 }
 
+int kvm_set_ioeventfd_pio_long(int fd, uint32_t addr, uint32_t val, bool 
assign)
+{
+    struct kvm_ioeventfd kick = {
+        .datamatch = val,
+        .addr = addr,
+        .len = 4,
+        .flags = KVM_IOEVENTFD_FLAG_DATAMATCH | KVM_IOEVENTFD_FLAG_PIO,
+        .fd = fd,
+    };
+    int r;
+    if (!kvm_enabled()) {
+        return -ENOSYS;
+    }
+    if (!assign) {
+        kick.flags |= KVM_IOEVENTFD_FLAG_DEASSIGN;
+    }
+    r = kvm_vm_ioctl(kvm_state, KVM_IOEVENTFD, &kick);
+    if (r < 0) {
+        return r;
+    }
+    return 0;
+}
+
 int kvm_set_ioeventfd_pio_word(int fd, uint16_t addr, uint16_t val, bool 
assign)
 {
     struct kvm_ioeventfd kick = {
diff --git a/kvm-stub.c b/kvm-stub.c
index 06064b9..64cdd7c 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -115,6 +115,11 @@ int kvm_set_ioeventfd_pio_word(int fd, uint16_t addr, 
uint16_t val, bool assign)
     return -ENOSYS;
 }
 
+int kvm_set_ioeventfd_pio_long(int fd, uint32_t adr, uint32_t val, bool assign)
+{
+    return -ENOSYS;
+}
+
 int kvm_set_ioeventfd_mmio_long(int fd, uint32_t adr, uint32_t val, bool 
assign)
 {
     return -ENOSYS;
diff --git a/kvm.h b/kvm.h
index 243b063..64b1737 100644
--- a/kvm.h
+++ b/kvm.h
@@ -195,5 +195,6 @@ int kvm_physical_memory_addr_from_ram(KVMState *s, 
ram_addr_t ram_addr,
 #endif
 int kvm_set_ioeventfd_mmio_long(int fd, uint32_t adr, uint32_t val, bool 
assign);
 
+int kvm_set_ioeventfd_pio_long(int fd, uint32_t adr, uint32_t val, bool 
assign);
 int kvm_set_ioeventfd_pio_word(int fd, uint16_t adr, uint16_t val, bool 
assign);
 #endif
diff --git a/memory.c b/memory.c
index adfdf14..544c955 100644
--- a/memory.c
+++ b/memory.c
@@ -480,10 +480,16 @@ static void as_io_ioeventfd_add(AddressSpace *as, 
MemoryRegionIoeventfd *fd)
 {
     int r;
 
-    assert(fd->match_data && int128_get64(fd->addr.size) == 2);
-
-    r = kvm_set_ioeventfd_pio_word(fd->fd, int128_get64(fd->addr.start),
+    assert(fd->match_data && (int128_get64(fd->addr.size) == 2 ||
+                              int128_get64(fd->addr.size) == 4));
+    if(int128_get64(fd->addr.size) == 2) {
+        r = kvm_set_ioeventfd_pio_word(fd->fd, int128_get64(fd->addr.start),
+                                   fd->data, true);
+    }
+    else {
+        r = kvm_set_ioeventfd_pio_long(fd->fd, int128_get64(fd->addr.start),
                                    fd->data, true);
+    }
     if (r < 0) {
         abort();
     }
@@ -493,8 +499,14 @@ static void as_io_ioeventfd_del(AddressSpace *as, 
MemoryRegionIoeventfd *fd)
 {
     int r;
 
-    r = kvm_set_ioeventfd_pio_word(fd->fd, int128_get64(fd->addr.start),
+    if(int128_get64(fd->addr.size) == 2) {
+        r = kvm_set_ioeventfd_pio_word(fd->fd, int128_get64(fd->addr.start),
                                    fd->data, false);
+    }
+    else {
+        r = kvm_set_ioeventfd_pio_long(fd->fd, int128_get64(fd->addr.start),
+                                   fd->data, false);
+    }
     if (r < 0) {
         abort();
     }
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]