x86: Implement fully relocatable image

u-boot.bin can be loaded at any 4-byte aligned memory location and directly
'jumped' to using the 'go' command using the load address as the start
address. Doing so performs a 'warm boot' which skips memory initialisation
and other low-level initialisations, relocates U-Boot to upper memory and
starts U-Boot in RAM as per normal 'cold boot'
diff --git a/arch/i386/cpu/start.S b/arch/i386/cpu/start.S
index 8fdcd81..829468f 100644
--- a/arch/i386/cpu/start.S
+++ b/arch/i386/cpu/start.S
@@ -118,6 +118,11 @@
 
 	wbinvd
 
+	/* Determine our load offset */
+	call	1f
+1:	popl	%ecx
+	subl	$1b, %ecx
+
 	/* Set the upper memory limit parameter */
 	subl	$CONFIG_SYS_STACK_SIZE, %eax
 
@@ -127,6 +132,7 @@
 	/* %eax points to the global data structure */
 	movl	%esp, (GD_RAM_SIZE * 4)(%eax)
 	movl	%ebx, (GD_FLAGS * 4)(%eax)
+	movl	%ecx, (GD_LOAD_OFF * 4)(%eax)
 
 	call	board_init_f	/* Enter, U-boot! */