[U-Boot] [PATCH 2/2] Add XZ compressed uImage support

Luigi 'Comio' Mantellini luigi.mantellini at idf-hit.com
Sun Dec 5 16:16:24 CET 2010


This patch permits to use XZ compressed uImages using the XZ embedded library
code.

Signed-off-by: Luigi 'Comio' Mantellini <luigi.mantellini at idf-hit.com>
---
 common/cmd_bootm.c |   27 +++++++++++++++++++++++++--
 common/image.c     |    1 +
 include/image.h    |    1 +
 3 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 1a024f1..066b908 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -61,6 +61,10 @@
 #include <linux/lzo.h>
 #endif /* CONFIG_LZO */
 
+#ifdef CONFIG_XZ
+#include <unxz.h>
+#endif /* CONFIG_XZ */
+
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifndef CONFIG_SYS_BOOTM_LEN
@@ -338,9 +342,9 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
 	ulong image_start = os.image_start;
 	ulong image_len = os.image_len;
 	uint unc_len = CONFIG_SYS_BOOTM_LEN;
-#if defined(CONFIG_LZMA) || defined(CONFIG_LZO)
+#if defined(CONFIG_LZMA) || defined(CONFIG_LZO) || defined(CONFIG_XZ)
 	int ret;
-#endif /* defined(CONFIG_LZMA) || defined(CONFIG_LZO) */
+#endif /* defined(CONFIG_LZMA) || defined(CONFIG_LZO) || defined(CONFIG_XZ) */
 
 	const char *type_name = genimg_get_type_name (os.type);
 
@@ -430,6 +434,25 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
 		*load_end = load + unc_len;
 		break;
 #endif /* CONFIG_LZO */
+#ifdef CONFIG_XZ
+	case IH_COMP_XZ: {
+		int in_used = unc_len;
+		printf ("   Uncompressing %s ... ", type_name);
+		ret = unxz(
+			(unsigned char *)image_start, image_len,
+			(unsigned char *)load, &in_used);
+		unc_len = in_used;
+		if (ret != 0) {
+			printf ("XZ: uncompress or overwrite error %d "
+				"- must RESET board to recover\n", ret);
+			show_boot_progress (-6);
+			return BOOTM_ERR_RESET;
+		}
+		*load_end = load + unc_len;
+		break;
+	}
+		break;
+#endif /* CONFIG_XZ */
 	default:
 		printf ("Unimplemented compression type %d\n", comp);
 		return BOOTM_ERR_UNIMPLEMENTED;
diff --git a/common/image.c b/common/image.c
index 42f5b79..4e31691 100644
--- a/common/image.c
+++ b/common/image.c
@@ -150,6 +150,7 @@ static table_entry_t uimage_comp[] = {
 	{	IH_COMP_GZIP,	"gzip",		"gzip compressed",	},
 	{	IH_COMP_LZMA,	"lzma",		"lzma compressed",	},
 	{	IH_COMP_LZO,	"lzo",		"lzo compressed",	},
+	{	IH_COMP_XZ,	"xz",		"xz compressed",	},
 	{	-1,		"",		"",			},
 };
 
diff --git a/include/image.h b/include/image.h
index 49d6280..5ba5afa 100644
--- a/include/image.h
+++ b/include/image.h
@@ -166,6 +166,7 @@
 #define IH_COMP_BZIP2		2	/* bzip2 Compression Used	*/
 #define IH_COMP_LZMA		3	/* lzma  Compression Used	*/
 #define IH_COMP_LZO		4	/* lzo   Compression Used	*/
+#define IH_COMP_XZ		5	/* xz    Compression Used       */
 
 #define IH_MAGIC	0x27051956	/* Image Magic Number		*/
 #define IH_NMLEN		32	/* Image Name Length		*/
-- 
1.7.3



More information about the U-Boot mailing list