From patchwork Wed May 18 18:27:09 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 96213 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 2AA861007DA for ; Thu, 19 May 2011 04:25:25 +1000 (EST) Received: from localhost ([::1]:60761 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QMlQw-0002KX-2n for incoming@patchwork.ozlabs.org; Wed, 18 May 2011 14:25:22 -0400 Received: from eggs.gnu.org ([140.186.70.92]:51960) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QMlQj-0002KA-D9 for qemu-devel@nongnu.org; Wed, 18 May 2011 14:25:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QMlQi-0001uy-5r for qemu-devel@nongnu.org; Wed, 18 May 2011 14:25:09 -0400 Received: from smtp.ctxuk.citrix.com ([62.200.22.115]:1246 helo=SMTP.EU.CITRIX.COM) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QMlQh-0001sz-Sq for qemu-devel@nongnu.org; Wed, 18 May 2011 14:25:08 -0400 X-IronPort-AV: E=Sophos;i="4.65,232,1304294400"; d="scan'208";a="5829011" Received: from lonpmailmx01.citrite.net ([10.30.224.162]) by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5; 18 May 2011 18:25:05 +0000 Received: from kaball.uk.xensource.com (10.80.2.59) by LONPMAILMX01.citrite.net (10.30.224.162) with Microsoft SMTP Server id 8.3.137.0; Wed, 18 May 2011 19:25:05 +0100 Date: Wed, 18 May 2011 19:27:09 +0100 From: Stefano Stabellini X-X-Sender: sstabellini@kaball-desktop To: Stefan Weil In-Reply-To: <1305740441-17485-1-git-send-email-weil@mail.berlios.de> Message-ID: References: <1305740441-17485-1-git-send-email-weil@mail.berlios.de> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 62.200.22.115 Cc: Anthony Perard , QEMU Developers , Alexander Graf Subject: Re: [Qemu-devel] [PATCH] xen: Use conditional compilation for xen map cache (fixes w32 builds) X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org On Wed, 18 May 2011, Stefan Weil wrote: > The current implementation used stubs for systems without XEN. > This is unusual for QEMU and adds unneeded dependencies. > > MinGW32 for example does not provide munmap(), so the XEN > code creates compiler warnings (missing prototype). > Compilations without optimisation even result in linker > errors (missing function). > > Fix this by using conditional compilation. After a conversation on IRC with Stefan I found out that most of the problems are gone away after my recent "xen mapcache fixes and improvements" patch series. To completely solve the compilation issues with MinGW32 I just need to remove two includes from xen-mapcache.h, so I am appending an updated version of patch #3 "xen: remove xen_map_block and xen_unmap_block" to do just that. I have also pushed another git branch: git://xenbits.xen.org/people/sstabellini/qemu-dm.git mapcache_fixes_2 --- commit 8e1040ee219513d2c692f921f80e2d850aaa47c7 Author: Stefano Stabellini Date: Fri May 13 11:58:59 2011 +0000 xen: remove xen_map_block and xen_unmap_block Replace xen_map_block with qemu_map_cache with the appropriate locking and size parameters. Replace xen_unmap_block with qemu_invalidate_entry. Signed-off-by: Stefano Stabellini diff --git a/exec.c b/exec.c index 01498d2..21f21f0 100644 --- a/exec.c +++ b/exec.c @@ -54,6 +54,7 @@ #endif #else /* !CONFIG_USER_ONLY */ #include "xen-mapcache.h" +#include "trace.h" #endif //#define DEBUG_TB_INVALIDATE @@ -3068,7 +3069,7 @@ void *qemu_get_ram_ptr(ram_addr_t addr) if (block->offset == 0) { return qemu_map_cache(addr, 0, 1); } else if (block->host == NULL) { - block->host = xen_map_block(block->offset, block->length); + block->host = qemu_map_cache(block->offset, block->length, 1); } } return block->host + (addr - block->offset); @@ -3097,7 +3098,7 @@ void *qemu_safe_ram_ptr(ram_addr_t addr) if (block->offset == 0) { return qemu_map_cache(addr, 0, 1); } else if (block->host == NULL) { - block->host = xen_map_block(block->offset, block->length); + block->host = qemu_map_cache(block->offset, block->length, 1); } } return block->host + (addr - block->offset); @@ -3115,19 +3116,7 @@ void qemu_put_ram_ptr(void *addr) trace_qemu_put_ram_ptr(addr); if (xen_mapcache_enabled()) { - RAMBlock *block; - - QLIST_FOREACH(block, &ram_list.blocks, next) { - if (addr == block->host) { - break; - } - } - if (block && block->host) { - xen_unmap_block(block->host, block->length); - block->host = NULL; - } else { - qemu_invalidate_entry(addr); - } + qemu_invalidate_entry(block->host); } } diff --git a/xen-mapcache-stub.c b/xen-mapcache-stub.c index 60f712b..8a2380a 100644 --- a/xen-mapcache-stub.c +++ b/xen-mapcache-stub.c @@ -34,7 +34,3 @@ void qemu_invalidate_map_cache(void) void qemu_invalidate_entry(uint8_t *buffer) { } -uint8_t *xen_map_block(target_phys_addr_t phys_addr, target_phys_addr_t size) -{ - return NULL; -} diff --git a/xen-mapcache.c b/xen-mapcache.c index 57fe24d..fac47cd 100644 --- a/xen-mapcache.c +++ b/xen-mapcache.c @@ -362,34 +362,3 @@ void qemu_invalidate_map_cache(void) mapcache_unlock(); } - -uint8_t *xen_map_block(target_phys_addr_t phys_addr, target_phys_addr_t size) -{ - uint8_t *vaddr_base; - xen_pfn_t *pfns; - int *err; - unsigned int i; - target_phys_addr_t nb_pfn = size >> XC_PAGE_SHIFT; - - trace_xen_map_block(phys_addr, size); - phys_addr >>= XC_PAGE_SHIFT; - - pfns = qemu_mallocz(nb_pfn * sizeof (xen_pfn_t)); - err = qemu_mallocz(nb_pfn * sizeof (int)); - - for (i = 0; i < nb_pfn; i++) { - pfns[i] = phys_addr + i; - } - - vaddr_base = xc_map_foreign_bulk(xen_xc, xen_domid, PROT_READ|PROT_WRITE, - pfns, err, nb_pfn); - if (vaddr_base == NULL) { - perror("xc_map_foreign_bulk"); - exit(-1); - } - - qemu_free(pfns); - qemu_free(err); - - return vaddr_base; -} diff --git a/xen-mapcache.h b/xen-mapcache.h index b89b8f9..6216cc3 100644 --- a/xen-mapcache.h +++ b/xen-mapcache.h @@ -9,27 +9,12 @@ #ifndef XEN_MAPCACHE_H #define XEN_MAPCACHE_H -#include -#include "trace.h" - void qemu_map_cache_init(void); uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, uint8_t lock); ram_addr_t qemu_ram_addr_from_mapcache(void *ptr); void qemu_invalidate_entry(uint8_t *buffer); void qemu_invalidate_map_cache(void); -uint8_t *xen_map_block(target_phys_addr_t phys_addr, target_phys_addr_t size); - -static inline void xen_unmap_block(void *addr, ram_addr_t size) -{ - trace_xen_unmap_block(addr, size); - - if (munmap(addr, size) != 0) { - hw_error("xen_unmap_block: %s", strerror(errno)); - } -} - - #define mapcache_lock() ((void)0) #define mapcache_unlock() ((void)0)