Subject: qemu: use new (replacement) mmap-batch ioctl Signed-off-by: Jan Beulich --- 2010-01-06.orig/qemu/hw/xen_common.h 2009-01-27 08:32:14.000000000 +0100 +++ 2010-01-06/qemu/hw/xen_common.h 2010-01-08 17:19:07.000000000 +0100 @@ -30,5 +30,10 @@ # define xen_rmb() rmb() # define xen_wmb() wmb() #endif +#if __XEN_LATEST_INTERFACE_VERSION__ < 0x0003020a +void * __attribute__((__weak__)) +xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot, + const xen_pfn_t *, int *err, unsigned int num); +#endif #endif /* QEMU_HW_XEN_COMMON_H */ --- 2010-01-06.orig/qemu/hw/xen_machine_fv.c 2009-05-19 16:24:10.000000000 +0200 +++ 2010-01-06/qemu/hw/xen_machine_fv.c 2010-01-08 17:24:10.000000000 +0100 @@ -109,6 +109,34 @@ static void qemu_remap_bucket(struct map for (i = 0; i < MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT; i++) pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-XC_PAGE_SHIFT)) + i; + if (xc_map_foreign_bulk != NULL) { + int err[MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT]; + + vaddr_base = xc_map_foreign_bulk(xc_handle, domid, + PROT_READ|PROT_WRITE, pfns, err, + MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT); + if (vaddr_base == NULL) { + fprintf(logfile, "xc_map_foreign_bulk error %d\n", errno); + exit(-1); + } + + entry->vaddr_base = vaddr_base; + entry->paddr_index = address_index; + + for (i = 0; i < MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT; + i += BITS_PER_LONG) { + unsigned long word = 0; + j = ((i + BITS_PER_LONG) > (MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT)) ? + (MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT) % BITS_PER_LONG : + BITS_PER_LONG; + while (j > 0) + word = (word << 1) | !err[i + --j]; + entry->valid_mapping[i / BITS_PER_LONG] = word; + } + + return; + } + vaddr_base = xc_map_foreign_batch(xc_handle, domid, PROT_READ|PROT_WRITE, pfns, MCACHE_BUCKET_SIZE >> XC_PAGE_SHIFT); if (vaddr_base == NULL) { @@ -347,11 +375,11 @@ static void xen_init_fv(ram_addr_t ram_s (STORE_PAGE_START >> XC_PAGE_SHIFT); } - phys_ram_base = xc_map_foreign_batch(xc_handle, domid, + phys_ram_base = xc_map_foreign_pages(xc_handle, domid, PROT_READ|PROT_WRITE, page_array, nr_pages); if (phys_ram_base == 0) { - fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno); + fprintf(logfile, "xc_map_foreign_pages returned error %d\n", errno); exit(-1); } free(page_array);