Index: linux-2.6.18-mm3/arch/ia64/mm/init.c
===================================================================
--- linux-2.6.18-mm3.orig/arch/ia64/mm/init.c	2006-10-09 22:03:33.929731832 -0700
+++ linux-2.6.18-mm3/arch/ia64/mm/init.c	2006-10-10 10:23:20.946754455 -0700
@@ -408,6 +408,9 @@ ia64_mmu_init (void *my_cpu_data)
 }
 
 #ifdef CONFIG_VIRTUAL_MEM_MAP
+
+EXPORT_SYMBOL(mem_map);
+
 int vmemmap_find_next_valid_pfn(int node, int i)
 {
 	unsigned long end_address, hole_next_pfn;
Index: linux-2.6.18-mm3/include/asm-ia64/page.h
===================================================================
--- linux-2.6.18-mm3.orig/include/asm-ia64/page.h	2006-10-09 23:19:13.410082887 -0700
+++ linux-2.6.18-mm3/include/asm-ia64/page.h	2006-10-09 23:52:13.718587781 -0700
@@ -106,9 +106,9 @@ extern int ia64_pfn_valid (unsigned long
 #endif
 
 #ifdef CONFIG_VIRTUAL_MEM_MAP
-#define VMMAP ((struct page *)VIRTUAL_MEM_MAP)
-#define page_to_pfn(page) ((unsigned long) (page - VMMAP))
-#define pfn_to_page(pfn)	(VMMAP + (pfn))
+extern struct page mem_map[];
+#define page_to_pfn(page)	((unsigned long) (page - mem_map))
+#define pfn_to_page(pfn)	(mem_map + (pfn))
 #endif
 
 #if defined(CONFIG_FLATMEM) || defined(CONFIG_SPARSEMEM)
Index: linux-2.6.18-mm3/arch/ia64/kernel/vmlinux.lds
===================================================================
--- linux-2.6.18-mm3.orig/arch/ia64/kernel/vmlinux.lds	2006-10-09 23:48:46.420830837 -0700
+++ linux-2.6.18-mm3/arch/ia64/kernel/vmlinux.lds	2006-10-10 10:01:01.882892666 -0700
@@ -371,6 +371,22 @@
  * page-out routines.
  */
 /*
+ * Definitions to support various sizes of kernel pages
+ * that can be used to reduce TLB pressure.
+ *
+ * Supported lage page shifts and sizes are:
+ *
+ * 18(256k) 20(1M) 22(4M) 24(16M) 26(64M) 28(256M) 30(1GB)
+ */
+
+
+
+
+
+
+
+/* Extract various things from a VKP address */
+/*
  * Identity-mapped regions use a large page size.  We'll call such large pages
  * "granules".  If you can think of a better name that's unambiguous, let me
  * know...
@@ -430,7 +446,7 @@ SECTIONS
 
   v = (7<<(61)); /* this symbol is here to make debugging easier... */
   phys_start = _start - (((5<<(61))+0x100000000) - (1 << 26));
-  mem_map = 1;
+  mem_map = ((4<<(61)) + ((((20)-18) / 2 + 1) << ((((14 + ((14 -3))) + ((14 -3))) + ((14 -3))) + (14 -3) - 3)));
 
   code : { } :code
   . = ((5<<(61))+0x100000000);