Patchwork [U-Boot,4/6,v2] Add support for Bootstrap infrastructure.

login
register
mail settings
Submitter luigi.mantellini@idf-hit.com
Date Dec. 4, 2010, 1:23 p.m.
Message ID <1291469030-24984-5-git-send-email-luigi.mantellini@idf-hit.com>
Download mbox | patch
Permalink /patch/74268/
State Superseded
Headers show

Comments

luigi.mantellini@idf-hit.com - Dec. 4, 2010, 1:23 p.m.
From: Luigi 'Comio' Mantellini <luigi.mantellini@idf-hit.com>

See README file for details regarding ho bootstrap code works.

Signed-off-by: Luigi 'Comio' Mantellini <luigi.mantellini@idf-hit.com>
---
 .gitignore                 |   25 ++++++-
 Makefile                   |  174 +++++++++++++++++++++++++++++++++++++++++++-
 README                     |   47 ++++++++++++
 common/Makefile            |   16 ++++-
 common/console_bootstrap.c |   85 +++++++++++++++++++++
 config.mk                  |   16 ++++
 include/bootstrap.h        |   59 +++++++++++++++
 include/common.h           |   21 +++++
 lib/Makefile               |   29 +++++++-
 lib/bootstrap.c            |   97 ++++++++++++++++++++++++
 lib/lzma/Makefile          |    4 +-
 lib/lzo/Makefile           |    4 +-
 lib/xz/Makefile            |    4 +-
 tools/xz_wrap.sh           |   45 +++++++++++
 14 files changed, 618 insertions(+), 8 deletions(-)
 create mode 100644 common/console_bootstrap.c
 create mode 100644 include/bootstrap.h
 create mode 100644 lib/bootstrap.c
 create mode 100755 tools/xz_wrap.sh

Patch

diff --git a/.gitignore b/.gitignore
index e71f6ac..8db8f0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,12 @@ 
 /u-boot.hex
 /u-boot.map
 /u-boot.bin
+/u-boot.bin.bz2
+/u-boot.bin.gz
+/u-boot.bin.lzma
+/u-boot.bin.lzo
+/u-boot.bin.xz
+/u-boot.dis
 /u-boot.srec
 /u-boot.ldr
 /u-boot.ldr.hex
@@ -30,6 +36,20 @@ 
 /u-boot.lds
 /u-boot-onenand.bin
 /u-boot-flexonenand.bin
+/u-boot-bootstrap
+/u-boot-bootstrap.hex
+/u-boot-bootstrap.map
+/u-boot-bootstrap.bin
+/u-boot-bootstrap.bin.bz2
+/u-boot-bootstrap.bin.gz
+/u-boot-bootstrap.bin.lzma
+/u-boot-bootstrap.bin.lzo
+/u-boot-bootstrap.dis
+/u-boot-bootstrap.srec
+/u-boot-bootstrap.ldr
+/u-boot-bootstrap.ldr.hex
+/u-boot-bootstrap.ldr.srec
+/u-boot-bootstrap.lds
 
 #
 # Generated files
@@ -39,7 +59,7 @@ 
 /LOG
 /errlog
 /reloc_off
-
+/.payload.s
 /include/generated/
 /lib/asm-offsets.s
 
@@ -66,3 +86,6 @@  cscope.*
 /onenand_ipl/onenand-ipl*
 /onenand_ipl/board/*/onenand*
 /onenand_ipl/board/*/*.S
+examples/standalone/
+
+setvars
diff --git a/Makefile b/Makefile
index ba832a4..cbd9a57 100644
--- a/Makefile
+++ b/Makefile
@@ -180,6 +180,13 @@  endif
 
 OBJS := $(addprefix $(obj),$(OBJS))
 
+ifeq ($(CONFIG_BOOTSTRAP),y)
+BOOTSTRAP_OBJS  = $(CPUDIR)/start_bootstrap.o
+
+BOOTSTRAP_OBJS := $(addprefix $(obj),$(BOOTSTRAP_OBJS))
+endif
+
+
 LIBS  = lib/libgeneric.o
 LIBS += lib/lzma/liblzma.o
 LIBS += lib/lzo/liblzo.o
@@ -270,6 +277,24 @@  LIBS := $(addprefix $(obj),$(sort $(LIBS)))
 LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).o
 LIBBOARD := $(addprefix $(obj),$(LIBBOARD))
 
+ifeq ($(CONFIG_BOOTSTRAP),y)
+BOOTSTRAP_LIBS =  lib/libgeneric_bootstrap.o
+BOOTSTRAP_LIBS += arch/$(ARCH)/cpu/lib$(ARCH)_bootstrap.o
+BOOTSTRAP_LIBS += arch/$(ARCH)/lib/lib$(ARCH)_bootstrap.o
+BOOTSTRAP_LIBS += common/libcommon_bootstrap.o
+BOOTSTRAP_LIBS += drivers/serial/libserial.o
+
+BOOTSTRAP_LIBS-$(CONFIG_BOOTSTRAP_LZMA) += lib/lzma/liblzma.o
+BOOTSTRAP_LIBS-$(CONFIG_BOOTSTRAP_LZO) += lib/lzo/liblzo.o
+BOOTSTRAP_LIBS-$(CONFIG_BOOTSTRAP_XZ) += lib/xz/libxz.o
+BOOTSTRAP_LIBS += $(BOOTSTRAP_LIBS-y)
+
+.PHONY : $(BOOTSTRAP_LIBS)
+
+BOOTSTRAP_LIBBOARD = board/$(BOARDDIR)/lib$(BOARD)_bootstrap.o
+BOOTSTRAP_LIBBOARD := $(addprefix $(obj),$(BOOTSTRAP_LIBBOARD))
+endif
+
 # Add GCC lib
 ifdef USE_PRIVATE_LIBGCC
 ifeq ("$(USE_PRIVATE_LIBGCC)", "yes")
@@ -283,6 +308,9 @@  endif
 PLATFORM_LIBS += $(PLATFORM_LIBGCC)
 export PLATFORM_LIBS
 
+BOOTSTRAP_PLATFORM_LIBS += $(PLATFORM_LIBGCC)
+export BOOTSTRAP_PLATFORM_LIBS
+
 # Special flags for CPP when processing the linker script.
 # Pass the version down so we can handle backwards compatibility
 # on the fly.
@@ -305,6 +333,9 @@  endif
 __OBJS := $(subst $(obj),,$(OBJS))
 __LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
 
+__BOOTSTRAP_OBJS := $(subst $(obj),,$(BOOTSTRAP_OBJS))
+__BOOTSTRAP_LIBS := $(subst $(obj),,$(BOOTSTRAP_LIBS)) $(subst $(obj),,$(BOOTSTRAP_LIBBOARD))
+
 #########################################################################
 #########################################################################
 
@@ -326,6 +357,10 @@  endif
 # Always append ALL so that arch config.mk's can add custom ones
 ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)
 
+ifeq ($(CONFIG_BOOTSTRAP),y)
+ALL += $(obj)u-boot-bootstrap.srec $(obj)u-boot-bootstrap.bin
+endif
+
 all:		$(ALL)
 
 $(obj)u-boot.hex:	$(obj)u-boot
@@ -338,6 +373,21 @@  $(obj)u-boot.bin:	$(obj)u-boot
 		$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
 		$(BOARD_SIZE_CHECK)
 
+$(obj)u-boot.bin.gz:	$(obj)u-boot.bin
+		gzip -c $< > $@
+
+$(obj)u-boot.bin.lzma:	$(obj)u-boot.bin
+		lzma -e -z -c $< > $@
+
+$(obj)u-boot.bin.xz:  $(obj)u-boot.bin
+		tools/xz_wrap.sh misc < $< > $@
+
+$(obj)u-boot.bin.lzo:	$(obj)u-boot.bin
+		lzop -9 -c $< > $@
+
+$(obj)u-boot.bin.bz2:	$(obj)u-boot.bin
+		bzip2 --best -z -c $< > $@
+
 $(obj)u-boot.ldr:	$(obj)u-boot
 		$(CREATE_LDR_ENV)
 		$(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS)
@@ -373,7 +423,7 @@  $(obj)u-boot.dis:	$(obj)u-boot
 GEN_UBOOT = \
 		UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
 		sed  -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
-		cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
+		cd $(LNDIR) && $(LD) --gc-sections $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
 			--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
 			-Map u-boot.map -o u-boot
 $(obj)u-boot:	depend \
@@ -396,6 +446,118 @@  $(LIBS):	depend $(SUBDIRS)
 $(LIBBOARD):	depend $(LIBS)
 		$(MAKE) -C $(dir $(subst $(obj),,$@))
 
+# Bootstrap targets
+
+ifeq ($(CONFIG_BOOTSTRAP),y)
+$(obj)u-boot-bootstrap.hex:	$(obj)u-boot-bootstrap
+		$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
+
+$(obj)u-boot-bootstrap.srec:	$(obj)u-boot-bootstrap
+		$(OBJCOPY) -O srec $< $@
+
+$(obj)u-boot-bootstrap.bin:	$(obj)u-boot-bootstrap
+		$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
+		$(BOARD_SIZE_CHECK)
+
+$(obj)u-boot-bootstrap.bin.gz:	$(obj)u-boot-bootstrap.bin
+		gzip -c $< > $@
+
+$(obj)u-boot-bootstrap.bin.lzma:	$(obj)u-boot-bootstrap.bin
+		lzma -e -z -c $< > $@
+
+$(obj)u-boot.bin-bootstrap.lzo:	$(obj)u-boot-bootstrap.bin
+		lzop -9 -c $< > $@
+
+$(obj)u-boot.bin-bootstrap.bz2:	$(obj)u-boot-bootstrap.bin
+		bzip2 --best -z -c $< > $@
+
+$(obj)u-boot-bootstrap.ldr:	$(obj)u-boot-bootstrap
+		$(CREATE_LDR_ENV)
+		$(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS)
+		$(BOARD_SIZE_CHECK)
+
+$(obj)u-boot-bootstrap.ldr.hex:	$(obj)u-boot-bootstrap.ldr
+		$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary
+
+$(obj)u-boot-bootstrap.ldr.srec:	$(obj)u-boot-bootstrap.ldr
+		$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary
+
+$(obj)u-boot-bootstrap.img:	$(obj)u-boot-bootstrap.bin
+		$(obj)tools/mkimage -A $(ARCH) -T firmware -C none \
+		-a $(CONFIG_BOOTSTRAP_BASE) -e 0 \
+		-n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
+			sed -e 's/"[	 ]*$$/ for $(BOARD) board"/') \
+		-d $< $@
+
+$(obj)u-boot-bootstrap.imx:       $(obj)u-boot-bootstrap.bin
+		$(obj)tools/mkimage -n $(IMX_CONFIG) -T imximage \
+		-e $(CONFIG_BOOTSTRAP_BASE) -d $< $@
+
+$(obj)u-boot-bootstrap.kwb:       $(obj)u-boot-bootstrap.bin
+		$(obj)tools/mkimage -n $(CONFIG_SYS_KWD_CONFIG) -T kwbimage \
+		-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE) -d $< $@
+
+$(obj)u-boot-bootstrap.sha1:	$(obj)u-boot-bootstrap.bin
+		$(obj)tools/ubsha1 $(obj)u-boot-bootstrap.bin
+
+$(obj)u-boot-bootstrap.dis:	$(obj)u-boot-bootstrap
+		$(OBJDUMP) -d $< > $@
+
+PAYLOAD_FILE_BASE=$(obj)u-boot.bin
+ifeq ($(CONFIG_BOOTSTRAP_GZIP),y)
+PAYLOAD_FILE_EXT:=.gz
+endif
+ifeq ($(CONFIG_BOOTSTRAP_LZMA),y)
+PAYLOAD_FILE_EXT:=.lzma
+endif
+ifeq ($(CONFIG_BOOTSTRAP_LZO),y)
+PAYLOAD_FILE_EXT:=.lzo
+endif
+ifeq ($(CONFIG_BOOTSTRAP_BZIP2),y)
+PAYLOAD_FILE_EXT:=.bz2
+endif
+ifeq ($(CONFIG_BOOTSTRAP_XZ),y)
+PAYLOAD_FILE_EXT:=.xz
+endif
+
+PAYLOAD_FILE := $(PAYLOAD_FILE_BASE)$(PAYLOAD_FILE_EXT)
+
+$(obj).payload.s: $(PAYLOAD_FILE)
+		echo ".globl payload_start" > $@
+		echo ".globl payload_end" >> $@
+		echo ".globl payload_size" >> $@
+		echo ".globl payload_uncsize" >> $@
+		echo .section .payload,\"a\",@progbits >> $@
+		echo "payload_size:" >> $@
+		echo -n ".word " >> $@
+		wc -c $(PAYLOAD_FILE) | cut -f1 -d' ' >> $@
+		echo "payload_uncsize:" >> $@
+		echo -n ".word " >> $@
+		wc -c $(obj)u-boot.bin | cut -f1 -d' ' >> $@
+		echo "payload_start:" >> $@
+		echo .incbin \"$(PAYLOAD_FILE)\" >> $@
+		echo "payload_end:" >> $@
+
+GEN_UBOOT_BOOTSTRAP = \
+		UNDEF_SYM=`$(OBJDUMP) -x $(BOOTSTRAP_LIBBOARD) $(BOOTSTRAP_LIBS) | \
+		sed  -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
+		cd $(LNDIR) && $(LD) --gc-sections $(BOOTSTRAP_LDFLAGS) $$UNDEF_SYM  $(obj).payload.o $(__BOOTSTRAP_OBJS) \
+			--start-group $(__BOOTSTRAP_LIBS) --end-group $(BOOTSTRAP_PLATFORM_LIBS) \
+			-Map u-boot-bootstrap.map -o u-boot-bootstrap
+$(obj)u-boot-bootstrap:	depend $(SUBDIRS) $(BOOTSTRAP_OBJS) $(BOOTSTRAP_LIBBOARD) $(BOOTSTRAP_LIBS) $(BOOTSTRAP_LDSCRIPT) $(obj)u-boot-bootstrap.lds $(obj).payload.o
+		$(GEN_UBOOT_BOOTSTRAP)
+ifeq ($(CONFIG_KALLSYMS),y)
+		smap=`$(call SYSTEM_MAP,u-boot-bootstrap) | \
+			awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 "\\\\000"}'` ; \
+		$(CC) $(CFLAGS) -DSYSTEM_MAP="\"$${smap}\"" \
+			-c common/system_map.c -o $(obj)common/system_map.o
+		$(GEN_UBOOT_BOOTSTRAP) $(obj)common/system_map.o
+endif
+
+$(BOOTSTRAP_LIBBOARD):	depend $(BOOTSTRAP_LIBS)
+		$(MAKE) -C $(dir $(subst $(obj),,$@)) $(notdir $@)
+endif
+
 $(SUBDIRS):	depend
 		$(MAKE) -C $@ all
 
@@ -405,6 +567,9 @@  $(LDSCRIPT):	depend
 $(obj)u-boot.lds: $(LDSCRIPT)
 		$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@
 
+$(obj)u-boot-bootstrap.lds: $(BOOTSTRAP_LDSCRIPT)
+		$(CPP) $(CPPFLAGS) $(BOOTSTRAP_LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@
+
 $(NAND_SPL):	$(TIMESTAMP_FILE) $(VERSION_FILE) depend
 		$(MAKE) -C nand_spl/board/$(BOARDDIR) all
 
@@ -1222,6 +1387,7 @@  clean:
 	       $(obj)board/trab/trab_fkt   $(obj)board/voiceblue/eeprom   \
 	       $(obj)board/armltd/{integratorap,integratorcp}/u-boot.lds  \
 	       $(obj)u-boot.lds						  \
+	       $(obj)u-boot-bootstrap.lds			\
 	       $(obj)arch/blackfin/cpu/bootrom-asm-offsets.[chs]
 	@rm -f $(obj)include/bmp_logo.h
 	@rm -f $(obj)lib/asm-offsets.s
@@ -1245,6 +1411,12 @@  clobber:	clean
 	@rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL)
 	@rm -f $(obj)u-boot.kwb
 	@rm -f $(obj)u-boot.imx
+	@rm -f $(obj)u-boot.bin{.gz,.lzma,.lzo,.bz2,.xz}
+	@rm -f $(obj)u-boot-bootstrap $(obj)u-boot-bootstrap.map $(obj)u-boot-bootstrap.hex
+	@rm -f $(obj)u-boot-bootstrap.kwb
+	@rm -f $(obj)u-boot-bootstrap.imx
+	@rm -f $(obj)u-boot-bootstrap.bin{.gz,.lzma,.lzo,.bz2,.xz}
+	@rm -f $(obj).payload.s
 	@rm -f $(obj)tools/{env/crc32.c,inca-swap-bytes}
 	@rm -f $(obj)arch/powerpc/cpu/mpc824x/bedbug_603e.c
 	@rm -f $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm
diff --git a/README b/README
index 90c19a9..3b27e2f 100644
--- a/README
+++ b/README
@@ -1945,6 +1945,53 @@  The following options need to be configured:
 		example, some LED's) on your board. At the moment,
 		the following checkpoints are implemented:
 
+- Compressed U-Boot support:
+		CONFIG_BOOTSTRAP_BASE
+
+		This option enables the Boostrap infrastructure.
+		The bootstrap code consists of a small binary that is able
+		to decompress an attached payload (a full U-Boot image),
+		allowing to have a small but also full featured U-Boot
+		bootloader.
+
+		The bootstrap supports BZIP2, GZIP, LZMA, LZO and XZ payload
+		formats as well as flat/uncompressed payload (useful for debug).
+
+		The boot sequence will be divided in the following stages:
+
+		1) bootstrap:
+			- Lowlevel initiliazation
+			- Bootstrap code relocation (if needed)
+			- Dynamic memory initialization (if needed)
+			- Payload uncompression or copy to RAM
+		2) Jump to uncompressed full U-Boot (into RAM)
+
+		CONFIG_BOOTSTRAP_SKIP_LOWLEVEL_INIT
+
+		Skip lowlevel initialization.
+
+		CONFIG_BOOTSTRAP_TEXT_BASE
+
+		TEXT_BASE address of the bootstrap code.
+
+		CONFIG_BOOTSTRAP_BAUDRATE
+
+		Serial port baudrate at bootstrap.
+
+		CONFIG_BOOTSTRAP_BZIP2
+		CONFIG_BOOTSTRAP_GZIP
+		CONFIG_BOOTSTRAP_LZMA
+		CONFIG_BOOTSTRAP_LZO
+		CONFIG_BOOTSTRAP_XZ
+		
+		Enable BZIP2, GZIP, LZMA, LZO or XZ payload support. If anyone is defined,
+		an uncompressed payload will used.
+
+		BOOTSTRAP_LDSCRIPT
+		
+		LD script for bootstrap code. If not defined, a board specific script will be
+		used.
+
 Legacy uImage format:
 
   Arg	Where			When
diff --git a/common/Makefile b/common/Makefile
index abea91c..ec1c6e9 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -24,6 +24,9 @@ 
 include $(TOPDIR)/config.mk
 
 LIB	= $(obj)libcommon.o
+BOOTSTRAP_LIB	= $(obj)libcommon_bootstrap.o
+
+BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP)	= $(BOOTSTRAP_LIB)
 
 # core
 COBJS-y += main.o
@@ -165,20 +168,29 @@  COBJS-$(CONFIG_MODEM_SUPPORT) += modem.o
 COBJS-$(CONFIG_UPDATE_TFTP) += update.o
 COBJS-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
 
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_GZIP) += dlmalloc.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += dlmalloc.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += console_bootstrap.o
+
+BOOTSTRAP_COBJS	:= $(sort $(BOOTSTRAP_COBJS-y))
+BOOTSTRAP_OBJS	:= $(addprefix $(obj),$(BOOTSTRAP_COBJS))
 
 COBJS	:= $(sort $(COBJS-y))
 XCOBJS	:= $(sort $(XCOBJS-y))
-SRCS	:= $(COBJS:.o=.c) $(XCOBJS:.o=.c)
+SRCS	:= $(sort $(COBJS:.o=.c) $(XCOBJS:.o=.c) $(BOOTSTRAP_COBJS:.o=.c))
 OBJS	:= $(addprefix $(obj),$(COBJS))
 XOBJS	:= $(addprefix $(obj),$(XCOBJS))
 
 CPPFLAGS += -I..
 
-all:	$(LIB) $(XOBJS)
+all:	$(LIB) $(BOOTSTRAP_LIB-y) $(XOBJS)
 
 $(LIB): $(obj).depend $(OBJS)
 	$(call cmd_link_o_target, $(OBJS))
 
+$(BOOTSTRAP_LIB): $(obj).depend $(BOOTSTRAP_OBJS)
+	$(call cmd_link_o_target, $(BOOTSTRAP_OBJS))
+
 $(obj)env_embedded.o: $(src)env_embedded.c $(obj)../tools/envcrc
 	$(CC) $(AFLAGS) -Wa,--no-warn \
 		-DENV_CRC=$(shell $(obj)../tools/envcrc) \
diff --git a/common/console_bootstrap.c b/common/console_bootstrap.c
new file mode 100644
index 0000000..cdd4a62
--- /dev/null
+++ b/common/console_bootstrap.c
@@ -0,0 +1,85 @@ 
+/*
+ * (C) Copyright 2000
+ * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <stdarg.h>
+#include <malloc.h>
+
+/** U-Boot INITIAL CONSOLE-COMPATIBLE FUNCTION *****************************/
+
+int getc(void)
+{
+	/* Send directly to the handler */
+	return serial_getc();
+}
+
+int tstc(void)
+{
+	/* Send directly to the handler */
+	return serial_tstc();
+}
+
+void putc(const char c)
+{
+	/* Send directly to the handler */
+	serial_putc(c);
+}
+
+void puts(const char *s)
+{
+	serial_puts(s);
+}
+
+int printf(const char *fmt, ...)
+{
+	va_list args;
+	uint i;
+	char printbuffer[CONFIG_SYS_PBSIZE];
+
+	va_start(args, fmt);
+
+	/* For this to work, printbuffer must be larger than
+	 * anything we ever want to print.
+	 */
+	i = vsprintf(printbuffer, fmt, args);
+	va_end(args);
+
+	/* Print the string */
+	puts(printbuffer);
+	return i;
+}
+
+int vprintf(const char *fmt, va_list args)
+{
+	uint i;
+	char printbuffer[CONFIG_SYS_PBSIZE];
+
+	/* For this to work, printbuffer must be larger than
+	 * anything we ever want to print.
+	 */
+	i = vsprintf(printbuffer, fmt, args);
+
+	/* Print the string */
+	puts(printbuffer);
+	return i;
+}
diff --git a/config.mk b/config.mk
index 591b490..81a4efb 100644
--- a/config.mk
+++ b/config.mk
@@ -166,6 +166,11 @@  else
 LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
 endif
 endif
+ifeq ($(CONFIG_BOOTSTRAP),y)
+ifndef BOOTSTRAP_LDSCRIPT
+BOOTSTRAP_LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-bootstrap.lds
+endif
+endif
 OBJCFLAGS += --gap-fill=0xff
 
 gccincdir := $(shell $(CC) -print-file-name=include)
@@ -176,6 +181,10 @@  ifneq ($(CONFIG_SYS_TEXT_BASE),)
 CPPFLAGS += -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE)
 endif
 
+ifneq ($(CONFIG_BOOTSTRAP_TEXT_BASE),)
+CPPFLAGS += -DCONFIG_BOOTSTRAP_TEXT_BASE=$(CONFIG_BOOTSTRAP_TEXT_BASE)
+endif
+
 ifneq ($(RESET_VECTOR_ADDRESS),)
 CPPFLAGS += -DRESET_VECTOR_ADDRESS=$(RESET_VECTOR_ADDRESS)
 endif
@@ -222,6 +231,13 @@  ifneq ($(CONFIG_SYS_TEXT_BASE),)
 LDFLAGS += -Ttext $(CONFIG_SYS_TEXT_BASE)
 endif
 
+ifeq ($(CONFIG_BOOTSTRAP),y)
+BOOTSTRAP_LDFLAGS += -Bstatic -T $(obj)u-boot-bootstrap.lds $(PLATFORM_LDFLAGS)
+ifneq ($(CONFIG_BOOTSTRAP_TEXT_BASE),)
+BOOTSTRAP_LDFLAGS += -Ttext $(CONFIG_BOOTSTRAP_TEXT_BASE)
+endif
+endif
+
 # Location of a usable BFD library, where we define "usable" as
 # "built for ${HOST}, supports ${TARGET}".  Sensible values are
 # - When cross-compiling: the root of the cross-environment
diff --git a/include/bootstrap.h b/include/bootstrap.h
new file mode 100644
index 0000000..f49045d
--- /dev/null
+++ b/include/bootstrap.h
@@ -0,0 +1,59 @@ 
+/*
+ * (C) Copyright 2000-2009
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __BOOTSTRAP_H_
+#define __BOOTSTRAP_H_	1
+
+#include <common.h>
+
+#ifdef CONFIG_BOOTSTRAP_BZIP2
+#define _CONFIG_BOOTSTRAP_RELOCATE
+#define _CONFIG_BOOTSTRAP_MALLOC
+// #define _CONFIG_BOOTSTRAP_FAKEMALLOC
+#endif
+
+#ifdef CONFIG_BOOTSTRAP_GZIP
+// #define _CONFIG_BOOTSTRAP_RELOCATE
+#define _CONFIG_BOOTSTRAP_MALLOC
+#define _CONFIG_BOOTSTRAP_FAKEMALLOC
+#endif
+
+#ifdef CONFIG_BOOTSTRAP_LZMA
+// #define _CONFIG_BOOTSTRAP_RELOCATE
+#define _CONFIG_BOOTSTRAP_MALLOC
+#define _CONFIG_BOOTSTRAP_FAKEMALLOC
+#endif
+
+#ifdef CONFIG_BOOTSTRAP_LZO
+// #define _CONFIG_BOOTSTRAP_RELOCATE
+// #define _CONFIG_BOOTSTRAP_MALLOC
+// #define _CONFIG_BOOTSTRAP_FAKEMALLOC
+#endif
+
+#ifdef CONFIG_BOOTSTRAP_XZ
+// #define _CONFIG_BOOTSTRAP_RELOCATE
+#define _CONFIG_BOOTSTRAP_MALLOC
+#define _CONFIG_BOOTSTRAP_FAKEMALLOC
+#endif
+
+#endif	/* __BOOTSTRAP_H_ */
diff --git a/include/common.h b/include/common.h
index 189ad81..690cba2 100644
--- a/include/common.h
+++ b/include/common.h
@@ -723,6 +723,27 @@  int cpu_disable(int nr);
 int cpu_release(int nr, int argc, char * const argv[]);
 #endif
 
+/* Bootstrap specific code */
+#ifdef CONFIG_BOOTSTRAP
+void bootstrap_hang(void) __attribute__ ((noreturn));
+void bootstrap_board_init_f(ulong) __attribute__ ((noreturn));
+void bootstrap_board_init_r(gd_t *, ulong) __attribute__ ((noreturn));
+int bootstrap_checkboard(void);
+
+int bootstrap_serial_init(void);
+void bootstrap_serial_exit(void);
+void bootstrap_serial_setbrg(void);
+void bootstrap_serial_putc(const char);
+void bootstrap_serial_putc_raw(const char);
+void bootstrap_serial_puts(const char *);
+int bootstrap_serial_getc(void);
+int bootstrap_serial_tstc(void);
+
+phys_size_t bootstrap_initdram (int);
+
+int copy_uboot(void *dst, size_t unc_size, void *src, size_t size);
+#endif
+
 #endif /* __ASSEMBLY__ */
 
 /* Put only stuff here that the assembler can digest */
diff --git a/lib/Makefile b/lib/Makefile
index ffdee7d..3795ed3 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -24,6 +24,9 @@ 
 include $(TOPDIR)/config.mk
 
 LIB	= $(obj)libgeneric.o
+BOOTSTRAP_LIB	= $(obj)libgeneric_bootstrap.o
+
+BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP)	= $(BOOTSTRAP_LIB)
 
 COBJS-$(CONFIG_ADDR_MAP) += addr_map.o
 COBJS-$(CONFIG_BZIP2) += bzlib.o
@@ -54,13 +57,37 @@  COBJS-y += vsprintf.o
 COBJS-$(CONFIG_ZLIB) += zlib.o
 COBJS-$(CONFIG_RBTREE)	+= rbtree.o
 
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += string.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += vsprintf.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += div64.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += ctype.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += time.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += bootstrap.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_GZIP) += zlib.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_GZIP) += gunzip.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_GZIP) += crc32.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib_crctable.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib_decompress.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib_randtable.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib_huffman.o
+BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_XZ) += crc32.o
+
+BOOTSTRAP_COBJS	:= $(BOOTSTRAP_COBJS-y)
+BOOTSTRAP_OBJS	:= $(addprefix $(obj),$(BOOTSTRAP_COBJS))
+
 COBJS	:= $(COBJS-y)
-SRCS	:= $(COBJS:.o=.c)
+SRCS	:= $(COBJS:.o=.c) $(BOOTSTRAP_COBJS:.o=.c)
 OBJS	:= $(addprefix $(obj),$(COBJS))
 
+all:	$(LIB) $(BOOTSTRAP_LIB-y)
+
 $(LIB):	$(obj).depend $(OBJS)
 	$(call cmd_link_o_target, $(OBJS))
 
+$(BOOTSTRAP_LIB):	$(obj).depend $(BOOTSTRAP_OBJS)
+	$(call cmd_link_o_target, $(BOOTSTRAP_OBJS))
+
 #########################################################################
 
 # defines $(obj).depend target
diff --git a/lib/bootstrap.c b/lib/bootstrap.c
new file mode 100644
index 0000000..1ae5cfc
--- /dev/null
+++ b/lib/bootstrap.c
@@ -0,0 +1,97 @@ 
+/*
+ * (C) Copyright 2010 Industrie Dial Face S.p.A.
+ * Luigi 'Comio' Mantellini, luigi.mantellini@idf-hit.com
+ *
+ * (C) Copyright 2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <command.h>
+#include <stdio_dev.h>
+
+#ifdef CONFIG_BOOTSTRAP_LZMA
+#include <lzma/LzmaTypes.h>
+#include <lzma/LzmaDec.h>
+#include <lzma/LzmaTools.h>
+#endif /* CONFIG_BOOTSTRAP_LZMA */
+
+#ifdef CONFIG_BOOTSTRAP_LZO
+#include <linux/lzo.h>
+#endif /* CONFIG_BOOTSTRAP_LZO */
+
+#ifdef CONFIG_BOOTSTRAP_BZIP2
+#include <bzlib.h>
+#endif
+
+#ifdef CONFIG_BOOTSTRAP_XZ
+#include <unxz.h>
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const char *algo =
+#if defined(CONFIG_BOOTSTRAP_GZIP)
+	"gzip";
+#elif defined(CONFIG_BOOTSTRAP_LZMA)
+	"lzma";
+#elif defined(CONFIG_BOOTSTRAP_LZO)
+	"lzo";
+#elif defined(CONFIG_BOOTSTRAP_BZIP2)
+	"bzip2";
+#elif defined(CONFIG_BOOTSTRAP_XZ)
+	"xz";
+#else
+	"flat";
+#endif
+
+
+int copy_uboot(void *dst, size_t unc_size, void *src, size_t size)
+{
+	int ret;
+	debug("copy from %p (%d) to %p (%d)\n", src, size, dst, unc_size);
+
+	printf("Uncompressing payload (%s)...", algo);
+#if defined(CONFIG_BOOTSTRAP_GZIP)
+	ret = gunzip(dst, unc_size, src, &size);
+#elif defined(CONFIG_BOOTSTRAP_LZMA)
+	SizeT outsize = unc_size;
+	ret = lzmaBuffToBuffDecompress(dst, &outsize, src, size);
+#elif defined(CONFIG_BOOTSTRAP_LZO)
+	uint unc_len = unc_size;
+	ret = lzop_decompress(src, size, dst, &unc_len);
+#elif defined(CONFIG_BOOTSTRAP_BZIP2)
+	uint unc_len = unc_size;
+	ret = BZ2_bzBuffToBuffDecompress ((char*)dst, &unc_len, (char *)src, size, CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
+#elif defined(CONFIG_BOOTSTRAP_XZ)
+	ret = unxz(src, size, dst, &unc_size);
+#else
+	memcpy(dst, src, size);
+	ret = 0;
+#endif
+	if (ret) {
+	    printf("failed with error %d.\n", ret);
+	    bootstrap_hang();
+	} else {
+	    puts("done.\n");
+	}
+	return ret;
+}
\ No newline at end of file
diff --git a/lib/lzma/Makefile b/lib/lzma/Makefile
index 4d3401d..395b8dc 100644
--- a/lib/lzma/Makefile
+++ b/lib/lzma/Makefile
@@ -32,7 +32,9 @@  SOBJS	=
 
 CFLAGS += -D_LZMA_PROB32
 
-COBJS-$(CONFIG_LZMA) += LzmaDec.o LzmaTools.o
+COBJS-$(CONFIG_LZMA)$(CONFIG_BOOTSTRAP_LZMA) += LzmaDec.o LzmaTools.o
+
+COBJS-y	+= $(COBJS-yy)
 
 COBJS	= $(COBJS-y)
 SRCS 	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
diff --git a/lib/lzo/Makefile b/lib/lzo/Makefile
index 69bc839..c8d7fa5 100644
--- a/lib/lzo/Makefile
+++ b/lib/lzo/Makefile
@@ -27,7 +27,9 @@  LIB	= $(obj)liblzo.o
 
 SOBJS	=
 
-COBJS-$(CONFIG_LZO) += lzo1x_decompress.o
+COBJS-$(CONFIG_LZO)$(CONFIG_BOOTSTRAP_LZO) += lzo1x_decompress.o
+
+COBJS-y	+= $(OBJS-yy)
 
 COBJS	= $(COBJS-y)
 SRCS 	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
diff --git a/lib/xz/Makefile b/lib/xz/Makefile
index 3cfeab4..b71fb97 100644
--- a/lib/xz/Makefile
+++ b/lib/xz/Makefile
@@ -32,7 +32,9 @@  SOBJS	=
 
 CFLAGS +=
 
-COBJS-$(CONFIG_XZ) += decompress_unxz.o
+COBJS-$(CONFIG_XZ)$(CONFIG_BOOTSTRAP_XZ) += decompress_unxz.o
+
+COBJS-y += $(COBJS-yy)
 
 COBJS	= $(COBJS-y)
 SRCS 	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
diff --git a/tools/xz_wrap.sh b/tools/xz_wrap.sh
new file mode 100755
index 0000000..dbe5e55
--- /dev/null
+++ b/tools/xz_wrap.sh
@@ -0,0 +1,45 @@ 
+#!/bin/sh
+#
+# This is a wrapper for xz to use appropriate compression options depending
+# on what is being compressed. The only argument to this script should be
+# "kernel" or "misc" to indicate what is being compressed.
+#
+# Author: Lasse Collin <lasse.collin@tukaani.org>
+#
+# This file has been put into the public domain.
+# You can do whatever you want with this file.
+#
+
+# Defaults: No BCJ filter and no extra LZMA2 options.
+BCJ=
+LZMA2OPTS=
+
+# Big dictionary is OK for the kernel image, but it's not OK
+# for other things.
+#
+# BCJ filter is used only for the kernel, at least for now.
+# It could be useful for non-trivial initramfs too, but it
+# depends on the exact content of the initramfs image.
+case $1 in
+	kernel)
+		DICT=16MiB
+		case $ARCH in
+			x86|x86_64)     BCJ=--x86 ;;
+			powerpc)        BCJ=--powerpc ;;
+			ia64)           BCJ=--ia64; LZMA2OPTS=pb=4 ;;
+			arm)            BCJ=--arm ;;
+			sparc)          BCJ=--sparc ;;
+		esac
+		;;
+	misc)
+		DICT=1MiB
+		;;
+	*)
+		echo "xz_wrap.sh: Invalid argument \`$1'" >&2
+		exit 1
+		;;
+esac
+
+# This is very slow, but it should give very good compression too.
+exec xz --stdout --quiet --threads=1 --check=crc32 \
+		$BCJ --lzma2=preset=6e,$LZMA2OPTS,dict=$DICT