Index: xen-unstable.hg/xen/arch/ia64/vmx/vmx_init.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/vmx/vmx_init.c	2007-12-05 10:42:47.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/vmx/vmx_init.c	2007-12-05 10:42:51.000000000 +0900
@@ -117,6 +117,7 @@ vmx_init_env(void)
 	if (!vm_buffer) {
 		vm_buffer = (unsigned long)alloc_xenheap_pages(vm_order);
 		ASSERT(vm_buffer);
+		vm_buffer = virt_to_xenva((vm_buffer));
 		printk("vm_buffer: 0x%lx\n", vm_buffer);
 	}
 
@@ -162,6 +163,7 @@ static vpd_t *alloc_vpd(void)
 		printk("VPD allocation failed.\n");
 		return NULL;
 	}
+	vpd = (vpd_t *)virt_to_xenva(vpd);
 
 	printk(XENLOG_DEBUG "vpd base: 0x%p, vpd size:%ld\n",
 	       vpd, sizeof(vpd_t));
Index: xen-unstable.hg/xen/include/asm-ia64/linux-xen/asm/io.h
===================================================================
--- xen-unstable.hg.orig/xen/include/asm-ia64/linux-xen/asm/io.h	2007-12-05 10:42:46.000000000 +0900
+++ xen-unstable.hg/xen/include/asm-ia64/linux-xen/asm/io.h	2007-12-05 10:42:51.000000000 +0900
@@ -82,6 +82,8 @@ extern unsigned int num_io_spaces;
 #include <asm/system.h>
 #include <asm-generic/iomap.h>
 
+
+#ifndef XEN
 /*
  * Change virtual addresses to physical addresses and vv.
  */
@@ -90,6 +92,7 @@ virt_to_maddr (volatile void *address)
 {
 	return (unsigned long) address - PAGE_OFFSET;
 }
+#endif
 
 static inline void*
 maddr_to_virt (unsigned long address)
@@ -97,6 +100,7 @@ maddr_to_virt (unsigned long address)
 	return (void *) (address + PAGE_OFFSET);
 }
 
+
 #define ARCH_HAS_VALID_PHYS_ADDR_RANGE
 extern int valid_phys_addr_range (unsigned long addr, size_t *count); /* efi.c */
 
Index: xen-unstable.hg/xen/include/asm-ia64/xenpage.h
===================================================================
--- xen-unstable.hg.orig/xen/include/asm-ia64/xenpage.h	2007-12-05 10:42:46.000000000 +0900
+++ xen-unstable.hg/xen/include/asm-ia64/xenpage.h	2007-12-05 10:42:51.000000000 +0900
@@ -1,14 +1,13 @@
 #ifndef _ASM_IA64_XENPAGE_H
 #define _ASM_IA64_XENPAGE_H
 
+#ifndef __ASSEMBLY__
 #undef mfn_valid
 #undef page_to_mfn
 #undef mfn_to_page
 #ifdef CONFIG_VIRTUAL_FRAME_TABLE
 #undef ia64_mfn_valid
-#ifndef __ASSEMBLY__
 extern int ia64_mfn_valid (unsigned long pfn);
-#endif
 # define mfn_valid(_pfn)	(((_pfn) < max_page) && ia64_mfn_valid(_pfn))
 #else
 # define mfn_valid(_pfn)	((_pfn) < max_page)
@@ -16,10 +15,24 @@ extern int ia64_mfn_valid (unsigned long
 # define page_to_mfn(_page)	((unsigned long) ((_page) - frame_table))
 # define mfn_to_page(_pfn)	(frame_table + (_pfn))
 
+
+#include <asm/xensystem.h>
+
+static inline unsigned long __virt_to_maddr(unsigned long va)
+{
+	if (va - KERNEL_START < xenheap_size)
+		return xen_pstart + (va - KERNEL_START);
+	else
+		return (va & ((1UL << 60) - 1));
+}
+
+#define virt_to_maddr(va)	(__virt_to_maddr((unsigned long)va))
+
+
 #undef page_to_maddr
 #undef virt_to_page
 #define page_to_maddr(page)	(page_to_mfn(page) << PAGE_SHIFT)
-#define virt_to_page(kaddr)	mfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
+#define virt_to_page(kaddr)	(mfn_to_page(virt_to_maddr(kaddr) >> PAGE_SHIFT))
 
 #define page_to_virt(_page)	maddr_to_virt(page_to_maddr(_page))
 #define maddr_to_page(kaddr)	mfn_to_page(((kaddr) >> PAGE_SHIFT))
@@ -28,7 +41,6 @@ extern int ia64_mfn_valid (unsigned long
 #define virt_to_mfn(va)		(virt_to_maddr(va) >> PAGE_SHIFT)
 #define mfn_to_virt(mfn)	maddr_to_virt(mfn << PAGE_SHIFT)
 
-#ifndef __ASSEMBLY__
 typedef union xen_va {
 	struct {
 		unsigned long off : 60;
@@ -63,14 +75,18 @@ static inline int get_order_from_shift(u
     else
 	return shift - PAGE_SHIFT;
 }
-#endif
+/* from identity va to xen va */
+#define virt_to_xenva(va)	((unsigned long)va - PAGE_OFFSET - \
+				 xen_pstart + KERNEL_START)
+
 
 #undef __pa
 #undef __va
-#define __pa(x)		({xen_va _v; _v.l = (long) (x); _v.f.reg = 0; _v.l;})
+#define __pa(x)		(virt_to_maddr(x))
 #define __va(x)		({xen_va _v; _v.l = (long) (x); _v.f.reg = -1; _v.p;})
 
 /* It is sometimes very useful to have unsigned long as result.  */
 #define __va_ul(x)	({xen_va _v; _v.l = (long) (x); _v.f.reg = -1; _v.l;})
 
+#endif
 #endif /* _ASM_IA64_XENPAGE_H */
