summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--target/linux/adm5120-2.6/image/lzma-loader/Makefile16
-rw-r--r--target/linux/adm5120-2.6/image/lzma-loader/src/Makefile59
-rw-r--r--target/linux/adm5120-2.6/image/lzma-loader/src/decompress.c26
-rw-r--r--target/linux/adm5120-2.6/image/lzma-loader/src/decompress.lds.in20
-rw-r--r--target/linux/adm5120-2.6/image/lzma-loader/src/head.S72
-rw-r--r--target/linux/adm5120-2.6/image/lzma-loader/src/loader.lds.in14
6 files changed, 113 insertions, 94 deletions
diff --git a/target/linux/adm5120-2.6/image/lzma-loader/Makefile b/target/linux/adm5120-2.6/image/lzma-loader/Makefile
index e2afb186e..8ce268823 100644
--- a/target/linux/adm5120-2.6/image/lzma-loader/Makefile
+++ b/target/linux/adm5120-2.6/image/lzma-loader/Makefile
@@ -1,4 +1,4 @@
-#
+#
# Copyright (C) 2006 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
@@ -8,6 +8,9 @@
include $(TOPDIR)/rules.mk
+LOADER := loader
+BZ_STARTUP_ORG := 0
+
PKG_NAME := lzma-loader
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
@@ -16,18 +19,19 @@ $(PKG_BUILD_DIR)/.prepared:
$(CP) ./src/* $(PKG_BUILD_DIR)/
touch $@
-$(PKG_BUILD_DIR)/loader.gz: $(PKG_BUILD_DIR)/.prepared
+$(PKG_BUILD_DIR)/$(LOADER).gz: $(PKG_BUILD_DIR)/.prepared
$(MAKE) -C $(PKG_BUILD_DIR) CC="$(TARGET_CC)" \
- LD="$(TARGET_CROSS)ld" CROSS_COMPILE="$(TARGET_CROSS)"
+ LD="$(TARGET_CROSS)ld" CROSS_COMPILE="$(TARGET_CROSS)" \
+ LOADER=$(LOADER) BZ_STARTUP_ORG=$(BZ_STARTUP_ORG)
-download:
+download:
prepare: $(PKG_BUILD_DIR)/.prepared
-compile: $(PKG_BUILD_DIR)/loader.gz
+compile: $(PKG_BUILD_DIR)/$(LOADER).gz
install:
ifneq ($(TARGET),)
install: compile
- $(CP) $(PKG_BUILD_DIR)/loader.gz $(PKG_BUILD_DIR)/loader.elf $(TARGET)/
+ $(CP) $(PKG_BUILD_DIR)/$(LOADER).gz $(PKG_BUILD_DIR)/$(LOADER).elf $(TARGET)/
endif
clean:
diff --git a/target/linux/adm5120-2.6/image/lzma-loader/src/Makefile b/target/linux/adm5120-2.6/image/lzma-loader/src/Makefile
index 85a864674..e94be307d 100644
--- a/target/linux/adm5120-2.6/image/lzma-loader/src/Makefile
+++ b/target/linux/adm5120-2.6/image/lzma-loader/src/Makefile
@@ -3,7 +3,7 @@
#
# Copyright 2001-2003, Broadcom Corporation
# All Rights Reserved.
-#
+#
# THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
# KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
# SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
@@ -16,9 +16,15 @@
# Copyright 2005 Oleg I. Vdovikin <oleg@cs.msu.su>
# Cleaned up, modified for lzma support, removed from kernel
#
+# Copyright 2007 Gabor Juhos <juhosg@freemail.hu>
+# Modified to support user defined entry point address.
+# Added support for make targets with different names
+#
-TEXT_START := 0x80001000
+LOADADDR := 0x80001000
BZ_TEXT_START := 0x80300000
+BZ_STARTUP_ORG := 0
+LOADER := loader
OBJCOPY := $(CROSS_COMPILE)objcopy -O binary -R .reginfo -R .note -R .comment -R .mdebug -S
@@ -26,52 +32,41 @@ CFLAGS = -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -Os \
-fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic \
-ffunction-sections -pipe -mlong-calls -fno-common \
-mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap
-CFLAGS += -DLOADADDR=$(TEXT_START) -D_LZMA_IN_CB
+CFLAGS += -DLOADADDR=$(LOADADDR) -D_LZMA_IN_CB
-ASFLAGS = $(CFLAGS) -D__ASSEMBLY__ -DBZ_TEXT_START=$(BZ_TEXT_START)
+ASFLAGS = $(CFLAGS) -D__ASSEMBLY__ -DBZ_STARTUP_ORG=$(BZ_STARTUP_ORG)
-SEDFLAGS := s/BZ_TEXT_START/$(BZ_TEXT_START)/;s/TEXT_START/$(TEXT_START)/
+LDFLAGS = -static --gc-sections -no-warn-mismatch
+LDFLAGS += -e startup -Ttext $(BZ_TEXT_START) -T loader.lds.in
-OBJECTS := head.o data.o
+OBJECTS := $(LOADER)-head.o decompress.o LzmaDecode.o
-all: loader.gz loader.elf
+all: $(LOADER).gz $(LOADER).elf
# Don't build dependencies, this may die if $(CC) isn't gcc
dep:
install:
-loader.gz: loader
- gzip -nc9 $< > $@
-
-loader.elf: loader.o
- cp $< $@
-
-loader: loader.o
- $(OBJCOPY) $< $@
-
-loader.o: loader.lds $(OBJECTS)
- $(LD) -static --gc-sections -no-warn-mismatch -T loader.lds -o $@ $(OBJECTS)
-
-loader.lds: loader.lds.in Makefile
- @sed "$(SEDFLAGS)" < $< > $@
+decompress.o:
+ $(CC) $(CFLAGS) -c decompress.c -o $@
-data.o: data.lds decompress.image
- $(LD) -no-warn-mismatch -T data.lds -r -o $@ -b binary decompress.image -b elf32-tradlittlemips
+$(LOADER)-head.o:
+ $(CC) $(ASFLAGS) -c head.S -o $@
-data.lds:
- @echo "SECTIONS { .data : { code_start = .; *(.data) code_stop = .; }}" > $@
+$(LOADER).gz: $(LOADER).bin
+ gzip -nc9 $< > $@
-decompress.image: decompress
- $(OBJCOPY) $< $@
+$(LOADER).elf: $(LOADER).o
+ cp $< $@
-decompress: decompress.lds decompress.o LzmaDecode.o
- $(LD) -static --gc-sections -no-warn-mismatch -T decompress.lds -o $@ decompress.o LzmaDecode.o
+$(LOADER).bin: $(LOADER).o
+ $(OBJCOPY) -O binary $< $@
-decompress.lds: decompress.lds.in Makefile
- @sed "$(SEDFLAGS)" < $< > $@
+$(LOADER).o: $(OBJECTS)
+ $(LD) $(LDFLAGS) -o $@ $(OBJECTS)
mrproper: clean
clean:
- rm -f loader.gz loader decompress *.lds *.o *.image
+ rm -f *.gz *.elf *.bin *.o
diff --git a/target/linux/adm5120-2.6/image/lzma-loader/src/decompress.c b/target/linux/adm5120-2.6/image/lzma-loader/src/decompress.c
index d3610241f..ec63ccb65 100644
--- a/target/linux/adm5120-2.6/image/lzma-loader/src/decompress.c
+++ b/target/linux/adm5120-2.6/image/lzma-loader/src/decompress.c
@@ -109,10 +109,10 @@ static int read_byte(void *object, unsigned char **buffer, UInt32 *bufferSize)
val = *(unsigned int *)data;
data += 4;
}
-
+
*bufferSize = 1;
*buffer = ((unsigned char *)&val) + (offset++ & 3);
-
+
return LZMA_RESULT_OK;
}
@@ -120,14 +120,16 @@ static __inline__ unsigned char get_byte(void)
{
unsigned char *buffer;
UInt32 fake;
-
+
return read_byte(0, &buffer, &fake), *buffer;
}
+int uart_write_str(char * str);
+
/* should be the first function */
-void entry(unsigned long reg_a0, unsigned long reg_a1,
+void decompress_entry(unsigned long reg_a0, unsigned long reg_a1,
unsigned long reg_a2, unsigned long reg_a3,
- unsigned long icache_size, unsigned long icache_lsize,
+ unsigned long icache_size, unsigned long icache_lsize,
unsigned long dcache_size, unsigned long dcache_lsize)
{
unsigned int i; /* temp value */
@@ -140,13 +142,13 @@ void entry(unsigned long reg_a0, unsigned long reg_a1,
callback.Read = read_byte;
uart_write_str("decompress kernel ... ");
-
+
/* look for trx header, 32-bit data access */
for (data = ((unsigned char *) KSEG1ADDR(BCM4710_FLASH));
((struct trx_header *)data)->magic != TRX_MAGIC; data += 65536);
/* compressed kernel is in the partition 0 or 1 */
- if (((struct trx_header *)data)->offsets[1] > 65536)
+ if (((struct trx_header *)data)->offsets[1] > 65536)
data += ((struct trx_header *)data)->offsets[0];
else
data += ((struct trx_header *)data)->offsets[1];
@@ -169,7 +171,7 @@ void entry(unsigned long reg_a0, unsigned long reg_a1,
((unsigned int)get_byte() << 24);
/* skip rest of the header (upper half of uncompressed size) */
- for (i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
get_byte();
/* decompress kernel */
@@ -188,11 +190,11 @@ void entry(unsigned long reg_a0, unsigned long reg_a1,
}
/* *********************************************************************
- *
+ *
* ADM5120 UART driver File: dev_adm_uart.c
- *
+ *
* This is a console device driver for an ADM5120 UART
- *
+ *
*********************************************************************
*
* Copyright 2006
@@ -226,7 +228,7 @@ int uart_write_hex(int val)
{
int i;
int tmp;
-
+
uart_write_str("0x");
for ( i=0 ; i<8 ; i++ ) {
tmp = (val >> ((7-i) * 4 )) & 0xf;
diff --git a/target/linux/adm5120-2.6/image/lzma-loader/src/decompress.lds.in b/target/linux/adm5120-2.6/image/lzma-loader/src/decompress.lds.in
index 33f56f8a0..e69de29bb 100644
--- a/target/linux/adm5120-2.6/image/lzma-loader/src/decompress.lds.in
+++ b/target/linux/adm5120-2.6/image/lzma-loader/src/decompress.lds.in
@@ -1,20 +0,0 @@
-OUTPUT_ARCH(mips)
-ENTRY(entry)
-SECTIONS {
- . = BZ_TEXT_START;
- .text : {
- *(.text.entry)
- *(.text)
- *(.rodata)
- }
-
- .data : {
- *(.data)
- }
-
- .bss : {
- *(.bss)
- }
-
- workspace = .;
-}
diff --git a/target/linux/adm5120-2.6/image/lzma-loader/src/head.S b/target/linux/adm5120-2.6/image/lzma-loader/src/head.S
index 7f0e9adc0..3bfab9ff1 100644
--- a/target/linux/adm5120-2.6/image/lzma-loader/src/head.S
+++ b/target/linux/adm5120-2.6/image/lzma-loader/src/head.S
@@ -1,6 +1,6 @@
-/* Copyright 2007 Gabor Juhos */
+/* Copyright 2007 Gabor Juhos <juhosg@freemail.hu> */
/* keep original values of the a0,a1,a2,a3 registers */
-/* cache manipulation adapted from Broadcom code */
+/* modifed to support user defined entry point address */
/* Copyright 2005 Oleg I. Vdovikin (oleg@cs.msu.su) */
/* cache manipulation adapted from Broadcom code */
/* idea taken from original bunzip2 decompressor code */
@@ -39,21 +39,44 @@
#define Index_Writeback_Inv_D 0x01
.text
- LEAF(startup)
+
+#if (BZ_STARTUP_ORG)
+ .set noreorder
+
+ b startup
+ nop
+
+ .org BZ_STARTUP_ORG
+#endif
+
+LEAF(startup)
.set noreorder
-
- /* Copy decompressor code to the right place */
- li t0, BZ_TEXT_START
-
- la t1, code_start
- la t2, code_stop
-$L1:
- lw t3, 0(t1)
- sw t3, 0(t0)
+
+ move t1, ra # save return address
+ la t0, __reloc_label # get linked address of label
+ bal __reloc_label # branch and link to label to
+ nop # get actual address
+__reloc_label:
+ subu t0, ra, t0 # get reloc_delta
+ move ra, t1 # restore return address
+
+ beqz t0, __reloc_end # if delta is 0 we are in the right place
+ nop
+
+ /* Copy our code to the right place */
+ la t1, _code_start # get linked address of _code_start
+ la t2, _code_end # get linked address of _code_end
+ addu t0, t0, t1 # calculate actual address of _code_start
+
+__reloc_copy:
+ lw t3, 0(t0)
+ sw t3, 0(t1)
add t1, 4
- blt t1, t2, $L1
+ blt t1, t2, __reloc_copy
add t0, 4
+__reloc_end:
+
/* At this point we need to invalidate dcache and */
/* icache before jumping to new code */
@@ -100,10 +123,10 @@ $L1:
.set mips0
bne t0,t1,1b
addu t0,s1
-
+
nodc:
/* Now we get to do it all again for the I$ */
-
+
move s3,zero /* just in case there is no icache */
move s4,zero
@@ -147,20 +170,25 @@ nodc:
addu t0,s3
noic:
- li t0, BZ_TEXT_START
-
+ /* Setup new "C" stack */
+ la sp, _stack
+
addiu sp, -32 /* reserve stack for parameters */
-#if 0
+#if 0
sw a0, 0(sp)
sw a1, 4(sp)
sw a2, 8(sp)
sw a3, 12(sp)
-#endif
+#endif
sw s3, 16(sp) /* icache line size */
sw s4, 20(sp) /* icache size */
sw s1, 24(sp) /* dcache line size */
- jr t0
sw s2, 28(sp) /* dcache size */
-
+
+ /* jump to the decompressor routine */
+ la t0, decompress_entry
+ jr t0
+ nop
+
.set reorder
- END(startup)
+END(startup)
diff --git a/target/linux/adm5120-2.6/image/lzma-loader/src/loader.lds.in b/target/linux/adm5120-2.6/image/lzma-loader/src/loader.lds.in
index 20f2ea98e..8c1bb9bd6 100644
--- a/target/linux/adm5120-2.6/image/lzma-loader/src/loader.lds.in
+++ b/target/linux/adm5120-2.6/image/lzma-loader/src/loader.lds.in
@@ -1,17 +1,27 @@
OUTPUT_ARCH(mips)
-ENTRY(startup)
SECTIONS {
- . = TEXT_START;
.text : {
+ _code_start = .;
*(.text)
+ *(.text.*)
*(.rodata)
+ *(.rodata.*)
+ _code_end = .;
}
.data : {
*(.data)
+ *(.data.*)
}
.bss : {
*(.bss)
+ *(.bss.*)
}
+
+ . = ALIGN(16);
+ . = . + 8192;
+ _stack = .;
+
+ workspace = .;
}