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] [qemu patches] Update patches upto change

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [qemu patches] Update patches upto changeset 12814:c3ad3fcfe3.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 08 Dec 2006 21:40:39 +0000
Delivery-date: Fri, 08 Dec 2006 13:40:09 -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 Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
# Node ID 1ad7dff99968ae1d801900854e1a418630f06c21
# Parent  c3ad3fcfe364292eb700e7907cfc18fc4469a1b8
[qemu patches] Update patches upto changeset 12814:c3ad3fcfe3.

Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
---
 tools/ioemu/patches/domain-timeoffset             |    8 -
 tools/ioemu/patches/series                        |    2 
 tools/ioemu/patches/tpm-tis-device                |   12 -
 tools/ioemu/patches/usb-mouse-tablet-status-check |  124 ++++++++++++++++++
 tools/ioemu/patches/xen-mapcache                  |  145 ++++++++++++++++++++++
 5 files changed, 279 insertions(+), 12 deletions(-)

diff -r c3ad3fcfe364 -r 1ad7dff99968 tools/ioemu/patches/domain-timeoffset
--- a/tools/ioemu/patches/domain-timeoffset     Fri Dec 08 18:31:01 2006 +0000
+++ b/tools/ioemu/patches/domain-timeoffset     Fri Dec 08 18:37:19 2006 +0000
@@ -1,7 +1,7 @@ Index: ioemu/hw/mc146818rtc.c
 Index: ioemu/hw/mc146818rtc.c
 ===================================================================
---- ioemu.orig/hw/mc146818rtc.c        2006-12-08 18:23:40.000000000 +0000
-+++ ioemu/hw/mc146818rtc.c     2006-12-08 18:23:46.000000000 +0000
+--- ioemu.orig/hw/mc146818rtc.c        2006-12-08 18:36:31.000000000 +0000
++++ ioemu/hw/mc146818rtc.c     2006-12-08 18:36:36.000000000 +0000
 @@ -178,10 +178,27 @@
      }
  }
@@ -46,8 +46,8 @@ Index: ioemu/hw/mc146818rtc.c
  static void rtc_copy_date(RTCState *s)
 Index: ioemu/hw/pc.c
 ===================================================================
---- ioemu.orig/hw/pc.c 2006-12-08 18:23:46.000000000 +0000
-+++ ioemu/hw/pc.c      2006-12-08 18:23:46.000000000 +0000
+--- ioemu.orig/hw/pc.c 2006-12-08 18:36:35.000000000 +0000
++++ ioemu/hw/pc.c      2006-12-08 18:36:36.000000000 +0000
 @@ -159,7 +159,7 @@
  }
  
@@ -117,8 +117,8 @@ Index: ioemu/hw/pc.c
  QEMUMachine pc_machine = {
 Index: ioemu/vl.c
 ===================================================================
---- ioemu.orig/vl.c    2006-12-08 18:23:46.000000000 +0000
-+++ ioemu/vl.c 2006-12-08 18:23:46.000000000 +0000
+--- ioemu.orig/vl.c    2006-12-08 18:36:35.000000000 +0000
++++ ioemu/vl.c 2006-12-08 18:36:36.000000000 +0000
 @@ -163,6 +163,8 @@
  
  int xc_handle;
@@ -174,8 +174,8 @@ Index: ioemu/vl.c
      if (usb_enabled) {
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-12-08 18:23:46.000000000 +0000
-+++ ioemu/vl.h 2006-12-08 18:23:46.000000000 +0000
+--- ioemu.orig/vl.h    2006-12-08 18:36:35.000000000 +0000
++++ ioemu/vl.h 2006-12-08 18:36:36.000000000 +0000
 @@ -576,7 +576,7 @@
                                   int boot_device,
               DisplayState *ds, const char **fd_filename, int snapshot,
diff -r c3ad3fcfe364 -r 1ad7dff99968 tools/ioemu/patches/series
--- a/tools/ioemu/patches/series        Fri Dec 08 18:31:01 2006 +0000
+++ b/tools/ioemu/patches/series        Fri Dec 08 18:37:19 2006 +0000
@@ -67,3 +67,5 @@ vnc-monitor-shift-key-processing
 vnc-monitor-shift-key-processing
 ide-error-reporting
 vnc-numpad-handling
+xen-mapcache -p3
+usb-mouse-tablet-status-check -p3
diff -r c3ad3fcfe364 -r 1ad7dff99968 tools/ioemu/patches/tpm-tis-device
--- a/tools/ioemu/patches/tpm-tis-device        Fri Dec 08 18:31:01 2006 +0000
+++ b/tools/ioemu/patches/tpm-tis-device        Fri Dec 08 18:37:19 2006 +0000
@@ -22,8 +22,8 @@ Signed-off-by: Stefan Berger <stefanb@us
 
 Index: ioemu/Makefile.target
 ===================================================================
---- ioemu.orig/Makefile.target 2006-12-08 18:20:53.000000000 +0000
-+++ ioemu/Makefile.target      2006-12-08 18:21:18.000000000 +0000
+--- ioemu.orig/Makefile.target 2006-12-08 18:33:48.000000000 +0000
++++ ioemu/Makefile.target      2006-12-08 18:35:14.000000000 +0000
 @@ -369,6 +369,7 @@
  VL_OBJS+= piix4acpi.o
  VL_OBJS+= xenstore.o
@@ -34,8 +34,8 @@ Index: ioemu/Makefile.target
  ifeq ($(TARGET_BASE_ARCH), ppc)
 Index: ioemu/hw/pc.c
 ===================================================================
---- ioemu.orig/hw/pc.c 2006-12-08 18:20:52.000000000 +0000
-+++ ioemu/hw/pc.c      2006-12-08 18:21:18.000000000 +0000
+--- ioemu.orig/hw/pc.c 2006-12-08 18:33:47.000000000 +0000
++++ ioemu/hw/pc.c      2006-12-08 18:33:48.000000000 +0000
 @@ -875,6 +875,9 @@
          }
      }
@@ -49,8 +49,8 @@ Index: ioemu/hw/tpm_tis.c
 Index: ioemu/hw/tpm_tis.c
 ===================================================================
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ ioemu/hw/tpm_tis.c 2006-12-08 18:21:18.000000000 +0000
-@@ -0,0 +1,1114 @@
++++ ioemu/hw/tpm_tis.c 2006-12-08 18:35:25.000000000 +0000
+@@ -0,0 +1,1120 @@
 +/*
 + * tpm_tis.c - QEMU emulator for a 1.2 TPM with TIS interface
 + *
@@ -185,7 +185,7 @@ Index: ioemu/hw/tpm_tis.c
 +
 +
 +/* local prototypes */
-+static int TPM_Send(tpmState *s, tpmBuffer *buffer, char *msg);
++static int TPM_Send(tpmState *s, tpmBuffer *buffer, uint8_t locty, char *msg);
 +static int TPM_Receive(tpmState *s, tpmBuffer *buffer);
 +static uint32_t vtpm_instance_from_xenstore(void);
 +static void tis_poll_timer(void *opaque);
@@ -324,6 +324,8 @@ Index: ioemu/hw/tpm_tis.c
 +/*
 + * the 'write' method for sending requests to the vTPM
 + * four bytes with the vTPM instance number are prepended to each request
++ * the locality in which the command was sent is transmitted in the
++ * highest 3 bits
 + */
 +static int write_local_socket(tpmState *s, const tpmBuffer *buffer)
 +{
@@ -661,7 +663,7 @@ Index: ioemu/hw/tpm_tis.c
 +            }
 +        }
 +        if (val & STS_TPM_GO) {
-+            n = TPM_Send(s, &s->buffer,"tpm_data_write");
++            n = TPM_Send(s, &s->buffer, locty, "tpm_data_write");
 +            if (n > 0) {
 +                /* sending of data was successful */
 +                s->offset = 0;
@@ -968,7 +970,7 @@ Index: ioemu/hw/tpm_tis.c
 +/*
 + * Send a TPM request.
 + */
-+static int TPM_Send(tpmState *s, tpmBuffer *buffer, char *msg)
++static int TPM_Send(tpmState *s, tpmBuffer *buffer, uint8_t locty, char *msg)
 +{
 +    int len;
 +    uint32_t size = tpm_get_size_from_buffer(buffer->buf);
@@ -997,6 +999,10 @@ Index: ioemu/hw/tpm_tis.c
 +#ifdef DEBUG_TPM
 +    showBuff(buffer->buf, "To TPM");
 +#endif
++
++    /* transmit the locality in the highest 3 bits */
++    buffer->instance[0] &= 0x1f;
++    buffer->instance[0] |= (locty << 5);
 +
 +    len = vTPMTransmit[s->Transmitlayer].write(s, buffer);
 +    if (len < 0) {
@@ -1167,8 +1173,8 @@ Index: ioemu/hw/tpm_tis.c
 +}
 Index: ioemu/vl.h
 ===================================================================
---- ioemu.orig/vl.h    2006-12-08 18:20:53.000000000 +0000
-+++ ioemu/vl.h 2006-12-08 18:21:18.000000000 +0000
+--- ioemu.orig/vl.h    2006-12-08 18:33:48.000000000 +0000
++++ ioemu/vl.h 2006-12-08 18:35:14.000000000 +0000
 @@ -932,6 +932,10 @@
  void piix4_pm_init(PCIBus *bus, int devfn);
  void acpi_bios_init(void);
diff -r c3ad3fcfe364 -r 1ad7dff99968 
tools/ioemu/patches/usb-mouse-tablet-status-check
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/usb-mouse-tablet-status-check Fri Dec 08 18:37:19 
2006 +0000
@@ -0,0 +1,168 @@
+# HG changeset patch
+# User kfraser@xxxxxxxxxxxxxxxxxxxxx
+# Node ID 60bbcf799384d779c2a561b9d9ba30f28e31d970
+# Parent  fb3cb6f52a2905be938559529ae43b6ba990c878
+[HVM] qemu mouse: Adds support for USB mouse/tablet status check and
+restricts Universal Host Controller interrupt generating when received
+NAK in interrupt transfer.
+
+According to usb spec, USB mouse/tablet device returns NAK to host
+controller if its status does not alter in interrupt transfer.
+And UHC should leave a TD active when receiving NAK and execute this
+incompleted TD in a subseqent frame. UHC only generates an interrupt
+on complete after the TD with ICO bit is completed.
+
+This patch make UHC & USB mouse/tablet behave consistently with spec.
+
+Signed-off-by: Xinmei Huang <xinmei.huang@xxxxxxxxx>
+
+diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-hid.c
+--- a/tools/ioemu/hw/usb-hid.c Thu Dec 07 11:51:22 2006 +0000
++++ b/tools/ioemu/hw/usb-hid.c Thu Dec 07 11:52:26 2006 +0000
+@@ -39,6 +39,7 @@ typedef struct USBMouseState {
+     int x, y;
+     int kind;
+     int mouse_grabbed;
++    int status_changed;
+ } USBMouseState;
+ 
+ /* mostly the same values as the Bochs USB Mouse device */
+@@ -231,6 +232,7 @@ static void usb_mouse_event(void *opaque
+     s->dy += dy1;
+     s->dz += dz1;
+     s->buttons_state = buttons_state;
++    s->status_changed = 1;
+ }
+ 
+ static void usb_tablet_event(void *opaque,
+@@ -242,6 +244,7 @@ static void usb_tablet_event(void *opaqu
+     s->y = y;
+     s->dz += dz;
+     s->buttons_state = buttons_state;
++    s->status_changed = 1;
+ }
+ 
+ static inline int int_clamp(int val, int vmin, int vmax)
+@@ -483,10 +486,16 @@ static int usb_mouse_handle_data(USBDevi
+     switch(pid) {
+     case USB_TOKEN_IN:
+         if (devep == 1) {
+-          if (s->kind == USB_MOUSE)
+-              ret = usb_mouse_poll(s, data, len);
+-          else if (s->kind == USB_TABLET)
+-              ret = usb_tablet_poll(s, data, len);
++            if (s->kind == USB_MOUSE)
++                ret = usb_mouse_poll(s, data, len);
++            else if (s->kind == USB_TABLET)
++                ret = usb_tablet_poll(s, data, len);
++
++            if (!s->status_changed)
++                ret = USB_RET_NAK;
++            else
++                s->status_changed = 0;
++
+         } else {
+             goto fail;
+         }
+@@ -523,6 +532,7 @@ USBDevice *usb_tablet_init(void)
+     s->dev.handle_data = usb_mouse_handle_data;
+     s->dev.handle_destroy = usb_mouse_handle_destroy;
+     s->kind = USB_TABLET;
++    s->status_changed = 0;
+ 
+     pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet");
+ 
+@@ -544,6 +554,7 @@ USBDevice *usb_mouse_init(void)
+     s->dev.handle_data = usb_mouse_handle_data;
+     s->dev.handle_destroy = usb_mouse_handle_destroy;
+     s->kind = USB_MOUSE;
++    s->status_changed = 0;
+ 
+     pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse");
+ 
+diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-uhci.c
+--- a/tools/ioemu/hw/usb-uhci.c        Thu Dec 07 11:51:22 2006 +0000
++++ b/tools/ioemu/hw/usb-uhci.c        Thu Dec 07 11:52:26 2006 +0000
+@@ -424,12 +424,10 @@ static int uhci_handle_td(UHCIState *s, 
+     uint8_t buf[2048];
+     int len, max_len, err, ret;
+ 
+-    if (td->ctrl & TD_CTRL_IOC) {
+-        *int_mask |= 0x01;
+-    }
+-    
+-    if (!(td->ctrl & TD_CTRL_ACTIVE))
+-        return 1;
++    if (!(td->ctrl & TD_CTRL_ACTIVE)){
++        ret = 1;
++        goto out;
++    }
+ 
+     /* TD is active */
+     max_len = ((td->token >> 21) + 1) & 0x7ff;
+@@ -467,7 +465,8 @@ static int uhci_handle_td(UHCIState *s, 
+         /* invalid pid : frame interrupted */
+         s->status |= UHCI_STS_HCPERR;
+         uhci_update_irq(s);
+-        return -1;
++        ret = -1;
++        goto out;
+     }
+     if (td->ctrl & TD_CTRL_IOS)
+         td->ctrl &= ~TD_CTRL_ACTIVE;
+@@ -479,10 +478,12 @@ static int uhci_handle_td(UHCIState *s, 
+             len < max_len) {
+             *int_mask |= 0x02;
+             /* short packet: do not update QH */
+-            return 1;
++            ret = 1;
++            goto out;
+         } else {
+             /* success */
+-            return 0;
++            ret = 0;
++            goto out;
+         }
+     } else {
+         switch(ret) {
+@@ -501,23 +502,34 @@ static int uhci_handle_td(UHCIState *s, 
+             }
+             td->ctrl = (td->ctrl & ~(3 << TD_CTRL_ERROR_SHIFT)) | 
+                 (err << TD_CTRL_ERROR_SHIFT);
+-            return 1;
++            ret = 1;
++            goto out;
+         case USB_RET_NAK:
+             td->ctrl |= TD_CTRL_NAK;
+             if (pid == USB_TOKEN_SETUP)
+                 goto do_timeout;
+-            return 1;
++            ret = 1;
++            goto out;
+         case USB_RET_STALL:
+             td->ctrl |= TD_CTRL_STALL;
+             td->ctrl &= ~TD_CTRL_ACTIVE;
+-            return 1;
++            ret = 1;
++            goto out;
+         case USB_RET_BABBLE:
+             td->ctrl |= TD_CTRL_BABBLE | TD_CTRL_STALL;
+             td->ctrl &= ~TD_CTRL_ACTIVE;
+             /* frame interrupted */
+-            return -1;
+-        }
+-    }
++            ret = -1;
++            goto out;
++        }
++    }
++   
++out:
++    /* If TD is inactive and IOC bit set to 1 then update int_mask */ 
++    if ((td->ctrl & TD_CTRL_IOC) && (!(td->ctrl & TD_CTRL_ACTIVE))) {
++        *int_mask |= 0x01;
++    }
++    return ret;
+ }
+ 
+ static void uhci_frame_timer(void *opaque)
diff -r c3ad3fcfe364 -r 1ad7dff99968 tools/ioemu/patches/xen-mapcache
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/xen-mapcache  Fri Dec 08 18:37:19 2006 +0000
@@ -0,0 +1,300 @@
+# HG changeset patch
+# User kfraser@xxxxxxxxxxxxxxxxxxxxx
+# Node ID 67a06a9b7b1dca707e1cd3b08ae0a341d6e97b3d
+# Parent  3f0ca90351e268084fbdb733d70fc596cb46537d
+[HVM] qemu: Add guest address-space mapping cache.
+
+On IA32 host or IA32 PAE host, at present, generally, we can't create
+an HVM guest with more than 2G memory, because generally it's almost
+impossible for Qemu to find a large enough and consecutive virtual
+address space to map an HVM guest's whole physical address space.
+The attached patch fixes this issue using dynamic mapping based on
+little blocks of memory.
+
+Signed-off-by: Jun Nakajima <jun.nakajima@xxxxxxxxx>
+Signed-off-by: Dexuan Cui <dexuan.cui@xxxxxxxxx>
+Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
+
+diff -r 3f0ca90351e2 -r 67a06a9b7b1d tools/ioemu/target-i386-dm/cpu.h
+--- a/tools/ioemu/target-i386-dm/cpu.h Thu Dec 07 10:54:43 2006 +0000
++++ b/tools/ioemu/target-i386-dm/cpu.h Thu Dec 07 11:12:52 2006 +0000
+@@ -25,7 +25,8 @@
+ #ifdef TARGET_X86_64
+ #define TARGET_LONG_BITS 64
+ #else
+-#define TARGET_LONG_BITS 32
++/* #define TARGET_LONG_BITS 32 */
++#define TARGET_LONG_BITS 64 /* for Qemu map cache */
+ #endif
+ 
+ /* target supports implicit self modifying code */
+diff -r 3f0ca90351e2 -r 67a06a9b7b1d tools/ioemu/target-i386-dm/exec-dm.c
+--- a/tools/ioemu/target-i386-dm/exec-dm.c     Thu Dec 07 10:54:43 2006 +0000
++++ b/tools/ioemu/target-i386-dm/exec-dm.c     Thu Dec 07 11:12:52 2006 +0000
+@@ -36,6 +36,7 @@
+ 
+ #include "cpu.h"
+ #include "exec-all.h"
++#include "vl.h"
+ 
+ //#define DEBUG_TB_INVALIDATE
+ //#define DEBUG_FLUSH
+@@ -426,6 +427,12 @@ static inline int paddr_is_ram(target_ph
+ #endif
+ }
+ 
++#if defined(__i386__) || defined(__x86_64__)
++#define phys_ram_addr(x) (qemu_map_cache(x))
++#elif defined(__ia64__)
++#define phys_ram_addr(x) (phys_ram_base + (x))
++#endif
++
+ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, 
+                             int len, int is_write)
+ {
+@@ -438,7 +445,7 @@ void cpu_physical_memory_rw(target_phys_
+         l = TARGET_PAGE_SIZE - (addr & ~TARGET_PAGE_MASK); 
+         if (l > len)
+             l = len;
+-      
++
+         io_index = iomem_index(addr);
+         if (is_write) {
+             if (io_index) {
+@@ -460,9 +467,10 @@ void cpu_physical_memory_rw(target_phys_
+                 }
+             } else if (paddr_is_ram(addr)) {
+                 /* Reading from RAM */
+-                memcpy(phys_ram_base + addr, buf, l);
++                ptr = phys_ram_addr(addr);
++                memcpy(ptr, buf, l);
+ #ifdef __ia64__
+-                sync_icache((unsigned long)(phys_ram_base + addr), l);
++                sync_icache(ptr, l);
+ #endif 
+             }
+         } else {
+@@ -485,7 +493,8 @@ void cpu_physical_memory_rw(target_phys_
+                 }
+             } else if (paddr_is_ram(addr)) {
+                 /* Reading from RAM */
+-                memcpy(buf, phys_ram_base + addr, l);
++                ptr = phys_ram_addr(addr);
++                memcpy(buf, ptr, l);
+             } else {
+                 /* Neither RAM nor known MMIO space */
+                 memset(buf, 0xff, len); 
+diff -r 3f0ca90351e2 -r 67a06a9b7b1d tools/ioemu/vl.c
+--- a/tools/ioemu/vl.c Thu Dec 07 10:54:43 2006 +0000
++++ b/tools/ioemu/vl.c Thu Dec 07 11:12:52 2006 +0000
+@@ -5807,6 +5807,92 @@ int set_mm_mapping(int xc_handle, uint32
+ 
+     return 0;
+ }
++
++#if defined(__i386__) || defined(__x86_64__)
++static struct map_cache *mapcache_entry;
++static unsigned long nr_buckets;
++
++static int qemu_map_cache_init(unsigned long nr_pages)
++{
++    unsigned long max_pages = MAX_MCACHE_SIZE >> PAGE_SHIFT;
++    int i;
++
++    if (nr_pages < max_pages)
++        max_pages = nr_pages;
++
++    nr_buckets = (max_pages << PAGE_SHIFT) >> MCACHE_BUCKET_SHIFT;
++
++    fprintf(logfile, "qemu_map_cache_init nr_buckets = %lx\n", nr_buckets);
++
++    mapcache_entry = malloc(nr_buckets * sizeof(struct map_cache));
++    if (mapcache_entry == NULL) {
++        errno = ENOMEM;
++        return -1;
++    }
++
++    memset(mapcache_entry, 0, nr_buckets * sizeof(struct map_cache));
++
++    /*
++     * To avoid ENOMEM from xc_map_foreign_batch() at runtime, we
++     * pre-fill all the map caches in advance.
++     */
++    for (i = 0; i < nr_buckets; i++)
++       (void)qemu_map_cache(((target_phys_addr_t)i) << MCACHE_BUCKET_SHIFT);
++
++    return 0;
++}
++
++uint8_t *qemu_map_cache(target_phys_addr_t phys_addr)
++{
++    struct map_cache *entry;
++    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;
++
++    entry = &mapcache_entry[address_index % nr_buckets];
++
++    if (entry->vaddr_base == NULL || entry->paddr_index != address_index)
++    { 
++        /* We need to remap a bucket. */
++        uint8_t *vaddr_base;
++        unsigned long pfns[MCACHE_BUCKET_SIZE >> PAGE_SHIFT];
++        unsigned int i;
++
++        if (entry->vaddr_base != NULL) {
++            errno = munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE);
++            if (errno) {
++                fprintf(logfile, "unmap fails %d\n", errno);
++                exit(-1);
++            }
++        }
++
++        for (i = 0; i < MCACHE_BUCKET_SIZE >> PAGE_SHIFT; i++)
++            pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-PAGE_SHIFT)) + i;
++
++        vaddr_base = xc_map_foreign_batch(
++            xc_handle, domid, PROT_READ|PROT_WRITE,
++            pfns, MCACHE_BUCKET_SIZE >> PAGE_SHIFT);
++        if (vaddr_base == NULL) {
++            fprintf(logfile, "xc_map_foreign_batch error %d\n", errno);
++            exit(-1);
++        }
++
++        entry->vaddr_base  = vaddr_base;
++        entry->paddr_index = address_index;;
++    }
++
++    last_address_index = address_index;
++    last_address_vaddr = entry->vaddr_base;
++
++    return last_address_vaddr + address_offset;
++}
++#endif
+ 
+ int main(int argc, char **argv)
+ {
+@@ -6130,6 +6216,7 @@ int main(int argc, char **argv)
+                 break;
+             case QEMU_OPTION_m:
+                 ram_size = atol(optarg) * 1024 * 1024;
++                ram_size = (uint64_t)atol(optarg) * 1024 * 1024;
+                 if (ram_size <= 0)
+                     help();
+ #ifndef CONFIG_DM
+@@ -6400,50 +6487,41 @@ int main(int argc, char **argv)
+         shared_page_nr = nr_pages - 1;
+ #endif
+ 
++#if defined(__i386__) || defined(__x86_64__)
++
++    if ( qemu_map_cache_init(tmp_nr_pages) )
++    {
++        fprintf(logfile, "qemu_map_cache_init returned: error %d\n", errno);
++        exit(-1);
++    }
++
++    shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
++                                       PROT_READ|PROT_WRITE, shared_page_nr);
++    if (shared_page == NULL) {
++        fprintf(logfile, "map shared IO page returned error %d\n", errno);
++        exit(-1);
++    }
++
++    fprintf(logfile, "shared page at pfn:%lx\n", shared_page_nr);
++
++    buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
++                                            PROT_READ|PROT_WRITE,
++                                            shared_page_nr - 2);
++    if (buffered_io_page == NULL) {
++        fprintf(logfile, "map buffered IO page returned error %d\n", errno);
++        exit(-1);
++    }
++
++    fprintf(logfile, "buffered io page at pfn:%lx\n", shared_page_nr - 2);
++
++#elif defined(__ia64__)
++
+     page_array = (xen_pfn_t *)malloc(tmp_nr_pages * sizeof(xen_pfn_t));
+     if (page_array == NULL) {
+         fprintf(logfile, "malloc returned error %d\n", errno);
+         exit(-1);
+     }
+ 
+-#if defined(__i386__) || defined(__x86_64__)
+-    for ( i = 0; i < tmp_nr_pages; i++)
+-        page_array[i] = i;
+-
+-    phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
+-                                         PROT_READ|PROT_WRITE, page_array,
+-                                         tmp_nr_pages);
+-    if (phys_ram_base == NULL) {
+-        fprintf(logfile, "batch map guest memory returned error %d\n", errno);
+-        exit(-1);
+-    }
+-
+-    shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+-                                       PROT_READ|PROT_WRITE,
+-                                       page_array[shared_page_nr]);
+-    if (shared_page == NULL) {
+-        fprintf(logfile, "map shared IO page returned error %d\n", errno);
+-        exit(-1);
+-    }
+-
+-    fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n",
+-            shared_page_nr, (uint64_t)(page_array[shared_page_nr]));
+-
+-    buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+-                                            PROT_READ|PROT_WRITE,
+-                                            page_array[shared_page_nr - 2]);
+-    if (buffered_io_page == NULL) {
+-        fprintf(logfile, "map buffered IO page returned error %d\n", errno);
+-        exit(-1);
+-    }
+-
+-    fprintf(logfile, "buffered io page at pfn:%lx, mfn: %"PRIx64"\n",
+-            shared_page_nr - 2, (uint64_t)(page_array[shared_page_nr - 2]));
+-
+-    free(page_array);
+-
+-#elif defined(__ia64__)
+-  
+     if (xc_ia64_get_pfn_list(xc_handle, domid, page_array,
+                              IO_PAGE_START >> PAGE_SHIFT, 3) != 3) {
+         fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
+diff -r 3f0ca90351e2 -r 67a06a9b7b1d tools/ioemu/vl.h
+--- a/tools/ioemu/vl.h Thu Dec 07 10:54:43 2006 +0000
++++ b/tools/ioemu/vl.h Thu Dec 07 11:12:52 2006 +0000
+@@ -156,6 +156,26 @@ extern void *shared_vram;
+ 
+ extern FILE *logfile;
+ 
++
++#if defined(__i386__) || defined(__x86_64__)
++#if defined(__i386__) 
++#define MAX_MCACHE_SIZE    0x40000000 /* 1GB max for x86 */
++#define MCACHE_BUCKET_SHIFT 16
++#elif defined(__x86_64__)
++#define MAX_MCACHE_SIZE    0x1000000000 /* 64GB max for x86_64 */
++#define MCACHE_BUCKET_SHIFT 20
++#endif
++
++#define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT)
++
++struct map_cache {
++    unsigned long paddr_index;
++    uint8_t      *vaddr_base;
++};
++
++uint8_t *qemu_map_cache(target_phys_addr_t phys_addr);
++#endif
++
+ extern int xc_handle;
+ extern int domid;
+ 

_______________________________________________
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] [qemu patches] Update patches upto changeset 12814:c3ad3fcfe3., Xen patchbot-unstable <=