*
* 19-May-2007 Gabor Juhos
* endiannes related cleanups
- * add support for decompressing an embedded kernel
+ * add support for decompressing an embedded kernel
*
*/
#include <stddef.h>
+#include "config.h"
#include "LzmaDecode.h"
#define ADM5120_FLASH_START 0x1fc00000 /* Flash start */
extern void board_init(void);
extern void board_putc(int ch);
+struct env_var {
+ char *name;
+ char *value;
+};
+
+#ifdef CONFIG_PASS_KARGS
+#define ENVV(n,v) {.name = (n), .value = (v)}
+struct env_var env_vars[] = {
+ ENVV("board_name", CONFIG_BOARD_NAME),
+ ENVV(NULL, NULL)
+};
+#endif
+
unsigned char *data;
unsigned long datalen;
}
}
+#if !(LZMA_WRAPPER)
static unsigned char *find_kernel(void)
{
struct trx_header *hdr;
for (ret = ((unsigned char *) KSEG1ADDR(ADM5120_FLASH_START));
ret < ((unsigned char *)KSEG1ADDR(ADM5120_FLASH_END));
ret += TRX_ALIGN) {
-
+
if (read_le32(ret) == TRX_MAGIC) {
hdr = (struct trx_header *)ret;
break;
if (hdr == NULL) {
print_str("not found!\n");
- return NULL;
+ return NULL;
}
print_str("found at ");
print_hex((unsigned int)ret);
print_str(", kernel in partition ");
-
+
/* compressed kernel is in the partition 0 or 1 */
if ((read_le32(&hdr->offsets[1]) == 0) ||
(read_le32(&hdr->offsets[1]) > 65536)) {
ret += read_le32(&hdr->offsets[1]);
print_str("1\n");
}
-
+
return ret;
}
+#endif /* !(LZMA_WRAPPER) */
static void halt(void)
{
board_init();
- print_str("\n\nLZMA loader for ADM5120, Copyright (C) 2007 OpenWrt.org\n\n");
+ print_str("\n\nLZMA loader for " CONFIG_BOARD_NAME
+ ", Copyright (C) 2007 OpenWrt.org\n\n");
#if LZMA_WRAPPER
data = _lzma_data_start;
(unsigned char*)LOADADDR, osize, &i);
#endif
if (res != LZMA_RESULT_OK) {
- print_str("failed, LzmaDecode error: ");
- print_hex(res);
- print_str("\n");
+ print_str("failed!\n");
+ print_str("LzmaDecode: ");
+ switch (res) {
+ case LZMA_RESULT_DATA_ERROR:
+ print_str("data error\n");
+ break;
+ case LZMA_RESULT_NOT_ENOUGH_MEM:
+ print_str("not enough memory\n");
+ break;
+ default:
+ print_str("unknown error, err=0x");
+ print_hex(res);
+ print_str("\n");
+ }
halt();
}
print_str("launching kernel...\n\n");
+#ifdef CONFIG_PASS_KARGS
+ reg_a0 = 0;
+ reg_a1 = 0;
+ reg_a2 = (unsigned long)env_vars;
+ reg_a3 = 0;
+#endif
/* Jump to load address */
((kernel_entry) LOADADDR)(reg_a0, reg_a1, reg_a2, reg_a3);
}
-
-