[U-Boot] [PATCH 0/6 v2] Support for Bootstrap Code

The following patch set add the support for Bootstrap code. This permits to have a compressed full featured U-Boot binary.
See README file in the U-Boot root.
The patchset includes also the XZ format support and a fix to LZMA code.
Luigi 'Comio' Mantellini (6): Add support for XZ decompression algorithm. LZMA: Avoid free on null pointer Enable garbage collelction of unused input sections. Add support for Bootstrap infrastructure. Enable bootstrap support for MIPS architecture. Enable bootstrap code for QEMU-MIPS board.
.gitignore | 25 +- Makefile | 175 +++++- README | 56 ++ arch/mips/config.mk | 2 +- arch/mips/cpu/Makefile | 28 +- arch/mips/cpu/cpu.c | 12 - arch/mips/cpu/reset.c | 39 ++ arch/mips/cpu/reset_bootstrap.c | 39 ++ arch/mips/cpu/start_bootstrap.S | 455 +++++++++++++ arch/mips/lib/Makefile | 15 +- arch/mips/lib/board_bootstrap.c | 331 +++++++++ board/qemu-mips/Makefile | 15 +- board/qemu-mips/config.mk | 7 +- board/qemu-mips/qemu-mips_bootstrap.c | 48 ++ board/qemu-mips/u-boot-bootstrap.lds | 73 ++ common/Makefile | 16 +- common/cmd_bootm.c | 27 +- common/console_bootstrap.c | 85 +++ common/image.c | 1 + config.mk | 29 + include/bootstrap.h | 59 ++ include/common.h | 21 + include/configs/qemu-mips.h | 15 +- include/image.h | 1 + include/unxz.h | 16 + include/xz.h | 237 +++++++ lib/Makefile | 29 +- lib/bootstrap.c | 97 +++ lib/lzma/LzmaDec.c | 4 +- lib/lzma/Makefile | 4 +- lib/lzo/Makefile | 4 +- lib/xz/Makefile | 53 ++ lib/xz/decompress_unxz.c | 231 +++++++ lib/xz/xz_dec_bcj.c | 564 ++++++++++++++++ lib/xz/xz_dec_lzma2.c | 1175 +++++++++++++++++++++++++++++++++ lib/xz/xz_dec_stream.c | 823 +++++++++++++++++++++++ lib/xz/xz_lzma2.h | 204 ++++++ lib/xz/xz_private.h | 154 +++++ lib/xz/xz_stream.h | 50 ++ tools/xz_wrap.sh | 45 ++ 40 files changed, 5232 insertions(+), 32 deletions(-) create mode 100644 arch/mips/cpu/reset.c create mode 100644 arch/mips/cpu/reset_bootstrap.c create mode 100644 arch/mips/cpu/start_bootstrap.S create mode 100644 arch/mips/lib/board_bootstrap.c create mode 100644 board/qemu-mips/qemu-mips_bootstrap.c create mode 100644 board/qemu-mips/u-boot-bootstrap.lds create mode 100644 common/console_bootstrap.c create mode 100644 include/bootstrap.h create mode 100644 include/unxz.h create mode 100644 include/xz.h create mode 100644 lib/bootstrap.c create mode 100644 lib/xz/Makefile create mode 100644 lib/xz/decompress_unxz.c create mode 100644 lib/xz/xz_dec_bcj.c create mode 100644 lib/xz/xz_dec_lzma2.c create mode 100644 lib/xz/xz_dec_stream.c create mode 100644 lib/xz/xz_lzma2.h create mode 100644 lib/xz/xz_private.h create mode 100644 lib/xz/xz_stream.h create mode 100755 tools/xz_wrap.sh

Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com --- lib/lzma/LzmaDec.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/lib/lzma/LzmaDec.c b/lib/lzma/LzmaDec.c index f941da2..b2a3aec 100644 --- a/lib/lzma/LzmaDec.c +++ b/lib/lzma/LzmaDec.c @@ -913,7 +913,9 @@ SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *sr
void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) { - alloc->Free(alloc, p->probs); + if (p->probs) { + alloc->Free(alloc, p->probs); + } p->probs = 0; }

Dear Luigi 'Comio' Mantellini,
In message 1291469358-25023-3-git-send-email-luigi.mantellini@idf-hit.com you wrote:
Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com
lib/lzma/LzmaDec.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/lib/lzma/LzmaDec.c b/lib/lzma/LzmaDec.c index f941da2..b2a3aec 100644 --- a/lib/lzma/LzmaDec.c +++ b/lib/lzma/LzmaDec.c @@ -913,7 +913,9 @@ SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *sr
void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) {
- alloc->Free(alloc, p->probs);
- if (p->probs) {
- alloc->Free(alloc, p->probs);
- } p->probs = 0;
}
Incorrect indentation, and no braces needed for single line statements.
Best regards,
Wolfgang Denk

Dear Luigi 'Comio' Mantellini,
In message 1291469358-25023-3-git-send-email-luigi.mantellini@idf-hit.com you wrote:
Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com
lib/lzma/LzmaDec.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/lib/lzma/LzmaDec.c b/lib/lzma/LzmaDec.c index f941da2..b2a3aec 100644 --- a/lib/lzma/LzmaDec.c +++ b/lib/lzma/LzmaDec.c @@ -913,7 +913,9 @@ SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *sr
void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) {
- alloc->Free(alloc, p->probs);
- if (p->probs) {
- alloc->Free(alloc, p->probs);
- } p->probs = 0;
}
Incorrect indentation, and no braces needed for single line statements.
.. and that NULL test belongs in alloc->Free like the standard free() does.

When available, enable the CC -ffunction-sections option and the LD --gc-sections in order to isolate and remove from final executable the unused functions.
From ld manpages:
--gc-sections --no-gc-sections
Enable garbage collection of unused input sections. It is ignored on targets that do not support this option. The default behaviour (of not performing this garbage collection) can be restored by specifying --no-gc-sections on the command line.
--gc-sections decides which input sections are used by examining symbols and relocations. The section containing the entry symbol and all sections containing symbols undefined on the command-line will be kept, as will sections containing symbols referenced by dynamic objects. Note that when building shared libraries, the linker must assume that any visible symbol is referenced. Once this initial set of sections has been determined, the linker recursively marks as used any section referenced by their relocations. See --entry and --undefined.
From gcc manpages:
-ffunction-sections -fdata-sections
Place each function or data item into its own section in the output file if the target supports arbitrary sections. The name of the function or the name of the data item determines the section's name in the output file.
Use these options on systems where the linker can perform optimizations to improve locality of reference in the instruction space. Most systems using the ELF object format and SPARC processors running Solaris 2 have linkers with such optimizations. AIX may have these optimizations in the future.
Only use these options when there are significant benefits from doing so. When you specify these options, the assembler and linker will create larger object and executable files and will also be slower. You will not be able to use "gprof" on all systems if you specify this option and you may have problems with debugging if you specify both this option and -g.
Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com --- config.mk | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/config.mk b/config.mk index c6d6f7b..591b490 100644 --- a/config.mk +++ b/config.mk @@ -23,6 +23,10 @@
#########################################################################
+comma := , +empty := +space := $(empty) $(empty) + ifneq ($(OBJTREE),$(SRCTREE)) ifeq ($(CURDIR),$(SRCTREE)) dir := @@ -97,6 +101,8 @@ HOSTCFLAGS += -pedantic # cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) +ld-option = $(shell if $(CC) -Wl$(comma)$(1) -nostdlib -xc /dev/null -o /dev/null \ + > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
# # Include the make variables (CC, etc...) @@ -191,6 +197,13 @@ endif
CFLAGS += $(call cc-option,-fno-stack-protector)
+# Create a section for each function or data (useful for sections garbage collector) +CFLAGS += $(call cc-option,-ffunction-sections) +CFLAGS += $(call cc-option,-fdata-sections) + +# Sections garbage collector +LDFLAGS += $(call ld-option,--gc-sections) + # $(CPPFLAGS) sets -g, which causes gcc to pass a suitable -g<format> # option to the assembler. AFLAGS_DEBUG :=

Dear Luigi 'Comio' Mantellini,
In message 1291469358-25023-4-git-send-email-luigi.mantellini@idf-hit.com you wrote:
Typo in subject.
When available, enable the CC -ffunction-sections option and the LD --gc-sections in order to isolate and remove from final executable the unused functions.
Lines WAY TOO LONG!!
Please fix globally.
This patch is unrelated from the rest of this series and should be submitted separately.
From ld manpages:
--gc-sections --no-gc-sections
I don't see any such changes in that commit?
Are you sure you split this correctly so it remains atomic, bisectable commits? I don't think so.
Enable garbage collection of unused input sections. It is ignored on targets that do not support this option. The default behaviour (of not performing this garbage collection) can be restored by specifying --no-gc-sections on the command line.
--gc-sections decides which input sections are used by examining symbols and relocations. The section containing the entry symbol and all sections containing symbols undefined on the command-line will be kept, as will sections containing symbols refere nced by dynamic objects. Note that when building shared libraries, the linker must assume that any visible symbol is referenced. Once this initial set of sections has been determined, the linker recursively marks as used any section referenced by thei r relocations. See --entry and --undefined.
From gcc manpages:
-ffunction-sections -fdata-sections
Place each function or data item into its own section in the output file if the target supports arbitrary sections. The name of the function or the name of the data item determines the section's name in the output file.
Use these options on systems where the linker can perform optimizations to improve locality of reference in the instruction space. Most systems using the ELF object format and SPARC processors running Solaris 2 have linkers with such optimizations. AI X may have these optimizations in the future.
Only use these options when there are significant benefits from doing so. When you specify these options, the assembler and linker will create larger object and executable files and will also be slower. You will not be able to use "gprof" on all system s if you specify this option and you may have problems with debugging if you specify both this option and -g.
Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com
config.mk | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
You cannot do this without adapting the linker scripts of ALL affected boards.
diff --git a/config.mk b/config.mk index c6d6f7b..591b490 100644 --- a/config.mk +++ b/config.mk @@ -23,6 +23,10 @@
#########################################################################
+comma := , +empty := +space := $(empty) $(empty)
Why would that be needed? Please elucidate.
ifneq ($(OBJTREE),$(SRCTREE)) ifeq ($(CURDIR),$(SRCTREE)) dir := @@ -97,6 +101,8 @@ HOSTCFLAGS += -pedantic # cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) +ld-option = $(shell if $(CC) -Wl$(comma)$(1) -nostdlib -xc /dev/null -o /dev/null \
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
# # Include the make variables (CC, etc...) @@ -191,6 +197,13 @@ endif
CFLAGS += $(call cc-option,-fno-stack-protector)
+# Create a section for each function or data (useful for sections garbage collector) +CFLAGS += $(call cc-option,-ffunction-sections) +CFLAGS += $(call cc-option,-fdata-sections)
+# Sections garbage collector +LDFLAGS += $(call ld-option,--gc-sections)
It seems you mix several things here. Thi sis not bisectable as is.
Best regards,
Wolfgang Denk

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
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

Dear Luigi 'Comio' Mantellini,
In message 1291469358-25023-5-git-send-email-luigi.mantellini@idf-hit.com you wrote:
See README file for details regarding ho bootstrap code works.
Please provide at least a basic explanation of that this commit is doing in the commitm essage.
Not only the commit message, also the remaining text is full of typos. Please run through a spell checker.
Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com
.gitignore | 25 ++++++- Makefile | 174 +++++++++++++++++++++++++++++++++++++++++++-
Please consider if this can be handled separately, without adding tons of new code to the top level Makefile.
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
Please explain why all these new images are needed?
@@ -39,7 +59,7 @@ /LOG /errlog /reloc_off
+/.payload.s
???
/onenand_ipl/onenand-ipl* /onenand_ipl/board/*/onenand* /onenand_ipl/board/*/*.S +examples/standalone/
+setvars
???
+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
Can this not go to a separate, new directory?
+__BOOTSTRAP_LIBS := $(subst $(obj),,$(BOOTSTRAP_LIBS)) $(subst $(obj),,$(BOOTSTRAP_LIBBOARD))
Lines too long... Please fix globally.
+$(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 $< > $@
Do we need this in the top level Makefile?
@@ -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
Be careful!! This will break toins of boards as you did not adapt the linker scripts!
+# 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
NAK!! Please find a way to implement this without adding all that code to the top level Makefile.
+- 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.
That means you have to make adjustments to the init code of all architectures / boards. I do not see this in this patch, nor are there any preceeding patches that prepare the ground. In other words, this will not work at best, or more likely break zillions of boards.
On which architectures / boards has this been tested?
BOOTSTRAP_LDSCRIPT
LD script for bootstrap code. If not defined, a board specific script will be
used.
This is the wrong way around. Only if a board specific script is needed there should be need for such a definition; in all other cases a default script should be used.
+ifneq ($(CONFIG_BOOTSTRAP_TEXT_BASE),) +CPPFLAGS += -DCONFIG_BOOTSTRAP_TEXT_BASE=$(CONFIG_BOOTSTRAP_TEXT_BASE) +endif
This should never be necessary.
+#ifdef CONFIG_BOOTSTRAP_BZIP2 +#define _CONFIG_BOOTSTRAP_RELOCATE +#define _CONFIG_BOOTSTRAP_MALLOC +// #define _CONFIG_BOOTSTRAP_FAKEMALLOC +#endif
C++ comments are not allowed. Please fix globally.
+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
Previous descriptions sounded as if all these formats were supported in parallel. Not it seems only one is at a time, and there is a search order. This must at least be documented. It would be better if an error was raised if two options are selected.
- 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;
What's "SizeT" ?? We don;t allow such names in U-Boot.
- if (ret) {
printf("failed with error %d.\n", ret);
bootstrap_hang();
- } else {
puts("done.\n");
- }
- return ret;
Indentation by TAB, please!
\ No newline at end of file
And fix this, too.
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.
What do we use?
+# 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
Error handling for other architectures?
Best regards,
Wolfgang Denk

Hi Wolfgang and ML,
On Sat, Dec 4, 2010 at 11:47 PM, Wolfgang Denk wd@denx.de wrote:
Dear Luigi 'Comio' Mantellini,
Not only the commit message, also the remaining text is full of typos. Please run through a spell checker.
you are right. I will check better my english. sorry!
Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com
.gitignore | 25 ++++++- Makefile | 174 +++++++++++++++++++++++++++++++++++++++++++-
Please consider if this can be handled separately, without adding tons of new code to the top level Makefile.
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
...
Please explain why all these new images are needed?
The u-boot.bin.* images will used as payload. u-boot-bootstrap.bin.* can be dropped. can A rule u-boot.bin.* be considered safe?
@@ -39,7 +59,7 @@ /LOG /errlog /reloc_off
+/.payload.s
.payload.s is an assembler file generated at compile time to include the payload file (using .incbin directive).
???
+examples/standalone/
+setvars
???
Sorry... these are wrongs. I will remove.
+ifeq ($(CONFIG_BOOTSTRAP),y)
...
+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
Can this not go to a separate, new directory?
I would like to re-factorize again the patch(es) (if you consider this feature useful...) and I would like to better understand a possible directory structure. To cerate bootstrap, I need some (1) bootstrap specific files, some (2) non specific bootstrap files (like decompression libraries) and some (3) cut-down files (that in this patch have name like *_bootstrap.c).
Which is your suggestion to organize these files?
Regarding the (1) bootstrap specific files, like main makefile, the bootstrap.c file, I will move into a single directory. I have 2 choices: /bootsrap in the rootdir or /lib/bootstrap... I prefer the second choice. Furthermore I noticed that nand_spl and onenand_ipl code are placed into the rootdir.
Regarding the (2) non specific code, following the nand_spl and onenand_ipl examples, I should create sym links to the real code sources. Honestly, I don't like this approach but if you thinks that is a good way, I will follow. I will create a ghost u-boot tree into the bootstrap directory with little-bit different makefiles, in order to check CONFIG_BOOTSTRAP_* symbols.
Regarding the (3) cut-down fles (for example strat_bootstrap.S), I will avoid to use directly the u-boot original files, because the code is similar but not equal and I will introduce a lot of ifdef/endif to adapt the behaviour. In this case, also following the nand_spl and onenand_ipl examples, I will create a ghost tree in the /bootstrap directory for each cpu (even if I will send work for only mips)
The last question is regarding the boards that should add some bootstrap specific code... where should this code be placed? into the board/BOARD/ directory or into a directory like /bootstrap/board/BOARD/?
Sorry for these stupid questions, but I would avoid to iterate a lot of time on this work... and of course I will spend time only if this can be considered useful by community (this code is from my job and my boss asked by already to do other activities...).
+__BOOTSTRAP_LIBS := $(subst $(obj),,$(BOOTSTRAP_LIBS)) $(subst $(obj),,$(BOOTSTRAP_LIBBOARD))
Lines too long... Please fix globally.
+$(obj)u-boot.bin.gz: $(obj)u-boot.bin
- gzip -c $< > $@
...
+$(obj)u-boot.bin.bz2: $(obj)u-boot.bin
- bzip2 --best -z -c $< > $@
Do we need this in the top level Makefile?
Create compressed files can be useful. I can move into a different makefile or create suffix rules like
%.bin.bz2: %.bin bzip2 --best -z -c $< > $@
@@ -373,7 +423,7 @@ $(obj)u-boot.dis: $(obj)u-boot GEN_UBOOT = \
..
- cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
- cd $(LNDIR) && $(LD) --gc-sections $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
..
Be careful!! This will break toins of boards as you did not adapt the linker scripts!
Fixed. it was from previous experiments. I removed this from my sources.
+# 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
NAK!! Please find a way to implement this without adding all that code to the top level Makefile.
ok
+- 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.
That means you have to make adjustments to the init code of all architectures / boards. I do not see this in this patch, nor are there any preceeding patches that prepare the ground. In other words, this will not work at best, or more likely break zillions of boards.
I can propose code only for mips (that is the platform that use every day).
On which architectures / boards has this been tested?
- BOOTSTRAP_LDSCRIPT
- LD script for bootstrap code. If not defined, a board specific script will be
- used.
This is the wrong way around. Only if a board specific script is needed there should be need for such a definition; in all other cases a default script should be used.
+ifneq ($(CONFIG_BOOTSTRAP_TEXT_BASE),) +CPPFLAGS += -DCONFIG_BOOTSTRAP_TEXT_BASE=$(CONFIG_BOOTSTRAP_TEXT_BASE) +endif
This should never be necessary.
I added for symmetry respect SYS_TEXT_BASE.
+#ifdef CONFIG_BOOTSTRAP_BZIP2 +#define _CONFIG_BOOTSTRAP_RELOCATE +#define _CONFIG_BOOTSTRAP_MALLOC +// #define _CONFIG_BOOTSTRAP_FAKEMALLOC +#endif
C++ comments are not allowed. Please fix globally.
C99 :) ok
+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
Previous descriptions sounded as if all these formats were supported in parallel. Not it seems only one is at a time, and there is a search order. This must at least be documented. It would be better if an error was raised if two options are selected.
The bootstrap supports just the algo used by the linked payload. I will add a coherency code to avoid multiple algo definitions
- 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;
What's "SizeT" ?? We don;t allow such names in U-Boot.
ok SizeT is used by lzma library
- if (ret) {
- printf("failed with error %d.\n", ret);
- bootstrap_hang();
- } else {
- puts("done.\n");
- }
- return ret;
Indentation by TAB, please!
\ No newline at end of file
And fix this, too.
ok
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.
What do we use?
+# 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
Error handling for other architectures?
This is from xz embedded module and I just copied into scripts directory. I will remove xz in the next iteration.
Thanks again for your detailed review.
best regards,
luigi
Best regards,
Wolfgang Denk
-- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de ACHTUNG!!!
Das machine is nicht fur gefingerpoken und mittengrabben. Ist easy schnappen der springenwerk, blowenfusen und corkenpoppen mit spitzen- sparken. Ist nicht fur gewerken by das dummkopfen. Das rubbernecken sightseeren keepen hands in das pockets. Relaxen und vatch das blinkenlights!!! _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com --- arch/mips/config.mk | 2 +- arch/mips/cpu/Makefile | 28 ++- arch/mips/cpu/cpu.c | 12 - arch/mips/cpu/reset.c | 39 ++++ arch/mips/cpu/reset_bootstrap.c | 39 ++++ arch/mips/cpu/start_bootstrap.S | 455 +++++++++++++++++++++++++++++++++++++++ arch/mips/lib/Makefile | 15 ++- arch/mips/lib/board_bootstrap.c | 331 ++++++++++++++++++++++++++++ 8 files changed, 903 insertions(+), 18 deletions(-) create mode 100644 arch/mips/cpu/reset.c create mode 100644 arch/mips/cpu/reset_bootstrap.c create mode 100644 arch/mips/cpu/start_bootstrap.S create mode 100644 arch/mips/lib/board_bootstrap.c
diff --git a/arch/mips/config.mk b/arch/mips/config.mk index aa06761..4655169 100644 --- a/arch/mips/config.mk +++ b/arch/mips/config.mk @@ -47,6 +47,6 @@ PLATFORM_CPPFLAGS += -DCONFIG_MIPS -D__MIPS__ # On the other hand, we want PIC in the U-Boot code to relocate it from ROM # to RAM. $28 is always used as gp. # -PLATFORM_CPPFLAGS += -G 0 -mabicalls -fpic +PLATFORM_CPPFLAGS += -G 0 -mabicalls -fpic -g PLATFORM_CPPFLAGS += -msoft-float PLATFORM_LDFLAGS += -G 0 -static -n -nostdlib diff --git a/arch/mips/cpu/Makefile b/arch/mips/cpu/Makefile index 06df8d1..6a9a2af 100644 --- a/arch/mips/cpu/Makefile +++ b/arch/mips/cpu/Makefile @@ -24,25 +24,45 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(CPU).o +BOOTSTRAP_LIB = $(obj)lib$(CPU)_bootstrap.o + +BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP) = $(BOOTSTRAP_LIB)
START = start.o SOBJS-y = cache.o -COBJS-y = cpu.o interrupts.o +COBJS-y = cpu.o reset.o interrupts.o
SOBJS-$(CONFIG_INCA_IP) += incaip_wdt.o COBJS-$(CONFIG_INCA_IP) += asc_serial.o incaip_clock.o +COBJS-$(CONFIG_IFX_ASC) += ifx_asc.o COBJS-$(CONFIG_PURPLE) += asc_serial.o COBJS-$(CONFIG_SOC_AU1X00) += au1x00_eth.o au1x00_serial.o au1x00_usb_ohci.o
-SRCS := $(START:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) +BOOTSTRAP_START = start_bootstrap.o +BOOTSTRAP_START-$(CONFIG_BOOTSTRAP) += $(BOOTSTRAP_START) +BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += cpu.o interrupts.o reset_bootstrap.o +BOOTSTRAP_SOBJS-$(CONFIG_BOOTSTRAP) += cache.o +BOOTSTRAP_COBJS-$(CONFIG_IFX_ASC) += ifx_asc.o + +BOOTSTRAP_OBJS := $(addprefix $(obj),$(BOOTSTRAP_SOBJS-y) $(BOOTSTRAP_COBJS-y)) +BOOTSTRAP_START := $(addprefix $(obj),$(BOOTSTRAP_START-y)) + +SRCS := $(sort $(START:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) $(BOOTSTRAP_START-y:.o=.S) $(BOOTSTRAP_SOBJS-y:.o=.S) $(BOOTSTRAP_COBJS-y:.o=.c)) OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) START := $(addprefix $(obj),$(START))
-all: $(obj).depend $(START) $(LIB) +all: $(START) $(LIB) $(BOOTSTRAP_START-y) $(BOOTSTRAP_LIB-y)
-$(LIB): $(OBJS) +$(START): $(obj).depend + +$(LIB): $(obj).depend $(OBJS) $(call cmd_link_o_target, $(OBJS))
+$(BOOTSTRAP_START): $(obj).depend + +$(BOOTSTRAP_LIB): $(obj).depend $(BOOTSTRAP_OBJS) + $(call cmd_link_o_target, $(BOOTSTRAP_OBJS)) + #########################################################################
# defines $(obj).depend target diff --git a/arch/mips/cpu/cpu.c b/arch/mips/cpu/cpu.c index 3ae397c..45bf07c 100644 --- a/arch/mips/cpu/cpu.c +++ b/arch/mips/cpu/cpu.c @@ -38,18 +38,6 @@ : \ : "i" (op), "R" (*(unsigned char *)(addr)))
-void __attribute__((weak)) _machine_restart(void) -{ -} - -int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - _machine_restart(); - - fprintf(stderr, "*** reset failed ***\n"); - return 0; -} - void flush_cache(ulong start_addr, ulong size) { unsigned long lsize = CONFIG_SYS_CACHELINE_SIZE; diff --git a/arch/mips/cpu/reset.c b/arch/mips/cpu/reset.c new file mode 100644 index 0000000..397fb62 --- /dev/null +++ b/arch/mips/cpu/reset.c @@ -0,0 +1,39 @@ +/* + * (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 <asm/mipsregs.h> +#include <asm/reboot.h> + +void __attribute__((weak)) _machine_restart(void) +{ +} + +int __attribute__((weak)) do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + _machine_restart(); + + fprintf(stderr, "*** reset failed ***\n"); + return 0; +} diff --git a/arch/mips/cpu/reset_bootstrap.c b/arch/mips/cpu/reset_bootstrap.c new file mode 100644 index 0000000..0bef625 --- /dev/null +++ b/arch/mips/cpu/reset_bootstrap.c @@ -0,0 +1,39 @@ +/* + * (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 <asm/mipsregs.h> +#include <asm/reboot.h> + +void __attribute__((weak)) _machine_restart(void) +{ +} + +int __attribute__((weak)) do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + _machine_restart(); + + printf("*** reset failed ***\n"); + return 0; +} diff --git a/arch/mips/cpu/start_bootstrap.S b/arch/mips/cpu/start_bootstrap.S new file mode 100644 index 0000000..782e473 --- /dev/null +++ b/arch/mips/cpu/start_bootstrap.S @@ -0,0 +1,455 @@ +/* + * Startup Code for MIPS32 CPU-core base on start.S source + * + * Copyright (c) 2010 Industrie Dial Face S.p.A. + * Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com + * + * Copyright (c) 2003 Wolfgang Denk 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 <asm-offsets.h> +#include <config.h> +#include <asm/regdef.h> +#include <asm/mipsregs.h> +#include <bootstrap.h> + + /* + * For the moment disable interrupts, mark the kernel mode and + * set ST0_KX so that the CPU does not spit fire when using + * 64-bit addresses. + */ + .macro setup_c0_status set clr + .set push + mfc0 t0, CP0_STATUS + or t0, ST0_CU0 | \set | 0x1f | \clr + xor t0, 0x1f | \clr + mtc0 t0, CP0_STATUS + .set noreorder + sll zero, 3 # ehb + .set pop + .endm + + .macro setup_c0_status_reset +#ifdef CONFIG_64BIT + setup_c0_status ST0_KX 0 +#else + setup_c0_status 0 0 +#endif + .endm + +#define RVECENT(f,n) \ + b f; nop +#define XVECENT(f,bev) \ + b f ; \ + li k0,bev + + .set noreorder + + .globl _start + .text +_start: + RVECENT(reset,0) /* U-boot entry point */ + RVECENT(reset,1) /* software reboot */ +#if defined(CONFIG_INCA_IP) + .word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */ + .word 0x00000000 /* phase of the flash */ +#elif defined(CONFIG_PURPLE) + .word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */ + .word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */ +#else + RVECENT(romReserved,2) +#endif + RVECENT(romReserved,3) + RVECENT(romReserved,4) + RVECENT(romReserved,5) + RVECENT(romReserved,6) + RVECENT(romReserved,7) + RVECENT(romReserved,8) + RVECENT(romReserved,9) + RVECENT(romReserved,10) + RVECENT(romReserved,11) + RVECENT(romReserved,12) + RVECENT(romReserved,13) + RVECENT(romReserved,14) + RVECENT(romReserved,15) + RVECENT(romReserved,16) + RVECENT(romReserved,17) + RVECENT(romReserved,18) + RVECENT(romReserved,19) + RVECENT(romReserved,20) + RVECENT(romReserved,21) + RVECENT(romReserved,22) + RVECENT(romReserved,23) + RVECENT(romReserved,24) + RVECENT(romReserved,25) + RVECENT(romReserved,26) + RVECENT(romReserved,27) + RVECENT(romReserved,28) + RVECENT(romReserved,29) + RVECENT(romReserved,30) + RVECENT(romReserved,31) + RVECENT(romReserved,32) + RVECENT(romReserved,33) + RVECENT(romReserved,34) + RVECENT(romReserved,35) + RVECENT(romReserved,36) + RVECENT(romReserved,37) + RVECENT(romReserved,38) + RVECENT(romReserved,39) + RVECENT(romReserved,40) + RVECENT(romReserved,41) + RVECENT(romReserved,42) + RVECENT(romReserved,43) + RVECENT(romReserved,44) + RVECENT(romReserved,45) + RVECENT(romReserved,46) + RVECENT(romReserved,47) + RVECENT(romReserved,48) + RVECENT(romReserved,49) + RVECENT(romReserved,50) + RVECENT(romReserved,51) + RVECENT(romReserved,52) + RVECENT(romReserved,53) + RVECENT(romReserved,54) + RVECENT(romReserved,55) + RVECENT(romReserved,56) + RVECENT(romReserved,57) + RVECENT(romReserved,58) + RVECENT(romReserved,59) + RVECENT(romReserved,60) + RVECENT(romReserved,61) + RVECENT(romReserved,62) + RVECENT(romReserved,63) + XVECENT(romExcHandle,0x200) /* bfc00200: R4000 tlbmiss vector */ + RVECENT(romReserved,65) + RVECENT(romReserved,66) + RVECENT(romReserved,67) + RVECENT(romReserved,68) + RVECENT(romReserved,69) + RVECENT(romReserved,70) + RVECENT(romReserved,71) + RVECENT(romReserved,72) + RVECENT(romReserved,73) + RVECENT(romReserved,74) + RVECENT(romReserved,75) + RVECENT(romReserved,76) + RVECENT(romReserved,77) + RVECENT(romReserved,78) + RVECENT(romReserved,79) + XVECENT(romExcHandle,0x280) /* bfc00280: R4000 xtlbmiss vector */ + RVECENT(romReserved,81) + RVECENT(romReserved,82) + RVECENT(romReserved,83) + RVECENT(romReserved,84) + RVECENT(romReserved,85) + RVECENT(romReserved,86) + RVECENT(romReserved,87) + RVECENT(romReserved,88) + RVECENT(romReserved,89) + RVECENT(romReserved,90) + RVECENT(romReserved,91) + RVECENT(romReserved,92) + RVECENT(romReserved,93) + RVECENT(romReserved,94) + RVECENT(romReserved,95) + XVECENT(romExcHandle,0x300) /* bfc00300: R4000 cache vector */ + RVECENT(romReserved,97) + RVECENT(romReserved,98) + RVECENT(romReserved,99) + RVECENT(romReserved,100) + RVECENT(romReserved,101) + RVECENT(romReserved,102) + RVECENT(romReserved,103) + RVECENT(romReserved,104) + RVECENT(romReserved,105) + RVECENT(romReserved,106) + RVECENT(romReserved,107) + RVECENT(romReserved,108) + RVECENT(romReserved,109) + RVECENT(romReserved,110) + RVECENT(romReserved,111) + XVECENT(romExcHandle,0x380) /* bfc00380: R4000 general vector */ + RVECENT(romReserved,113) + RVECENT(romReserved,114) + RVECENT(romReserved,115) + RVECENT(romReserved,116) + RVECENT(romReserved,116) + RVECENT(romReserved,118) + RVECENT(romReserved,119) + RVECENT(romReserved,120) + RVECENT(romReserved,121) + RVECENT(romReserved,122) + RVECENT(romReserved,123) + RVECENT(romReserved,124) + RVECENT(romReserved,125) + RVECENT(romReserved,126) + RVECENT(romReserved,127) + + /* We hope there are no more reserved vectors! + * 128 * 8 == 1024 == 0x400 + * so this is address R_VEC+0x400 == 0xbfc00400 + */ +#ifdef CONFIG_PURPLE +/* 0xbfc00400 */ + .word 0xdc870000 + .word 0xfca70000 + .word 0x20840008 + .word 0x20a50008 + .word 0x20c6ffff + .word 0x14c0fffa + .word 0x00000000 + .word 0x03e00008 + .word 0x00000000 + .word 0x00000000 +/* 0xbfc00428 */ + .word 0xdc870000 + .word 0xfca70000 + .word 0x20840008 + .word 0x20a50008 + .word 0x20c6ffff + .word 0x14c0fffa + .word 0x00000000 + .word 0x03e00008 + .word 0x00000000 + .word 0x00000000 +#endif /* CONFIG_PURPLE */ + .align 4 +reset: + + /* Clear watch registers. + */ + mtc0 zero, CP0_WATCHLO + mtc0 zero, CP0_WATCHHI + + /* WP(Watch Pending), SW0/1 should be cleared. */ + mtc0 zero, CP0_CAUSE + + setup_c0_status_reset + + /* Init Timer */ + mtc0 zero, CP0_COUNT + mtc0 zero, CP0_COMPARE + +#if !defined(CONFIG_BOOTSTRAP_SKIP_LOWLEVEL_INIT) + /* CONFIG0 register */ + li t0, CONF_CM_UNCACHED + mtc0 t0, CP0_CONFIG +#endif /* !CONFIG_SKIP_LOWLEVEL_INIT */ + + /* Initialize $gp. + */ + bal 1f + nop + .word _gp +1: + lw gp, 0(ra) + +#if !defined(CONFIG_BOOTSTRAP_SKIP_LOWLEVEL_INIT) + /* Initialize any external memory. + */ + la t9, lowlevel_init + jalr t9 + nop + + /* Initialize caches... + */ + la t9, mips_cache_reset + jalr t9 + nop + + /* ... and enable them. + */ + li t0, CONF_CM_CACHABLE_NONCOHERENT + mtc0 t0, CP0_CONFIG +#endif /* !CONFIG_SKIP_LOWLEVEL_INIT */ + + /* Set up temporary stack. + */ +#ifdef CONFIG_SYS_INIT_RAM_LOCK_MIPS + li a0, CONFIG_SYS_INIT_SP_OFFSET + la t9, mips_cache_lock + jalr t9 + nop +#endif + + li t0, CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_INIT_SP_OFFSET + la sp, 0(t0) + + la t9, bootstrap_board_init_f + jr t9 + nop + +#if defined(_CONFIG_BOOTSTRAP_RELOCATE) +/* + * void relocate_code (addr_sp, gd, addr_moni) + * + * This "function" does not return, instead it continues in RAM + * after relocating the monitor code. + * + * a0 = addr_sp + * a1 = gd + * a2 = destination address + */ + .globl relocate_code + .ent relocate_code +relocate_code: + move sp, a0 /* Set new stack pointer */ + + li t0, CONFIG_BOOTSTRAP_TEXT_BASE + la t3, in_ram + lw t2, -12(t3) /* t2 <-- uboot_end_data */ + move t1, a2 + move s2, a2 /* s2 <-- destination address */ + + /* + * Fix $gp: + * + * New $gp = (Old $gp - CONFIG_SYS_MONITOR_BASE) + Destination Address + */ + move t6, gp + sub gp, CONFIG_BOOTSTRAP_TEXT_BASE + add gp, a2 /* gp now adjusted */ + sub s1, gp, t6 /* s1 <-- relocation offset */ + + /* + * t0 = source address + * t1 = target address + * t2 = source end address + */ + + /* + * Save destination address and size for later usage in flush_cache() + */ + move s0, a1 /* save gd in s0 */ + move a0, t1 /* a0 <-- destination addr */ + sub a1, t2, t0 /* a1 <-- size */ + + /* On the purple board we copy the code earlier in a special way + * in order to solve flash problems + */ +#ifndef CONFIG_PURPLE +1: + lw t3, 0(t0) + sw t3, 0(t1) + addu t0, 4 + ble t0, t2, 1b + addu t1, 4 /* delay slot */ +#endif + + /* If caches were enabled, we would have to flush them here. + */ + + /* a0 & a1 are already set up for flush_cache(start, size) */ + la t9, flush_cache + jalr t9 + nop + + /* Jump to where we've relocated ourselves. + */ + addi t0, s2, in_ram - _start + jr t0 + nop + + .word _gp + .word _GLOBAL_OFFSET_TABLE_ + .word uboot_end_data + .word uboot_end + .word num_got_entries + +in_ram: + /* + * Now we want to update GOT. + * + * GOT[0] is reserved. GOT[1] is also reserved for the dynamic object + * generated by GNU ld. Skip these reserved entries from relocation. + */ + lw t3, -4(t0) /* t3 <-- num_got_entries */ + lw t4, -16(t0) /* t4 <-- _GLOBAL_OFFSET_TABLE_ */ + lw t5, -20(t0) /* t5 <-- _gp */ + sub t4, t5 /* compute offset*/ + add t4, t4, gp /* t4 now holds relocated _GLOBAL_OFFSET_TABLE_ */ + addi t4, t4, 8 /* Skipping first two entries. */ + li t2, 2 +1: + lw t1, 0(t4) + beqz t1, 2f + add t1, s1 + sw t1, 0(t4) +2: + addi t2, 1 + blt t2, t3, 1b + addi t4, 4 /* delay slot */ + + /* Clear BSS. + */ + lw t1, -12(t0) /* t1 <-- uboot_end_data */ + lw t2, -8(t0) /* t2 <-- uboot_end */ + add t1, s1 /* adjust pointers */ + add t2, s1 + + sub t1, 4 +1: + addi t1, 4 + bltl t1, t2, 1b + sw zero, 0(t1) /* delay slot */ + + move a0, s0 /* a0 <-- gd */ + la t9, bootstrap_board_init_r + jr t9 + move a1, s2 /* delay slot */ + + .end relocate_code +#endif + +/* + * void copy_and_jump (void) + * + * This function copies/unzips the u-boot image and runs it. + * This "function" does not return + * +*/ + .globl copy_and_jump + .ent copy_and_jump +copy_and_jump: + + /* copy_uboot(CONFIG_SYS_MONITOR_BASE, payload_uncsize, payload_start, payload_size) */ + li a0, CONFIG_SYS_MONITOR_BASE + la a1, payload_uncsize + lw a1, 0(a1) + la a2, payload_start + la a3, payload_size + la t9, copy_uboot + jalr t9 + lw a3, 0(a3) /* delay slot */ + + li t9, CONFIG_SYS_MONITOR_BASE + jr t9 + nop + + .end copy_and_jump + + /* Exception handlers. + */ +romReserved: + b romReserved + +romExcHandle: + b romExcHandle diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index 4e90704..3570581 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile @@ -24,6 +24,9 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(ARCH).o +BOOTSTRAP_LIB = $(obj)lib$(ARCH)_bootstrap.o + +BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP) = $(BOOTSTRAP_LIB)
SOBJS-y +=
@@ -35,12 +38,22 @@ COBJS-y += bootm.o endif COBJS-y += time.o
-SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) +BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += board_bootstrap.o +BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += time.o + +BOOTSTRAP_OBJS := $(addprefix $(obj),$(BOOTSTRAP_SOBJS-y) $(BOOTSTRAP_COBJS-y)) + +SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) $(BOOTSTRAP_SOBJS-y:.o=.S) $(BOOTSTRAP_COBJS-y:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
+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/arch/mips/lib/board_bootstrap.c b/arch/mips/lib/board_bootstrap.c new file mode 100644 index 0000000..8c1b205 --- /dev/null +++ b/arch/mips/lib/board_bootstrap.c @@ -0,0 +1,331 @@ +/* + * (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 <bootstrap.h> +#include <malloc.h> + +DECLARE_GLOBAL_DATA_PTR; + +extern int timer_init(void); + +extern int incaip_set_cpuclk(void); + +extern ulong uboot_end_data; +extern ulong uboot_end; + +extern void copy_and_jump(void); + +static char *failed = "*** failed ***\n"; + +/* + * mips_io_port_base is the begin of the address space to which x86 style + * I/O ports are mapped. + */ +unsigned long mips_io_port_base = -1; + +int __board_early_init_f(void) +{ + /* + * Nothing to do in this dummy implementation + */ + return 0; +} + +#if defined(_CONFIG_BOOTSTRAP_FAKEMALLOC) +static void fake_malloc_init(void) +{ + ulong addr; + void *ptr; + uint *status; + uint *count; + + addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size; + addr &= ~(4096 - 1); + addr -= TOTAL_MALLOC_LEN; + + status = (void *)addr; + count = (void *)(addr + sizeof(uint)); + + *status = addr + 16; + *count = 0; + + debug ("Init fake memory manager @%08lx total %d\n", addr, TOTAL_MALLOC_LEN - 16); +} + +static void *__fake_malloc(size_t n) +{ + ulong addr; + void *ptr; + uint *status; + uint *count; + + addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size; + addr &= ~(4096 - 1); + addr -= TOTAL_MALLOC_LEN; + + status = (uint *)addr; + count = (uint *)(addr + sizeof(uint)); + ptr = (void *)(*status); + + if (!ptr || *count + n> (TOTAL_MALLOC_LEN - 16)) { + /* Memory already used */ + debug ("No enough memory\n"); + + return NULL; + } + + *count += n; + *status += n; + + debug ("Allocate memory @%08lx / %d (available %d)\n", (ulong)ptr, n, TOTAL_MALLOC_LEN - 16 - *count); + + return ptr; +} + +static void __fake_free(void *ptr) +{ + debug ("Free memory @%08lx\n", (ulong)ptr); + + return; +} + +void *malloc(size_t) __attribute__((weak, alias("__fake_malloc"))); +void free(void *) __attribute__((weak, alias("__fake_free"))); +#endif + +int board_early_init_f(void) __attribute__((weak, alias("__board_early_init_f"))); +int bootstrap_board_early_init_f(void) __attribute__((weak, alias("board_early_init_f"))); + +static int bootstrap_init_func_ram (void) +{ + if ((gd->ram_size = bootstrap_initdram (0)) > 0) { + return (0); + } + puts (failed); + return (1); +} + +static int bootstrap_display_banner(void) +{ + puts ("bootstrap..."); + return (0); +} + +static int bootstrap_init_baudrate (void) +{ +#if defined(CONFIG_BOOTSTRAP_BAUDRATE) + gd->baudrate = CONFIG_BOOTSTRAP_BAUDRATE; +#else + gd->baudrate = CONFIG_BAUDRATE; +#endif + return 0; +} + +/* + * Breath some life into the board... + * + * The first part of initialization is running from Flash memory; + * its main purpose is to initialize the RAM so that we + * can relocate the monitor code to RAM. + */ + +/* + * All attempts to come up with a "common" initialization sequence + * that works for all boards and architectures failed: some of the + * requirements are just _too_ different. To get rid of the resulting + * mess of board dependend #ifdef'ed code we now make the whole + * initialization sequence configurable to the user. + * + * The requirements for any new initalization function is simple: it + * receives a pointer to the "global data" structure as it's only + * argument, and returns an integer return code, where 0 means + * "continue" and != 0 means "fatal error, hang the system". + */ +typedef int (init_fnc_t) (void); + +static init_fnc_t *init_sequence[] = { + bootstrap_board_early_init_f, + timer_init, + bootstrap_init_baudrate,/* initialze baudrate settings */ + serial_init, /* serial communications setup */ + bootstrap_display_banner, /* say that we are here */ + bootstrap_checkboard, + bootstrap_init_func_ram, + NULL, +}; + + +void bootstrap_board_init_f(ulong bootflag) +{ + gd_t gd_data, *id; + bd_t *bd; + init_fnc_t **init_fnc_ptr; + ulong addr, addr_sp, len = (ulong)&uboot_end - CONFIG_BOOTSTRAP_TEXT_BASE; + ulong *s; + + /* Pointer is writable since we allocated a register for it. + */ + gd = &gd_data; + /* compiler optimization barrier needed for GCC >= 3.4 */ + __asm__ __volatile__("": : :"memory"); + + memset ((void *)gd, 0, sizeof (gd_t)); + + for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { + if ((*init_fnc_ptr)() != 0) { + bootstrap_hang (); + } + } + + /* + * Now that we have DRAM mapped and working, we can + * relocate the code and continue running from DRAM. + */ + addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size; + + /* We can reserve some RAM "on top" here. + */ + + /* round down to next 4 kB limit. + */ + addr &= ~(4096 - 1); + debug ("Top of RAM usable for U-Boot at: %08lx\n", addr); + +#if defined(_CONFIG_BOOTSTRAP_RELOCATE) + /* Reserve memory for U-Boot code, data & bss + * round down to next 16 kB limit + */ + addr -= len; + addr &= ~(16 * 1024 - 1); + + debug ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr); +#endif + +#if defined(_CONFIG_BOOTSTRAP_MALLOC) + /* Reserve memory for malloc() arena. + */ + addr_sp = addr - TOTAL_MALLOC_LEN; + debug ("Reserving %dk for malloc() at: %08lx\n", + TOTAL_MALLOC_LEN >> 10, addr_sp); +#else + addr_sp = addr; +#endif + +#if defined(_CONFIG_BOOTSTRAP_FAKEMALLOC) + fake_malloc_init(); +#endif + + /* + * (permanently) allocate a Board Info struct + * and a permanent copy of the "global" data + */ + addr_sp -= sizeof(bd_t); + bd = (bd_t *)addr_sp; + gd->bd = bd; + debug ("Reserving %zu Bytes for Board Info at: %08lx\n", + sizeof(bd_t), addr_sp); + + addr_sp -= sizeof(gd_t); + id = (gd_t *)addr_sp; + debug ("Reserving %zu Bytes for Global Data at: %08lx\n", + sizeof (gd_t), addr_sp); + + /* + * Finally, we set up a new (bigger) stack. + * + * Leave some safety gap for SP, force alignment on 16 byte boundary + * Clear initial stack frame + */ + addr_sp -= 16; + addr_sp &= ~0xF; + s = (ulong *)addr_sp; + *s-- = 0; + *s-- = 0; + addr_sp = (ulong)s; + debug ("Stack Pointer at: %08lx\n", addr_sp); + + /* + * Save local variables to board info struct + */ + bd->bi_memstart = CONFIG_SYS_SDRAM_BASE; /* start of DRAM memory */ + bd->bi_memsize = gd->ram_size; /* size of DRAM memory in bytes */ + bd->bi_baudrate = gd->baudrate; /* Console Baudrate */ + + memcpy (id, (void *)gd, sizeof (gd_t)); + +#if defined(_CONFIG_BOOTSTRAP_RELOCATE) + relocate_code (addr_sp, id, addr); +#else + copy_and_jump(); +#endif + + /* NOTREACHED - relocate_code() does not return */ +} +/************************************************************************ + * + * This is the next part if the initialization sequence: we are now + * running from RAM and have a "normal" C environment, i. e. global + * data can be written, BSS has been cleared, the stack size in not + * that critical any more, etc. + * + ************************************************************************ + */ + +#if defined(_CONFIG_BOOTSTRAP_RELOCATE) +void bootstrap_board_init_r (gd_t *id, ulong dest_addr) +{ + extern void malloc_bin_reloc (void); + + bd_t *bd; + + gd = id; + gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ + + debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr); + + gd->reloc_off = dest_addr - CONFIG_BOOTSTRAP_TEXT_BASE; + + bd = gd->bd; + +#if defined(_CONFIG_BOOTSTRAP_MALLOC) && !defined(_CONFIG_BOOTSTRAP_FAKEMALLOC) + /* The Malloc area is immediately below the monitor copy in DRAM */ + mem_malloc_init(CONFIG_BOOTSTRAP_TEXT_BASE + gd->reloc_off - + TOTAL_MALLOC_LEN, TOTAL_MALLOC_LEN); + malloc_bin_reloc(); +#endif + + copy_and_jump(); + + /* NOTREACHED - no way out of command loop except booting */ +} +#endif + +void bootstrap_hang (void) +{ + puts ("### ERROR ### Please RESET the board ###\n"); + for (;;); +}

Dear Luigi 'Comio' Mantellini,
In message 1291469358-25023-6-git-send-email-luigi.mantellini@idf-hit.com you wrote:
Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com
arch/mips/config.mk | 2 +- arch/mips/cpu/Makefile | 28 ++- arch/mips/cpu/cpu.c | 12 - arch/mips/cpu/reset.c | 39 ++++ arch/mips/cpu/reset_bootstrap.c | 39 ++++ arch/mips/cpu/start_bootstrap.S | 455 +++++++++++++++++++++++++++++++++++++++ arch/mips/lib/Makefile | 15 ++- arch/mips/lib/board_bootstrap.c | 331 ++++++++++++++++++++++++++++ 8 files changed, 903 insertions(+), 18 deletions(-) create mode 100644 arch/mips/cpu/reset.c create mode 100644 arch/mips/cpu/reset_bootstrap.c create mode 100644 arch/mips/cpu/start_bootstrap.S create mode 100644 arch/mips/lib/board_bootstrap.c
diff --git a/arch/mips/config.mk b/arch/mips/config.mk index aa06761..4655169 100644 --- a/arch/mips/config.mk +++ b/arch/mips/config.mk @@ -47,6 +47,6 @@ PLATFORM_CPPFLAGS += -DCONFIG_MIPS -D__MIPS__ # On the other hand, we want PIC in the U-Boot code to relocate it from ROM # to RAM. $28 is always used as gp. # -PLATFORM_CPPFLAGS += -G 0 -mabicalls -fpic +PLATFORM_CPPFLAGS += -G 0 -mabicalls -fpic -g PLATFORM_CPPFLAGS += -msoft-float PLATFORM_LDFLAGS += -G 0 -static -n -nostdlib
Please don't enable globally!
diff --git a/arch/mips/cpu/Makefile b/arch/mips/cpu/Makefile index 06df8d1..6a9a2af 100644 --- a/arch/mips/cpu/Makefile +++ b/arch/mips/cpu/Makefile @@ -24,25 +24,45 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(CPU).o +BOOTSTRAP_LIB = $(obj)lib$(CPU)_bootstrap.o
+BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP) = $(BOOTSTRAP_LIB)
START = start.o SOBJS-y = cache.o -COBJS-y = cpu.o interrupts.o +COBJS-y = cpu.o reset.o interrupts.o
SOBJS-$(CONFIG_INCA_IP) += incaip_wdt.o COBJS-$(CONFIG_INCA_IP) += asc_serial.o incaip_clock.o +COBJS-$(CONFIG_IFX_ASC) += ifx_asc.o COBJS-$(CONFIG_PURPLE) += asc_serial.o COBJS-$(CONFIG_SOC_AU1X00) += au1x00_eth.o au1x00_serial.o au1x00_usb_ohci.o
Please keep vertical alignment.
+SRCS := $(sort $(START:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) $(BOOTSTRAP_START-y:.o=.S) $(BOOTSTRAP_SOBJS-y:.o=.S) $(BOOTSTRAP_COBJS-y:.o=.c))
Line too long. Please fix globally.
--- a/arch/mips/cpu/cpu.c +++ b/arch/mips/cpu/cpu.c @@ -38,18 +38,6 @@ : \ : "i" (op), "R" (*(unsigned char *)(addr)))
-void __attribute__((weak)) _machine_restart(void) -{ -}
-int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{
- _machine_restart();
- fprintf(stderr, "*** reset failed ***\n");
- return 0;
-}
Why do you move this code?
--- /dev/null +++ b/arch/mips/lib/board_bootstrap.c
...
This copies a lot of code from lib/board.c; can we avoid this code duplication?
Best regards,
Wolfgang Denk

Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com --- board/qemu-mips/Makefile | 15 ++++++- board/qemu-mips/config.mk | 7 ++- board/qemu-mips/qemu-mips_bootstrap.c | 48 +++++++++++++++++++++ board/qemu-mips/u-boot-bootstrap.lds | 73 +++++++++++++++++++++++++++++++++ include/configs/qemu-mips.h | 15 ++++++- 5 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 board/qemu-mips/qemu-mips_bootstrap.c create mode 100644 board/qemu-mips/u-boot-bootstrap.lds
diff --git a/board/qemu-mips/Makefile b/board/qemu-mips/Makefile index 6251bb8..bcb6fd5 100644 --- a/board/qemu-mips/Makefile +++ b/board/qemu-mips/Makefile @@ -24,17 +24,30 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).o +BOOTSTRAP_LIB = $(obj)lib$(BOARD)_bootstrap.o + +BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP) = $(BOOTSTRAP_LIB)
COBJS = $(BOARD).o SOBJS = lowlevel_init.o
-SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) = $(BOARD)_bootstrap.o +BOOTSTRAP_SOBJS-$(CONFIG_BOOTSTRAP) = lowlevel_init.o + +BOOTSTRAP_SRCS := $(BOOTSTRAP_SOBJS-y:.o=.S) $(BOOTSTRAP_COBJS-y:.o=.c) +BOOTSTRAP_OBJS := $(addprefix $(obj),$(BOOTSTRAP_COBJS-y)) +BOOTSTRAP_SOBJS := $(addprefix $(obj),$(BOOTSTRAP_SOBJS-y)) + +SRCS := $(sort $(SOBJS:.o=.S) $(COBJS:.o=.c) $(BOOTSTRAP_SOBJS)) OBJS := $(addprefix $(obj),$(COBJS)) SOBJS := $(addprefix $(obj),$(SOBJS))
$(LIB): $(OBJS) $(SOBJS) $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+$(BOOTSTRAP_LIB): $(BOOTSTRAP_OBJS) $(BOOTSTRAP_SOBJS) + $(call cmd_link_o_target, $(BOOTSTRAP_OBJS) $(BOOTSTRAP_SOBJS)) + #########################################################################
# defines $(obj).depend target diff --git a/board/qemu-mips/config.mk b/board/qemu-mips/config.mk index 27cd34a..50276ff 100644 --- a/board/qemu-mips/config.mk +++ b/board/qemu-mips/config.mk @@ -3,8 +3,11 @@ # See http://fabrice.bellard.free.fr/qemu #
+ifeq ($(CONFIG_BOOTSTRAP),) # ROM version CONFIG_SYS_TEXT_BASE = 0xbfc00000 - +else # RAM version -#CONFIG_SYS_TEXT_BASE = 0x80001000 +CONFIG_SYS_TEXT_BASE = 0x80001000 +CONFIG_BOOTSTRAP_TEXT_BASE = 0xbfc00000 +endif \ No newline at end of file diff --git a/board/qemu-mips/qemu-mips_bootstrap.c b/board/qemu-mips/qemu-mips_bootstrap.c new file mode 100644 index 0000000..e139d67 --- /dev/null +++ b/board/qemu-mips/qemu-mips_bootstrap.c @@ -0,0 +1,48 @@ +/* + * (C) Copyright 2010 Industrie Dial Face S.p.A. + * Luigi 'Comio' Mantellini, luigi.mantellini@idf-hit.com + * + * (C) Copyright 2007 + * Vlad Lungu vlad.lungu@windriver.com + * + * 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 <asm/mipsregs.h> +#include <asm/io.h> + +phys_size_t bootstrap_initdram(int board_type) +{ + /* Sdram is setup by assembler code */ + /* If memory could be changed, we should return the true value here */ + return MEM_SIZE*1024*1024; +} + +int bootstrap_checkboard(void) +{ + return 0; +} + +int bootstrap_misc_init_r(void) +{ + set_io_port_base(0); + return 0; +} diff --git a/board/qemu-mips/u-boot-bootstrap.lds b/board/qemu-mips/u-boot-bootstrap.lds new file mode 100644 index 0000000..0e74580 --- /dev/null +++ b/board/qemu-mips/u-boot-bootstrap.lds @@ -0,0 +1,73 @@ +/* + * (C) Copyright 2010 Industrie Dial Face S.p.A. + * Luigi 'Comio' Mantellini, luigi.mantellini@idf-hit.com + * + * (C) Copyright 2003 + * Wolfgang Denk 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 + */ + +/* +OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips") +*/ +OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips") +OUTPUT_ARCH(mips) +ENTRY(_start) +SECTIONS +{ + . = 0x00000000; + + . = ALIGN(4); + .text : + { + *(.text) + } + + . = ALIGN(4); + .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } + + . = ALIGN(4); + .data : { *(.data) } + + . = .; + _gp = ALIGN(16) +0x7ff0; + + .got : { + __got_start = .; + *(.got) + __got_end = .; + } + + . = ALIGN(4); + .sdata : { *(.sdata) } + + . = .; + . = ALIGN(4); + .payload : { *(.payload) } + . = ALIGN(4); + + uboot_end_data = .; + num_got_entries = (__got_end - __got_start) >> 2; + + . = ALIGN(4); + .sbss : { *(.sbss) } + .bss : { *(.bss) . = ALIGN(4); } + uboot_end = .; +} diff --git a/include/configs/qemu-mips.h b/include/configs/qemu-mips.h index fb697d5..2337a32 100644 --- a/include/configs/qemu-mips.h +++ b/include/configs/qemu-mips.h @@ -114,7 +114,7 @@ #define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */ #define CONFIG_SYS_MAXARGS 16 /* max number of command args */
-#define CONFIG_SYS_MALLOC_LEN 128*1024 +#define CONFIG_SYS_MALLOC_LEN 4*1024*1024
#define CONFIG_SYS_BOOTPARAMS_LEN 128*1024
@@ -172,4 +172,17 @@ #define CONFIG_SYS_ICACHE_SIZE 16384 #define CONFIG_SYS_CACHELINE_SIZE 32
+/* Support for compressed u-boot image */ +#define CONFIG_BOOTSTRAP +#ifdef CONFIG_BOOTSTRAP +#define CONFIG_BOOTSTRAP_BASE CONFIG_BOOTSTRAP_TEXT_BASE +#define CONFIG_BOOTSTRAP_BAUDRATE CONFIG_BAUDRATE +#define CONFIG_SKIP_LOWLEVEL_INIT +// #define CONFIG_BOOTSTRAP_BZIP2 /* Use BZIP2 payload */ +// #define CONFIG_BOOTSTRAP_GZIP /* Use GZIP payload */ +// #define CONFIG_BOOTSTRAP_LZMA /* Use LZMA payload */ +// #define CONFIG_BOOTSTRAP_LZO /* Use LZO payload */ +#define CONFIG_BOOTSTRAP_XZ /* Use XZ payload */ +#endif + #endif /* __CONFIG_H */

Dear Luigi 'Comio' Mantellini,
In message 1291469358-25023-7-git-send-email-luigi.mantellini@idf-hit.com you wrote:
Signed-off-by: Luigi 'Comio' Mantellini luigi.mantellini@idf-hit.com
board/qemu-mips/Makefile | 15 ++++++- board/qemu-mips/config.mk | 7 ++- board/qemu-mips/qemu-mips_bootstrap.c | 48 +++++++++++++++++++++ board/qemu-mips/u-boot-bootstrap.lds | 73 +++++++++++++++++++++++++++++++++ include/configs/qemu-mips.h | 15 ++++++- 5 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 board/qemu-mips/qemu-mips_bootstrap.c create mode 100644 board/qemu-mips/u-boot-bootstrap.lds
...
--- a/board/qemu-mips/config.mk +++ b/board/qemu-mips/config.mk @@ -3,8 +3,11 @@ # See http://fabrice.bellard.free.fr/qemu #
+ifeq ($(CONFIG_BOOTSTRAP),) # ROM version CONFIG_SYS_TEXT_BASE = 0xbfc00000
+else # RAM version -#CONFIG_SYS_TEXT_BASE = 0x80001000 +CONFIG_SYS_TEXT_BASE = 0x80001000 +CONFIG_BOOTSTRAP_TEXT_BASE = 0xbfc00000
Please move all thse settings out of the config.mk into the board config file.
+endif \ No newline at end of file
Fix this too, please.
diff --git a/include/configs/qemu-mips.h b/include/configs/qemu-mips.h index fb697d5..2337a32 100644 --- a/include/configs/qemu-mips.h +++ b/include/configs/qemu-mips.h @@ -114,7 +114,7 @@ #define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */ #define CONFIG_SYS_MAXARGS 16 /* max number of command args */
-#define CONFIG_SYS_MALLOC_LEN 128*1024 +#define CONFIG_SYS_MALLOC_LEN 4*1024*1024
Is this unconditionally needed?
+/* Support for compressed u-boot image */ +#define CONFIG_BOOTSTRAP +#ifdef CONFIG_BOOTSTRAP +#define CONFIG_BOOTSTRAP_BASE CONFIG_BOOTSTRAP_TEXT_BASE +#define CONFIG_BOOTSTRAP_BAUDRATE CONFIG_BAUDRATE +#define CONFIG_SKIP_LOWLEVEL_INIT +// #define CONFIG_BOOTSTRAP_BZIP2 /* Use BZIP2 payload */ +// #define CONFIG_BOOTSTRAP_GZIP /* Use GZIP payload */ +// #define CONFIG_BOOTSTRAP_LZMA /* Use LZMA payload */ +// #define CONFIG_BOOTSTRAP_LZO /* Use LZO payload */ +#define CONFIG_BOOTSTRAP_XZ /* Use XZ payload */ +#endif
C++ comments not allowed. And please do not add dead code.
Best regards,
Wolfgang Denk
participants (4)
-
Joakim Tjernlund
-
Luigi 'Comio' Mantellini
-
Luigi Mantellini
-
Wolfgang Denk