diff -Naur linux-2.6.25/arch/arm/boot/compressed/head.S linux-2.6.25.ep93xx/arch/arm/boot/compressed/head.S
--- linux-2.6.25/arch/arm/boot/compressed/head.S	2008-04-16 21:49:44.000000000 -0500
+++ linux-2.6.25.ep93xx/arch/arm/boot/compressed/head.S	2008-08-18 14:05:42.000000000 -0500
@@ -156,6 +156,10 @@
 		.text
 		adr	r0, LC0
 		ldmia	r0, {r1, r2, r3, r4, r5, r6, ip, sp}
+#ifdef CONFIG_RUNTIME_PHYS_OFFSET
+		and	r10, pc, #0xf0000000	@ fix up zreladdr
+		add	r4, r4, r10
+#endif		
 		subs	r0, r0, r1		@ calculate the delta offset
 
 						@ if delta is zero, we are
diff -Naur linux-2.6.25/arch/arm/boot/compressed/Makefile linux-2.6.25.ep93xx/arch/arm/boot/compressed/Makefile
--- linux-2.6.25/arch/arm/boot/compressed/Makefile	2008-04-16 21:49:44.000000000 -0500
+++ linux-2.6.25.ep93xx/arch/arm/boot/compressed/Makefile	2008-08-18 14:05:42.000000000 -0500
@@ -72,13 +72,10 @@
 EXTRA_CFLAGS  := -fpic -fno-builtin
 EXTRA_AFLAGS  :=
 
-# Supply ZRELADDR, INITRD_PHYS and PARAMS_PHYS to the decompressor via
-# linker symbols.  We only define initrd_phys and params_phys if the
-# machine class defined the corresponding makefile variable.
+# Supply ZRELADDR and PARAMS_PHYS to the decompressor via linker
+# symbols.  We only define params_phys if the machine class defined
+# the corresponding makefile variable.
 LDFLAGS_vmlinux := --defsym zreladdr=$(ZRELADDR)
-ifneq ($(INITRD_PHYS),)
-LDFLAGS_vmlinux += --defsym initrd_phys=$(INITRD_PHYS)
-endif
 ifneq ($(PARAMS_PHYS),)
 LDFLAGS_vmlinux += --defsym params_phys=$(PARAMS_PHYS)
 endif
diff -Naur linux-2.6.25/arch/arm/boot/compressed/misc.c linux-2.6.25.ep93xx/arch/arm/boot/compressed/misc.c
--- linux-2.6.25/arch/arm/boot/compressed/misc.c	2008-04-16 21:49:44.000000000 -0500
+++ linux-2.6.25.ep93xx/arch/arm/boot/compressed/misc.c	2008-08-22 09:52:32.000000000 -0500
@@ -322,7 +322,10 @@
 	bytes_out += (ulg)outcnt;
 	output_ptr += (ulg)outcnt;
 	outcnt = 0;
+    // GMB - ARM Quiet Boot
+#ifndef CONFIG_ARM_QUIET_BOOT
 	putstr(".");
+#endif
 }
 
 #ifndef arch_error
@@ -354,9 +357,14 @@
 	arch_decomp_setup();
 
 	makecrc();
+    // GMB - Remove serial console boot message.
+#ifndef CONFIG_ARM_QUIET_BOOT
 	putstr("Uncompressing Linux...");
+#endif
 	gunzip();
+#ifndef CONFIG_ARM_QUIET_BOOT
 	putstr(" done, booting the kernel.\n");
+#endif
 	return output_ptr;
 }
 #else
diff -Naur linux-2.6.25/arch/arm/kernel/setup.c linux-2.6.25.ep93xx/arch/arm/kernel/setup.c
--- linux-2.6.25/arch/arm/kernel/setup.c	2008-04-16 21:49:44.000000000 -0500
+++ linux-2.6.25.ep93xx/arch/arm/kernel/setup.c	2008-08-18 14:05:42.000000000 -0500
@@ -61,6 +61,16 @@
 extern int root_mountflags;
 extern void _stext, _text, _etext, __data_start, _edata, _end;
 
+#ifdef CONFIG_RUNTIME_PHYS_OFFSET
+/*
+ * The assignment is here solely to prevent this variable from ending
+ * up in bss.  As the early startup code writes to it, we don't want it
+ * to be zeroed again later.
+ */
+unsigned long phys_offset = 0xdeadbeef;
+EXPORT_SYMBOL(phys_offset);
+#endif
+
 unsigned int processor_id;
 EXPORT_SYMBOL(processor_id);
 unsigned int __machine_arch_type;
@@ -770,7 +780,7 @@
 	{ tag_size(tag_core), ATAG_CORE },
 	{ 1, PAGE_SIZE, 0xff },
 	{ tag_size(tag_mem32), ATAG_MEM },
-	{ MEM_SIZE, PHYS_OFFSET },
+	{ MEM_SIZE, 0 },
 	{ 0, ATAG_NONE }
 };
 
@@ -791,6 +801,8 @@
 	struct machine_desc *mdesc;
 	char *from = default_command_line;
 
+	init_tags.mem.start = PHYS_OFFSET;
+	
 	setup_processor();
 	mdesc = setup_machine(machine_arch_type);
 	machine_name = mdesc->name;
diff -Naur linux-2.6.25/arch/arm/kernel/head.S linux-2.6.25.ep93xx/arch/arm/kernel/head.S
--- linux-2.6.25/arch/arm/kernel/head.S	2008-04-16 21:49:44.000000000 -0500
+++ linux-2.6.25.ep93xx/arch/arm/kernel/head.S	2008-08-18 14:05:42.000000000 -0500
@@ -44,8 +44,8 @@
 	.globl	swapper_pg_dir
 	.equ	swapper_pg_dir, KERNEL_RAM_VADDR - 0x4000
 
-	.macro	pgtbl, rd
-	ldr	\rd, =(KERNEL_RAM_PADDR - 0x4000)
+	.macro	pgtbl, rd, phys_offset
+	add	\rd, \phys_offset, #(TEXT_OFFSET - 0x4000)
 	.endm
 
 #ifdef CONFIG_XIP_KERNEL
@@ -210,10 +210,22 @@
  * Returns:
  *  r0, r3, r6, r7 corrupted
  *  r4 = physical page table address
+ *  r5 = PHYS_OFFSET
  */
 	.type	__create_page_tables, %function
 __create_page_tables:
-	pgtbl	r4				@ page table address
+#ifdef CONFIG_RUNTIME_PHYS_OFFSET
+	adr	r5, stext
+	sub	r5, r5, #TEXT_OFFSET		@ r5 = phys_offset
+	ldr	r4, =(phys_offset - PAGE_OFFSET)
+	add	r4, r4, r5
+	str	r5, [r4]			@ save phys_offset
+#else
+	mov	r5, #PHYS_OFFSET		@ r5 = phys_offset
+#endif
+
+	pgtbl	r4, r5				@ r4 = page table address
+
 
 	/*
 	 * Clear the 16K level 1 swapper page table
@@ -277,10 +289,7 @@
 	 * Then map first 1MB of ram in case it contains our boot params.
 	 */
 	add	r0, r4, #PAGE_OFFSET >> 18
-	orr	r6, r7, #(PHYS_OFFSET & 0xff000000)
-	.if	(PHYS_OFFSET & 0x00f00000)
-	orr	r6, r6, #(PHYS_OFFSET & 0x00f00000)
-	.endif
+	orr	r6, r7, r5
 	str	r6, [r0]
 
 #ifdef CONFIG_DEBUG_LL
diff -Naur linux-2.6.25/include/asm-arm/memory.h linux-2.6.25.ep93xx/include/asm-arm/memory.h
--- linux-2.6.25/include/asm-arm/memory.h	2008-04-16 21:49:44.000000000 -0500
+++ linux-2.6.25.ep93xx/include/asm-arm/memory.h	2008-08-18 14:05:42.000000000 -0500
@@ -73,6 +73,14 @@
  */
 #define IOREMAP_MAX_ORDER	24
 
+/*
+ * PHYS_OFFSET determined at run time?
+ */
+#if defined(CONFIG_RUNTIME_PHYS_OFFSET) && !defined(__ASSEMBLY__)
+extern unsigned long phys_offset;
+#define PHYS_OFFSET		(phys_offset)
+#endif
+
 #else /* CONFIG_MMU */
 
 /*
