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! */