[Xen-ia64-devel] Re: [Xen-devel] [PATCH] Fix ia64 HVM boot failure.

2009-04-14 Thread Ian Jackson
Isaku Yamahata writes (Re: [Xen-devel] [PATCH] Fix ia64 HVM boot failure.):
 Can you please commit this?

I applied it to my tree on Friday but it was held waiting for the
3.4.0 rc1 so I've just pushed it.  It should be in staging now and
hopefully the tests will pass and it will make it to the main tree; if
not it will definitely be in rc2 anyway.

Thanks,
Ian.

___
Xen-ia64-devel mailing list
Xen-ia64-devel@lists.xensource.com
http://lists.xensource.com/xen-ia64-devel


[Xen-ia64-devel] Re: [Xen-devel] [PATCH] Fix ia64 HVM boot failure.

2009-04-13 Thread Isaku Yamahata
Hi IanJ.

Can you please commit this?
Or is there any issues to commit the patch?

Without this patch, HVM domain doesn't boot on ia64.
My previous patch only fixed compilation error, so
this patch is necessary for 3.4 release.

thanks,

On Tue, Apr 07, 2009 at 05:19:55PM +0800, Zhang, Xiantao wrote:
 For Non-MAPCACHE case, to get the virtual address corresponding to guest 
 physical address, only an offset value is added to guest physical address.
 With this patch, ia64 HVM boot failure bug can be fixed. 
 Xiantao
 
 
 From 2b766d9ad3c6cb8c0e2a41976108b8a28416ecbb Mon Sep 17 00:00:00 2001
 From: Xiantao Zhang xiantao.zh...@intel.com
 Date: Tue, 7 Apr 2009 17:07:36 +0800
 Subject: [PATCH] For non-mapcache case, only need to use phys_ram_addr
 to get host virtual address correponsidng to guest
 physical address.
 
 Signed-off-by: Xiantao Zhang xiantao.zh...@intel.com
 ---
  hw/xen_machine_fv.c |9 ++
  i386-dm/exec-dm.c   |   77 +-
  qemu-xen.h  |   10 --
  3 files changed, 18 insertions(+), 78 deletions(-)
 
 diff --git a/hw/xen_machine_fv.c b/hw/xen_machine_fv.c
 index cbd32c7..a5292c1 100644
 --- a/hw/xen_machine_fv.c
 +++ b/hw/xen_machine_fv.c
 @@ -256,6 +256,15 @@ void qemu_invalidate_map_cache(void)
  
  mapcache_unlock();
  }
 +#else
 +uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, uint8_t lock)
 +{
 + return phys_ram_addr(phys_addr);
 +}
 +
 +void qemu_invalidate_map_cache(void) {};
 +
 +void qemu_invalidate_entry(uint8_t *buffer) {};
  
  #endif /* defined(MAPCACHE) */
  
 diff --git a/i386-dm/exec-dm.c b/i386-dm/exec-dm.c
 index 40c8868..daf5f56 100644
 --- a/i386-dm/exec-dm.c
 +++ b/i386-dm/exec-dm.c
 @@ -453,12 +453,6 @@ void unregister_iomem(target_phys_addr_t start)
  }
  
  
 -#if defined(__i386__) || defined(__x86_64__)
 -#define phys_ram_addr(x) (qemu_map_cache(x, 0))
 -#elif defined(__ia64__)
 -#define phys_ram_addr(x) (((x)  ram_size) ? (phys_ram_base + (x)) : NULL)
 -#endif
 -
  unsigned long *logdirty_bitmap;
  unsigned long logdirty_bitmap_size;
  
 @@ -795,7 +789,6 @@ static void cpu_notify_map_clients(void)
  }
  }
  
 -#ifdef MAPCACHE
  /* Map a physical memory region into a host virtual address.
   * May map a subset of the requested range, given by and returned in *plen.
   * May return NULL if resources needed to perform the mapping are exhausted.
 @@ -807,9 +800,11 @@ void *cpu_physical_memory_map(target_phys_addr_t addr,
target_phys_addr_t *plen,
int is_write)
  {
 +#ifdef MAPCACHE
  unsigned long l = MCACHE_BUCKET_SIZE - (addr  (MCACHE_BUCKET_SIZE-1));
  if ((*plen)  l)
  *plen = l;
 +#endif
  return qemu_map_cache(addr, 1);
  }
  
 @@ -822,71 +817,3 @@ void cpu_physical_memory_unmap(void *buffer, 
 target_phys_addr_t len,
  {
  qemu_invalidate_entry(buffer);
  }
 -#else
 -/* Map a physical memory region into a host virtual address.
 - * May map a subset of the requested range, given by and returned in *plen.
 - * May return NULL if resources needed to perform the mapping are exhausted.
 - * Use only for reads OR writes - not for read-modify-write operations.
 - * Use cpu_register_map_client() to know when retrying the map operation is
 - * likely to succeed.
 - */
 -void *cpu_physical_memory_map(target_phys_addr_t addr,
 -  target_phys_addr_t *plen,
 -  int is_write)
 -{
 -target_phys_addr_t len = *plen;
 -target_phys_addr_t done = 0;
 -int l;
 -uint8_t *ret = NULL;
 -uint8_t *ptr;
 -target_phys_addr_t page;
 -PhysPageDesc *p;
 -unsigned long addr1;
 -
 -while (len  0) {
 -page = addr  TARGET_PAGE_MASK;
 -l = (page + TARGET_PAGE_SIZE) - addr;
 -if (l  len)
 -l = len;
 -
 -if (done || bounce.buffer) {
 -break;
 -}
 - bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, TARGET_PAGE_SIZE);
 -bounce.addr = addr;
 -bounce.len = l;
 -if (!is_write) {
 -cpu_physical_memory_rw(addr, bounce.buffer, l, 0);
 -}
 -ptr = bounce.buffer;
 -
 -if (!done) {
 -ret = ptr;
 -} else if (ret + done != ptr) {
 -break;
 -}
 -
 -len -= l;
 -addr += l;
 -done += l;
 -}
 -*plen = done;
 -return ret;
 -}
 -
 -/* Unmaps a memory region previously mapped by cpu_physical_memory_map().
 - * Will also mark the memory as dirty if is_write == 1.  access_len gives
 - * the amount of memory that was actually read or written by the caller.
 - */
 -void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
 -   int is_write, target_phys_addr_t access_len)
 -{
 -assert(buffer == bounce.buffer);
 -if (is_write) {
 -cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len);
 -}
 -