From fcc5a6e25288d8cc0612b9b8f6eaa85dd7abd957 Mon Sep 17 00:00:00 2001
From: Gabor Juhos <juhosg@openwrt.org>
Date: Mon, 25 Jun 2007 08:47:10 +0000
Subject: [PATCH] from now on, the lzma loader is able to pass parameters to
 the kernel

SVN-Revision: 7723
---
 target/linux/adm5120-2.6/image/Makefile       | 116 ++++++++++++------
 .../adm5120-2.6/image/lzma-loader/Makefile    |  35 +++---
 .../image/lzma-loader/src/Makefile            |  14 ++-
 .../image/lzma-loader/src/config.h            |  83 +++++++++++++
 .../image/lzma-loader/src/decompress.c        |  37 ++++--
 target/linux/adm5120eb-2.6/image/Makefile     |  56 +++++----
 6 files changed, 255 insertions(+), 86 deletions(-)
 create mode 100644 target/linux/adm5120-2.6/image/lzma-loader/src/config.h

diff --git a/target/linux/adm5120-2.6/image/Makefile b/target/linux/adm5120-2.6/image/Makefile
index 02b57be992..360a87f657 100644
--- a/target/linux/adm5120-2.6/image/Makefile
+++ b/target/linux/adm5120-2.6/image/Makefile
@@ -7,18 +7,14 @@
 include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/image.mk
 
+IMGNAME = $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)
 LOADER_MAKE = $(MAKE) -C lzma-loader KDIR=$(KDIR)
 
-define PrepareLoader
-	$(LOADER_MAKE) LOADER=$(1) LOADER_DATA="" \
-		LZMA_TEXT_START=$(2) LZMA_STARTUP_ORG=$(3) \
-		compile
-
-endef
-define PrepareLZMAKernel
-	$(LOADER_MAKE) LOADER=vmlinux-lzma-$(1) LOADER_DATA=$(KDIR)/vmlinux.lzma \
-		LZMA_TEXT_START=$(2) LZMA_STARTUP_ORG=$(3) \
-		compile
+define Image/Build/Loader
+	$(LOADER_MAKE) LOADER=loader-$(1).$(2) LOADER_DATA="" \
+		LZMA_TEXT_START=$(3) LZMA_STARTUP_ORG=$(4) \
+		CONFIG_PASS_KARGS=$(5) CONFIG_BOARD=$(6) \
+		compile loader.$(2)
 endef
 
 define Build/Clean
@@ -27,13 +23,6 @@ endef
 
 define Image/Prepare
 	cat $(KDIR)/vmlinux | $(STAGING_DIR)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $(KDIR)/vmlinux.lzma
-ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
-	$(call PrepareLoader,generic,0x80500000,0)
-	$(call PrepareLoader,admboot,0x80500000,0x6D8)
-else
-	$(call PrepareLZMAKernel,generic,0x80500000,0)
-	$(call PrepareLZMAKernel,admboot,0x80500000,0x6D8)
-endif
 endef
 
 define trxalign/jffs2-128k
@@ -46,36 +35,57 @@ define trxalign/squashfs
 -a 1024
 endef
 
+define Image/Build/TRX
+	$(STAGING_DIR)/bin/trx -o $(1) -f $(3) -f $(KDIR)/vmlinux.lzma \
+		$(call trxalign/$(2)) -f $(KDIR)/root.$(2)
+endef
+
+define Image/Build/TRXNoloader
+	$(STAGING_DIR)/bin/trx -o $(1) -f $(KDIR)/vmlinux.lzma \
+		$(call trxalign/$(2)) -f $(KDIR)/root.$(2)
+endef
+
 define Image/Build/Compex
-	$(CP) $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).trx $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).trx
+	$(call Image/Build/Loader,$(2),gz,0x80500000,0,y,$(2))
+	$(call Image/Build/TRX,$(IMGNAME)-$(3)-$(2).trx,$(1),$(KDIR)/loader-$(2).gz)
 endef
 
 define Image/Build/Edimax
+	$(call Image/Build/Loader,$(2),gz,0x80500000,0x6D8,y,$(2))
+	$(call Image/Build/TRXNoloader,$(IMGNAME)-$(3)-$(2).trx,$(1))
 	$(STAGING_DIR)/bin/mkcsysimg -B $(4) -d -w \
-		-r $(KDIR)/loader-admboot.gz \
-		-x $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx \
-		$(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).bin
+		-r $(KDIR)/loader-$(2).gz \
+		-x $(IMGNAME)-$(3)-$(2).trx \
+		$(IMGNAME)-$(3)-$(2).bin
+endef
+
+define Image/Build/Infineon
+	$(call Image/Build/Loader,$(2),gz,0x80500000,0x6D8,y,$(2))
+	$(call Image/Build/TRXNoloader,$(IMGNAME)-$(3)-$(2).trx,$(1))
+	dd if=$(KDIR)/loader-$(2).gz of=$(IMGNAME)-$(3)-$(2).img bs=64k conv=sync
+	cat $(IMGNAME)-$(3)-$(2).trx >>$(IMGNAME)-$(3)-$(2).img
 endef
 
 define Image/Build/MyLoader
-	$(CP) $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).trx
+	$(call Image/Build/Loader,$(2),gz,0x80500000,0)
+	$(call Image/Build/TRXNoloader,$(IMGNAME)-$(3)-$(2).trx,$(1))
 	$(STAGING_DIR)/bin/mkmylofw -B $(4) \
 		-p0x20000:0x10000:ahp:0x80001000 \
 		-p0x30000:0 \
-		-b0x20000:0x10000:h:$(KDIR)/loader-generic.gz \
-		-b0x30000:0::$(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).trx \
-		$(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).bin
+		-b0x20000:0x10000:h:$(KDIR)/loader-$(2).gz \
+		-b0x30000:0::$(IMGNAME)-$(3)-$(2).trx \
+		$(IMGNAME)-$(3)-$(2).bin
 endef
 
 define Image/Build/RouterBoard
-	$(CP) $(KDIR)/vmlinux.elf $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-vmlinux
+	$(CP) $(KDIR)/vmlinux.elf $(IMGNAME)-vmlinux
 endef
 
 define Image/Build
-	$(STAGING_DIR)/bin/trx -o $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).trx -f $(KDIR)/loader-generic.gz -f $(KDIR)/vmlinux.lzma $(call trxalign/$(1)) -f $(KDIR)/root.$(1)
-	$(STAGING_DIR)/bin/trx -o $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx -f $(KDIR)/vmlinux.lzma $(call trxalign/$(1)) -f $(KDIR)/root.$(1)
-ifneq ($(1),jffs2-128K)
-	$(call Image/Build/Compex,$(1),wp54g-wrt,$(patsubst jffs2-%,jffs2,$(1)))
+# this line is here intentionally
+ifneq ($(1),jffs2-256k)
+ifneq ($(1),jffs2-128k)
+	$(call Image/Build/Compex,$(1),wp54g-wrt,$(patsubst jffs2-%,jffs2,$(1)),WP54G-WRT)
 	$(call Image/Build/Edimax,$(1),br-6104k,$(patsubst jffs2-%,jffs2,$(1)),BR-6104K)
 	$(call Image/Build/Edimax,$(1),br-6104kp,$(patsubst jffs2-%,jffs2,$(1)),BR-6104KP)
 	$(call Image/Build/Edimax,$(1),br-6114wg,$(patsubst jffs2-%,jffs2,$(1)),BR-6114WG)
@@ -89,6 +99,10 @@ ifneq ($(1),jffs2-128K)
 	$(call Image/Build/Edimax,$(1),ps-3205uwg,$(patsubst jffs2-%,jffs2,$(1)),PS-3205UWg)
 	$(call Image/Build/Edimax,$(1),br-6524wg,$(patsubst jffs2-%,jffs2,$(1)),BR-6524WG)
 	$(call Image/Build/Edimax,$(1),br-6524wp,$(patsubst jffs2-%,jffs2,$(1)),BR-6524WP)
+	$(call Image/Build/Infineon,$(1),easy-5120,$(patsubst jffs2-%,jffs2,$(1)))
+	$(call Image/Build/Infineon,$(1),easy-5120-rt,$(patsubst jffs2-%,jffs2,$(1)))
+	$(call Image/Build/Infineon,$(1),easy-5120p-ata,$(patsubst jffs2-%,jffs2,$(1)))
+	$(call Image/Build/Infineon,$(1),easy-83000,$(patsubst jffs2-%,jffs2,$(1)))
 	$(call Image/Build/MyLoader,$(1),np27g,$(patsubst jffs2-%,jffs2,$(1)),NP27G)
 	$(call Image/Build/MyLoader,$(1),np28g,$(patsubst jffs2-%,jffs2,$(1)),NP28G)
 	$(call Image/Build/MyLoader,$(1),np28ghs,$(patsubst jffs2-%,jffs2,$(1)),NP28GHS)
@@ -97,24 +111,48 @@ ifneq ($(1),jffs2-128K)
 	$(call Image/Build/MyLoader,$(1),wpp54g,$(patsubst jffs2-%,jffs2,$(1)),WPP54G)
 	$(call Image/Build/MyLoader,$(1),wpp54ag,$(patsubst jffs2-%,jffs2,$(1)),WPP54AG)
 endif
+endif
 ifeq ($(1),tgz)
 	$(call Image/Build/RouterBoard)
 endif
 endef
 
 define Image/Build/LZMAKernel
-	$(CP) $(KDIR)/loader-vmlinux-lzma-$(2).$(3) \
-	    $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-vmlinux-lzma-$(1).$(3)
+	$(LOADER_MAKE) TARGET_DIR=$(BIN_DIR) \
+		LOADER=openwrt-$(BOARD)-$(KERNEL)-ramfs-lzma-$(1).$(2) \
+		LOADER_DATA=$(KDIR)/vmlinux.lzma \
+		LZMA_TEXT_START=$(3) LZMA_STARTUP_ORG=$(4) \
+		CONFIG_PASS_KARGS=$(5) CONFIG_BOARD=$(6) \
+		compile loader.$(2)
+endef
+
+define Image/Build/LZMAKernel/Compex
+	$(call Image/Build/LZMAKernel,$(1),$(2),0x80500000,0,y,$(1))
+endef
+
+define Image/Build/LZMAKernel/Generic
+	$(call Image/Build/LZMAKernel,$(1),$(2),0x80500000,0)
+endef
+
+define Image/Build/LZMAKernel/Admboot
+	$(call Image/Build/LZMAKernel,$(1),$(2),0x80500000,0x6D8,y,$(1))
 endef
 
 define Image/Build/Initramfs
-	$(call Image/Build/LZMAKernel,generic,generic,elf)
-	$(call Image/Build/LZMAKernel,rb-100,generic,elf)
-	$(call Image/Build/LZMAKernel,np27g,generic,bin)
-	$(call Image/Build/LZMAKernel,wp54g,generic,bin)
-	$(call Image/Build/LZMAKernel,br-6104k,admboot,gz)
-	$(call Image/Build/LZMAKernel,cas-771,admboot,gz)
+	$(call Image/Build/LZMAKernel/Generic,generic,bin)
+	$(call Image/Build/LZMAKernel/Generic,rb-100,elf)
+	$(call Image/Build/LZMAKernel/Generic,np27g,bin)
+	$(call Image/Build/LZMAKernel/Generic,wp54g,bin)
+	$(call Image/Build/LZMAKernel/Compex,wp54g-wrt,bin)
+	$(call Image/Build/LZMAKernel/Admboot,br-6104k,gz)
+	$(call Image/Build/LZMAKernel/Admboot,easy-5120,gz)
+	$(call Image/Build/LZMAKernel/Admboot,easy-83000,gz)
+	$(call Image/Build/LZMAKernel/Admboot,cas-630,gz)
+	$(call Image/Build/LZMAKernel/Admboot,cas-670,gz)
+	$(call Image/Build/LZMAKernel/Admboot,cas-700,gz)
+	$(call Image/Build/LZMAKernel/Admboot,cas-771,gz)
+	$(call Image/Build/LZMAKernel/Admboot,cas-790,gz)
+	$(call Image/Build/LZMAKernel/Admboot,cas-861,gz)
 endef
 
 $(eval $(call BuildImage))
-
diff --git a/target/linux/adm5120-2.6/image/lzma-loader/Makefile b/target/linux/adm5120-2.6/image/lzma-loader/Makefile
index 0245e44ccd..74866e765e 100644
--- a/target/linux/adm5120-2.6/image/lzma-loader/Makefile
+++ b/target/linux/adm5120-2.6/image/lzma-loader/Makefile
@@ -8,13 +8,18 @@
 
 include $(TOPDIR)/rules.mk
 
-LOADER		:= adm5120
-LOADER_NAME	:= loader-$(LOADER)
+LOADER		:= loader.bin
+LOADER_NAME	:= $(basename $(notdir $(LOADER)))
 LOADER_DATA 	:=
+TARGET_DIR	:=
 
-LOADER_BIN	:= $(KDIR)/$(LOADER_NAME).bin
-LOADER_GZ	:= $(KDIR)/$(LOADER_NAME).gz
-LOADER_ELF	:= $(KDIR)/$(LOADER_NAME).elf
+ifeq ($(TARGET_DIR),)
+TARGET_DIR	:= $(KDIR)
+endif
+
+LOADER_BIN	:= $(TARGET_DIR)/$(LOADER_NAME).bin
+LOADER_GZ	:= $(TARGET_DIR)/$(LOADER_NAME).gz
+LOADER_ELF	:= $(TARGET_DIR)/$(LOADER_NAME).elf
 
 LZMA_STARTUP_ORG:= 0
 LZMA_TEXT_START	:= 0x80300000
@@ -22,7 +27,7 @@ LZMA_TEXT_START	:= 0x80300000
 PKG_NAME := lzma-loader
 PKG_BUILD_DIR := $(KDIR)/$(PKG_NAME)
 
-.PHONY : loader-compile
+.PHONY : loader-compile loader.bin loader.elf loader.gz
 
 $(PKG_BUILD_DIR)/.prepared:
 	mkdir $(PKG_BUILD_DIR)
@@ -34,23 +39,25 @@ loader-compile: $(PKG_BUILD_DIR)/.prepared
 		LZMA_STARTUP_ORG=$(LZMA_STARTUP_ORG) \
 		LZMA_TEXT_START=$(LZMA_TEXT_START) \
 		LOADER_DATA=$(LOADER_DATA) \
+		CONFIG_BOARD=$(CONFIG_BOARD) \
+		CONFIG_PASS_KARGS=$(CONFIG_PASS_KARGS) \
 		clean all
 
-$(LOADER_GZ): $(PKG_BUILD_DIR)/loader.bin
-	gzip -nc9 $< > $@
+loader.gz: $(PKG_BUILD_DIR)/loader.bin
+	gzip -nc9 $< > $(LOADER_GZ)
 
-$(LOADER_ELF) : $(PKG_BUILD_DIR)/loader.elf
-	$(CP) $< $@
+loader.elf: $(PKG_BUILD_DIR)/loader.elf
+	$(CP) $< $(LOADER_ELF)
 
-$(LOADER_BIN) : $(PKG_BUILD_DIR)/loader.bin
-	$(CP) $< $@
+loader.bin: $(PKG_BUILD_DIR)/loader.bin
+	$(CP) $< $(LOADER_BIN)
 
 download:
 prepare: $(PKG_BUILD_DIR)/.prepared
-compile: loader-compile $(LOADER_BIN) $(LOADER_GZ) $(LOADER_ELF)
+compile: loader-compile
 
 install:
 
 clean:
 	rm -rf $(PKG_BUILD_DIR)
-	rm -f $(KDIR)/loader-*.gz $(KDIR)/loader-*.elf $(KDIR)/loader-*.bin
+
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 0f4ffa63a9..a3749f2ee9 100644
--- a/target/linux/adm5120-2.6/image/lzma-loader/src/Makefile
+++ b/target/linux/adm5120-2.6/image/lzma-loader/src/Makefile
@@ -25,6 +25,8 @@ LOADADDR	:= 0x80001000
 LZMA_TEXT_START	:= 0x80500000
 LZMA_STARTUP_ORG:= 0
 LOADER_DATA	:=
+CONFIG_PASS_KARGS :=
+CONFIG_BOARD	:=
 
 CC		:= $(CROSS_COMPILE)gcc
 LD		:= $(CROSS_COMPILE)ld
@@ -55,6 +57,16 @@ else
 CFLAGS		+= -D_LZMA_IN_CB
 endif
 
+ifneq ($(strip $(CONFIG_PASS_KARGS)),)
+CFLAGS		+= -DCONFIG_PASS_KARGS
+endif
+
+BOARD_DEF := $(strip $(CONFIG_BOARD))
+BOARD_DEF := $(shell echo $(BOARD_DEF) | tr a-z A-Z | tr -d -)
+ifneq ($(BOARD_DEF),)
+CFLAGS		+= -DCONFIG_BOARD_$(BOARD_DEF)
+endif
+
 all: loader.bin
 
 # Don't build dependencies, this may die if $(CC) isn't gcc
@@ -80,7 +92,7 @@ loader.elf: $(OBJECTS)
 mrproper: clean
 
 clean:
-	rm -f *.gz *.elf *.bin *.o
+	rm -f *.elf *.bin *.o
 
 
 
diff --git a/target/linux/adm5120-2.6/image/lzma-loader/src/config.h b/target/linux/adm5120-2.6/image/lzma-loader/src/config.h
new file mode 100644
index 0000000000..5002b18192
--- /dev/null
+++ b/target/linux/adm5120-2.6/image/lzma-loader/src/config.h
@@ -0,0 +1,83 @@
+/*
+ * Cellvision/SparkLAN boards
+ */
+
+#if defined(CONFIG_BOARD_CAS630)
+#  define CONFIG_BOARD_NAME	"CAS-630"
+#endif
+
+#if defined(CONFIG_BOARD_CAS670)
+#  define CONFIG_BOARD_NAME	"CAS-670"
+#endif
+
+#if defined(CONFIG_BOARD_CAS700)
+#  define CONFIG_BOARD_NAME	"CAS-700"
+#endif
+
+#if defined(CONFIG_BOARD_CAS790)
+#  define CONFIG_BOARD_NAME	"CAS-790"
+#endif
+
+#if defined(CONFIG_BOARD_CAS771)
+#  define CONFIG_BOARD_NAME	"CAS-771"
+#endif
+
+#if defined(CONFIG_BOARD_CAS861)
+#  define CONFIG_BOARD_NAME	"CAS-861"
+#endif
+
+#if defined(CONFIG_BOARD_NFS101U)
+#  define CONFIG_BOARD_NAME	"NFS-101U"
+#endif
+
+#if defined(CONFIG_BOARD_NFS202U)
+#  define CONFIG_BOARD_NAME	"NFS-202U"
+#endif
+
+/*
+ * Edimax boards
+ */
+#if defined(CONFIG_BOARD_BR6104K)
+#  define CONFIG_BOARD_NAME	"BR-6104K"
+#endif
+
+#if defined(CONFIG_BOARD_BR6104KP)
+#  define CONFIG_BOARD_NAME	"BR-6104KP"
+#endif
+
+/*
+ * Infineon boards
+ */
+#if defined(CONFIG_BOARD_EASY5120)
+#  define CONFIG_BOARD_NAME	"EASY 5120"
+#endif
+
+#if defined(CONFIG_BOARD_EASY5120RT)
+#  define CONFIG_BOARD_NAME	"EASY 5120-RT"
+#endif
+
+#if defined(CONFIG_BOARD_EASY5120PATA)
+#  define CONFIG_BOARD_NAME	"EASY 5120P-ATA"
+#endif
+
+#if defined(CONFIG_BOARD_EASY83000)
+#  define CONFIG_BOARD_NAME	"EASY 83000"
+#endif
+
+/*
+ * ZyXEL boards
+ */
+#if defined(CONFIG_BOARD_P334WT)
+#  define CONFIG_BOARD_NAME	"P-334WT"
+#endif
+
+#if defined(CONFIG_BOARD_P335)
+#  define CONFIG_BOARD_NAME	"P-335"
+#endif
+
+/*
+ * Default values
+ */
+#ifndef CONFIG_BOARD_NAME
+#  define CONFIG_BOARD_NAME	"ADM5120"
+#endif
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 ffc87ee0db..e2f9bee234 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
@@ -36,12 +36,13 @@
  *
  * 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 */
@@ -109,6 +110,19 @@ extern unsigned char _lzma_data_end[];
 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;
 
@@ -167,6 +181,7 @@ static void print_hex(int val)
 	}
 }
 
+#if !(LZMA_WRAPPER)
 static unsigned char *find_kernel(void)
 {
 	struct trx_header *hdr;
@@ -178,7 +193,7 @@ static unsigned char *find_kernel(void)
 	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;
@@ -187,13 +202,13 @@ static unsigned char *find_kernel(void)
 
 	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)) {
@@ -203,9 +218,10 @@ static unsigned char *find_kernel(void)
 		ret += read_le32(&hdr->offsets[1]);
 		print_str("1\n");
 	}
-		
+
 	return ret;
 }
+#endif /* !(LZMA_WRAPPER) */
 
 static void halt(void)
 {
@@ -231,7 +247,8 @@ void decompress_entry(unsigned long reg_a0, unsigned long reg_a1,
 
 	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;
@@ -301,8 +318,12 @@ void decompress_entry(unsigned long reg_a0, unsigned long reg_a1,
 
 	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);
 }
-
-
diff --git a/target/linux/adm5120eb-2.6/image/Makefile b/target/linux/adm5120eb-2.6/image/Makefile
index ce4644da17..0022b48448 100644
--- a/target/linux/adm5120eb-2.6/image/Makefile
+++ b/target/linux/adm5120eb-2.6/image/Makefile
@@ -7,18 +7,14 @@
 include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/image.mk
 
+IMGNAME = $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)
 LOADER_MAKE = $(MAKE) -C lzma-loader KDIR=$(KDIR)
 
-define CompileLoader
-	$(LOADER_MAKE) LOADER=$(1) LOADER_DATA="" \
-		LZMA_TEXT_START=$(2) LZMA_STARTUP_ORG=$(3) \
-		compile
-endef
-
-define CompileLZMAKernel
-	$(LOADER_MAKE) LOADER=vmlinux-lzma-$(1) LOADER_DATA=$(KDIR)/vmlinux.lzma \
-		LZMA_TEXT_START=$(2) LZMA_STARTUP_ORG=$(3) \
-		compile
+define Image/Build/Loader
+	$(LOADER_MAKE) LOADER=loader-$(1).$(2) LOADER_DATA="" \
+		LZMA_TEXT_START=$(3) LZMA_STARTUP_ORG=$(4) \
+		CONFIG_PASS_KARGS=$(5) CONFIG_BOARD=$(6) \
+		compile loader.$(2)
 endef
 
 define Build/Clean
@@ -27,11 +23,6 @@ endef
 
 define Image/Prepare
 	cat $(KDIR)/vmlinux | $(STAGING_DIR)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $(KDIR)/vmlinux.lzma
-ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
-	$(call CompileLoader,zyxel,0x80500000,0)
-else	
-	$(call CompileLZMAKernel,zyxel,0x80500000,0)
-endif
 endef
 
 define trxalign/jffs2-128k
@@ -44,25 +35,42 @@ define trxalign/squashfs
 -a 1024
 endef
 
+define Image/Build/TRX
+	$(STAGING_DIR)/bin/trx -o $(1) -f $(3) -f $(KDIR)/vmlinux.lzma \
+		$(call trxalign/$(2)) -f $(KDIR)/root.$(2)
+endef
+
+define Image/Build/TRXNoloader
+	$(STAGING_DIR)/bin/trx -o $(1) -f $(KDIR)/vmlinux.lzma \
+		$(call trxalign/$(2)) -f $(KDIR)/root.$(2)
+endef
+
 define Image/Build/ZyXEL
-	$(CP) $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(3)-$(2).trx
+	$(call Image/Build/Loader,loader-$(2),gz,0x80500000,0)
+	$(call Image/Build/TRXNoloader,$(IMGNAME)-$(3)-$(2).trx,$(1))
+	#TODO: firmware generation tool needed
 endef
 
 define Image/Build
-	$(STAGING_DIR)/bin/trx -o $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1)-noloader.trx -f $(KDIR)/vmlinux.lzma $(call trxalign/$(1)) -f $(KDIR)/root.$(1)
-ifneq ($(1),jffs2-128K)
-	#FIXME: firware images yet
-endif
+	#FIXME: No firmware images yet
 endef
 
 define Image/Build/LZMAKernel
-	$(CP) $(KDIR)/loader-vmlinux-lzma-$(2).$(3) \
-	    $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-vmlinux-lzma-$(1).$(3)
+	$(LOADER_MAKE) TARGET_DIR=$(BIN_DIR) \
+		LOADER=openwrt-$(BOARD)-$(KERNEL)-ramfs-lzma-$(1).$(2) \
+		LOADER_DATA=$(KDIR)/vmlinux.lzma \
+		LZMA_TEXT_START=$(3) LZMA_STARTUP_ORG=$(4) \
+		CONFIG_PASS_KARGS=$(5) CONFIG_BOARD=$(6) \
+		compile loader.$(2)
+endef
+
+define Image/Build/LZMAKernel/ZyXEL
+	$(call Image/Build/LZMAKernel,$(1),$(2),0x80500000,0,y,$(1))
 endef
 
 define Image/Build/Initramfs
-	$(call Image/Build/LZMAKernel,p-334wt,zyxel,bin)
-	$(call Image/Build/LZMAKernel,p-335wt,zyxel,bin)
+	$(call Image/Build/LZMAKernel/Generic,p-334wt,bin)
+	$(call Image/Build/LZMAKernel/Generic,p-335,bin)
 endef
 
 $(eval $(call BuildImage))
-- 
2.30.2