# 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
|