WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [HVM] Allow HVM guest to request invalida

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [HVM] Allow HVM guest to request invalidation of foreign mappings via
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 27 Jan 2007 13:00:33 -0800
Delivery-date: Sat, 27 Jan 2007 13:50:11 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxxx
# Date 1169904747 0
# Node ID d1710eb353855a5fac71e5507deb3d3a131a7de2
# Parent  271ffb1c12ebc1375386a41598a7b3ae72f16871
[HVM] Allow HVM guest to request invalidation of foreign mappings via
an I/O port write.
Signed-off-by: Dexuan Cui <dexuan.cui@xxxxxxxxx>
---
 tools/ioemu/hw/xen_platform.c                            |   11 +---
 tools/ioemu/target-i386-dm/exec-dm.c                     |   12 ----
 tools/ioemu/vl.c                                         |   38 +++++++++++++--
 tools/ioemu/vl.h                                         |   17 ++++++
 unmodified_drivers/linux-2.6/platform-pci/platform-pci.c |   10 +++
 5 files changed, 64 insertions(+), 24 deletions(-)

diff -r 271ffb1c12eb -r d1710eb35385 tools/ioemu/hw/xen_platform.c
--- a/tools/ioemu/hw/xen_platform.c     Fri Jan 26 18:38:40 2007 +0000
+++ b/tools/ioemu/hw/xen_platform.c     Sat Jan 27 13:32:27 2007 +0000
@@ -31,19 +31,14 @@ extern FILE *logfile;
 
 static void platform_ioport_write(void *opaque, uint32_t addr, uint32_t val)
 {
-    return;
-}
-
-static uint32_t platform_ioport_read(void *opaque, uint32_t addr)
-{
-    return 0;
+    if (val == 0)
+        qemu_invalidate_map_cache();
 }
 
 static void platform_ioport_map(PCIDevice *pci_dev, int region_num,
                                 uint32_t addr, uint32_t size, int type)
 {
-    register_ioport_write(addr, 16, 4, platform_ioport_write, NULL);
-    register_ioport_read(addr, 16, 1, platform_ioport_read, NULL);
+    register_ioport_write(addr, 1, 1, platform_ioport_write, NULL);
 }
 
 static uint32_t platform_mmio_read(void *opaque, target_phys_addr_t addr)
diff -r 271ffb1c12eb -r d1710eb35385 tools/ioemu/target-i386-dm/exec-dm.c
--- a/tools/ioemu/target-i386-dm/exec-dm.c      Fri Jan 26 18:38:40 2007 +0000
+++ b/tools/ioemu/target-i386-dm/exec-dm.c      Sat Jan 27 13:32:27 2007 +0000
@@ -129,18 +129,8 @@ int loglevel;
 int loglevel;
 
 
-#if defined(__i386__) || defined(__x86_64__)
-#define MAPCACHE
-#endif
-
 #ifdef MAPCACHE
-#include <pthread.h>
-static pthread_mutex_t mapcache_mutex;
-#define mapcache_lock() pthread_mutex_lock(&mapcache_mutex)
-#define mapcache_unlock() pthread_mutex_unlock(&mapcache_mutex)
-#else 
-#define mapcache_lock() ( (void)0 )
-#define mapcache_unlock() ( (void)0 )
+pthread_mutex_t mapcache_mutex;
 #endif
 
 
diff -r 271ffb1c12eb -r d1710eb35385 tools/ioemu/vl.c
--- a/tools/ioemu/vl.c  Fri Jan 26 18:38:40 2007 +0000
+++ b/tools/ioemu/vl.c  Sat Jan 27 13:32:27 2007 +0000
@@ -285,7 +285,7 @@ int register_ioport_write(int start, int
     for(i = start; i < start + length; i += size) {
         ioport_write_table[bsize][i] = func;
         if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
-            hw_error("register_ioport_read: invalid opaque");
+            hw_error("register_ioport_write: invalid opaque");
         ioport_opaque[i] = opaque;
     }
     return 0;
@@ -5826,6 +5826,10 @@ static struct map_cache *mapcache_entry;
 static struct map_cache *mapcache_entry;
 static unsigned long nr_buckets;
 
+/* For most cases (>99.9%), the page address is the same. */
+static unsigned long last_address_index = ~0UL;
+static uint8_t      *last_address_vaddr;
+
 static int qemu_map_cache_init(unsigned long nr_pages)
 {
     unsigned long max_pages = MAX_MCACHE_SIZE >> PAGE_SHIFT;
@@ -5862,10 +5866,6 @@ uint8_t *qemu_map_cache(target_phys_addr
     unsigned long address_index  = phys_addr >> MCACHE_BUCKET_SHIFT;
     unsigned long address_offset = phys_addr & (MCACHE_BUCKET_SIZE-1);
 
-    /* For most cases (>99.9%), the page address is the same. */
-    static unsigned long last_address_index = ~0UL;
-    static uint8_t      *last_address_vaddr;
-
     if (address_index == last_address_index)
         return last_address_vaddr + address_offset;
 
@@ -5904,6 +5904,34 @@ uint8_t *qemu_map_cache(target_phys_addr
     last_address_vaddr = entry->vaddr_base;
 
     return last_address_vaddr + address_offset;
+}
+
+void qemu_invalidate_map_cache(void)
+{
+    unsigned long i;
+
+    mapcache_lock();
+
+    for (i = 0; i < nr_buckets; i++) {
+        struct map_cache *entry = &mapcache_entry[i];
+
+        if (entry->vaddr_base == NULL)
+            continue;
+
+        errno = munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE);
+        if (errno) {
+            fprintf(logfile, "unmap fails %d\n", errno);
+            exit(-1);
+        }
+
+        entry->paddr_index = 0;
+        entry->vaddr_base  = NULL;
+    }
+
+    last_address_index =  ~0UL;
+    last_address_vaddr = NULL;
+
+    mapcache_unlock();
 }
 #endif
 
diff -r 271ffb1c12eb -r d1710eb35385 tools/ioemu/vl.h
--- a/tools/ioemu/vl.h  Fri Jan 26 18:38:40 2007 +0000
+++ b/tools/ioemu/vl.h  Sat Jan 27 13:32:27 2007 +0000
@@ -158,6 +158,9 @@ extern FILE *logfile;
 
 
 #if defined(__i386__) || defined(__x86_64__)
+
+#define MAPCACHE
+
 #if defined(__i386__) 
 #define MAX_MCACHE_SIZE    0x40000000 /* 1GB max for x86 */
 #define MCACHE_BUCKET_SHIFT 16
@@ -174,6 +177,20 @@ struct map_cache {
 };
 
 uint8_t *qemu_map_cache(target_phys_addr_t phys_addr);
+void     qemu_invalidate_map_cache(void);
+
+#include <pthread.h>
+extern  pthread_mutex_t mapcache_mutex;
+#define mapcache_lock() pthread_mutex_lock(&mapcache_mutex)
+#define mapcache_unlock() pthread_mutex_unlock(&mapcache_mutex)
+
+#else 
+
+#define qemu_invalidate_map_cache() ((void)0)
+
+#define mapcache_lock()   ((void)0)
+#define mapcache_unlock() ((void)0)
+
 #endif
 
 extern int xc_handle;
diff -r 271ffb1c12eb -r d1710eb35385 
unmodified_drivers/linux-2.6/platform-pci/platform-pci.c
--- a/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Fri Jan 26 
18:38:40 2007 +0000
+++ b/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c  Sat Jan 27 
13:32:27 2007 +0000
@@ -214,6 +214,14 @@ static uint64_t get_callback_via(struct 
 #endif
 }
 
+/* Invalidate foreign mappings (e.g., in qemu-based device model). */
+static uint16_t invlmap_port;
+void xen_invalidate_foreign_mappings(void)
+{
+       outb(0, invlmap_port);
+}
+EXPORT_SYMBOL(xen_invalidate_foreign_mappings);
+
 static int __devinit platform_pci_init(struct pci_dev *pdev,
                                       const struct pci_device_id *ent)
 {
@@ -238,6 +246,8 @@ static int __devinit platform_pci_init(s
                printk(KERN_WARNING DRV_NAME ":no resources found\n");
                return -ENOENT;
        }
+
+       invlmap_port = ioaddr;
 
        if (request_mem_region(mmio_addr, mmio_len, DRV_NAME) == NULL)
        {

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [HVM] Allow HVM guest to request invalidation of foreign mappings via, Xen patchbot-unstable <=