aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Fainelli <florian@openwrt.org>2007-03-26 07:32:10 +0000
committerFlorian Fainelli <florian@openwrt.org>2007-03-26 07:32:10 +0000
commit4377351db43c94d400124a3948a0e70bde878289 (patch)
tree756b2d2760b7f344638363e9b66aa740a7a521f2
parent6c9b120593078d7c76c1506240763e2d63d2de06 (diff)
downloadupstream-4377351db43c94d400124a3948a0e70bde878289.tar.gz
upstream-4377351db43c94d400124a3948a0e70bde878289.tar.bz2
upstream-4377351db43c94d400124a3948a0e70bde878289.zip
Preserve fw_arg0-3 to allow runtime bootloader detection (Gabor Juhos)
SVN-Revision: 6711
-rw-r--r--target/linux/adm5120-2.6/image/lzma-loader/src/decompress.c12
-rw-r--r--target/linux/adm5120-2.6/image/lzma-loader/src/head.S43
2 files changed, 37 insertions, 18 deletions
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 b0ed2fc8c4..d3610241f6 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
@@ -30,6 +30,9 @@
* 24-Apr-2005 Oleg I. Vdovikin
* reordered functions using lds script, removed forward decl
*
+ * 24-Mar-2007 Gabor Juhos
+ * pass original values of the a0,a1,a2,a3 registers to the kernel
+ *
*/
#include "LzmaDecode.h"
@@ -93,6 +96,9 @@ extern unsigned char workspace[];
unsigned int offset;
unsigned char *data;
+typedef void (*kernel_entry)(unsigned long reg_a0, unsigned long reg_a1,
+ unsigned long reg_a2, unsigned long reg_a3);
+
/* flash access should be aligned, so wrapper is used */
/* read byte from the flash, all accesses are 32-bit aligned */
static int read_byte(void *object, unsigned char **buffer, UInt32 *bufferSize)
@@ -119,7 +125,9 @@ static __inline__ unsigned char get_byte(void)
}
/* should be the first function */
-void entry(unsigned long icache_size, unsigned long icache_lsize,
+void 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 dcache_size, unsigned long dcache_lsize)
{
unsigned int i; /* temp value */
@@ -173,7 +181,7 @@ void entry(unsigned long icache_size, unsigned long icache_lsize,
/* Jump to load address */
uart_write_str("ok\r\n");
- ((void (*)(void)) LOADADDR)();
+ ((kernel_entry) LOADADDR)(reg_a0, reg_a1, reg_a2, reg_a3);
}
uart_write_str("failed\r\n");
while (1 );
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 9bfbd53d51..7f0e9adc0d 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,3 +1,6 @@
+/* Copyright 2007 Gabor Juhos */
+/* keep original values of the a0,a1,a2,a3 registers */
+/* cache manipulation adapted from Broadcom code */
/* Copyright 2005 Oleg I. Vdovikin (oleg@cs.msu.su) */
/* cache manipulation adapted from Broadcom code */
/* idea taken from original bunzip2 decompressor code */
@@ -40,18 +43,17 @@
.set noreorder
/* Copy decompressor code to the right place */
- li t2, BZ_TEXT_START
- add a0, t2, 0
- la a1, code_start
- la a2, code_stop
+ li t0, BZ_TEXT_START
+
+ la t1, code_start
+ la t2, code_stop
$L1:
- lw t0, 0(a1)
- sw t0, 0(a0)
- add a1, 4
- add a0, 4
- blt a1, a2, $L1
- nop
-
+ lw t3, 0(t1)
+ sw t3, 0(t0)
+ add t1, 4
+ blt t1, t2, $L1
+ add t0, 4
+
/* At this point we need to invalidate dcache and */
/* icache before jumping to new code */
@@ -145,11 +147,20 @@ nodc:
addu t0,s3
noic:
- move a0,s3 /* icache line size */
- move a1,s4 /* icache size */
- move a2,s1 /* dcache line size */
- jal t2
- move a3,s2 /* dcache size */
+ li t0, BZ_TEXT_START
+
+ addiu sp, -32 /* reserve stack for parameters */
+#if 0
+ sw a0, 0(sp)
+ sw a1, 4(sp)
+ sw a2, 8(sp)
+ sw a3, 12(sp)
+#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 */
.set reorder
END(startup)