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

[Xen-changelog] [xen-unstable] [qemu patches] Update patches upto changeset 12814:c3ad3fcfe3.



# 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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.