[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |