xref: /openbmc/u-boot/test/compression.c (revision 9d466f2f)
1 /*
2  * Copyright (c) 2013, The Chromium Authors
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <bootm.h>
9 #include <command.h>
10 #include <malloc.h>
11 #include <mapmem.h>
12 #include <asm/io.h>
13 
14 #include <u-boot/zlib.h>
15 #include <bzlib.h>
16 
17 #include <lzma/LzmaTypes.h>
18 #include <lzma/LzmaDec.h>
19 #include <lzma/LzmaTools.h>
20 
21 #include <linux/lzo.h>
22 #include <test/compression.h>
23 #include <test/suites.h>
24 #include <test/ut.h>
25 
26 static const char plain[] =
27 	"I am a highly compressable bit of text.\n"
28 	"I am a highly compressable bit of text.\n"
29 	"I am a highly compressable bit of text.\n"
30 	"There are many like me, but this one is mine.\n"
31 	"If I were any shorter, there wouldn't be much sense in\n"
32 	"compressing me in the first place. At least with lzo, anyway,\n"
33 	"which appears to behave poorly in the face of short text\n"
34 	"messages.\n";
35 
36 /* bzip2 -c /tmp/plain.txt > /tmp/plain.bz2 */
37 static const char bzip2_compressed[] =
38 	"\x42\x5a\x68\x39\x31\x41\x59\x26\x53\x59\xe5\x63\xdd\x09\x00\x00"
39 	"\x28\x57\x80\x00\x10\x40\x85\x20\x20\x04\x00\x3f\xef\xdf\xf0\x30"
40 	"\x00\xd6\xd0\x34\x91\x89\xa6\xf5\x4d\x19\x1a\x19\x0d\x02\x34\xd4"
41 	"\xc9\x00\x34\x34\x00\x02\x48\x41\x35\x4f\xd4\xc6\x88\xd3\x50\x3d"
42 	"\x4f\x51\x82\x4f\x88\xc3\x0d\x05\x62\x4f\x91\xa3\x52\x1b\xd0\x52"
43 	"\x41\x4a\xa3\x98\xc2\x6b\xca\xa3\x82\xa5\xac\x8b\x15\x99\x68\xad"
44 	"\xdf\x29\xd6\xf1\xf7\x5a\x10\xcd\x8c\x26\x61\x94\x95\xfe\x9e\x16"
45 	"\x18\x28\x69\xd4\x23\x64\xcc\x2b\xe5\xe8\x5f\x00\xa4\x70\x26\x2c"
46 	"\xee\xbd\x59\x6d\x6a\xec\xfc\x31\xda\x59\x0a\x14\x2a\x60\x1c\xf0"
47 	"\x04\x86\x73\x9a\xc5\x5b\x87\x3f\x5b\x4c\x93\xe6\xb5\x35\x0d\xa6"
48 	"\xb1\x2e\x62\x7b\xab\x67\xe7\x99\x2a\x14\x5e\x9f\x64\xcb\x96\xf4"
49 	"\x0d\x65\xd4\x39\xe6\x8b\x7e\xea\x1c\x03\x69\x97\x83\x58\x91\x96"
50 	"\xe1\xf0\x9d\xa4\x15\x8b\xb8\xc6\x93\xdc\x3d\xd9\x3c\x22\x55\xef"
51 	"\xfb\xbb\x2a\xd3\x87\xa2\x8b\x04\xd9\x19\xf8\xe2\xfd\x4f\xdb\x1a"
52 	"\x07\xc8\x60\xa3\x3f\xf8\xbb\x92\x29\xc2\x84\x87\x2b\x1e\xe8\x48";
53 static const unsigned long bzip2_compressed_size = 240;
54 
55 /* lzma -z -c /tmp/plain.txt > /tmp/plain.lzma */
56 static const char lzma_compressed[] =
57 	"\x5d\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x24\x88"
58 	"\x08\x26\xd8\x41\xff\x99\xc8\xcf\x66\x3d\x80\xac\xba\x17\xf1\xc8"
59 	"\xb9\xdf\x49\x37\xb1\x68\xa0\x2a\xdd\x63\xd1\xa7\xa3\x66\xf8\x15"
60 	"\xef\xa6\x67\x8a\x14\x18\x80\xcb\xc7\xb1\xcb\x84\x6a\xb2\x51\x16"
61 	"\xa1\x45\xa0\xd6\x3e\x55\x44\x8a\x5c\xa0\x7c\xe5\xa8\xbd\x04\x57"
62 	"\x8f\x24\xfd\xb9\x34\x50\x83\x2f\xf3\x46\x3e\xb9\xb0\x00\x1a\xf5"
63 	"\xd3\x86\x7e\x8f\x77\xd1\x5d\x0e\x7c\xe1\xac\xde\xf8\x65\x1f\x4d"
64 	"\xce\x7f\xa7\x3d\xaa\xcf\x26\xa7\x58\x69\x1e\x4c\xea\x68\x8a\xe5"
65 	"\x89\xd1\xdc\x4d\xc7\xe0\x07\x42\xbf\x0c\x9d\x06\xd7\x51\xa2\x0b"
66 	"\x7c\x83\x35\xe1\x85\xdf\xee\xfb\xa3\xee\x2f\x47\x5f\x8b\x70\x2b"
67 	"\xe1\x37\xf3\x16\xf6\x27\x54\x8a\x33\x72\x49\xea\x53\x7d\x60\x0b"
68 	"\x21\x90\x66\xe7\x9e\x56\x61\x5d\xd8\xdc\x59\xf0\xac\x2f\xd6\x49"
69 	"\x6b\x85\x40\x08\x1f\xdf\x26\x25\x3b\x72\x44\xb0\xb8\x21\x2f\xb3"
70 	"\xd7\x9b\x24\x30\x78\x26\x44\x07\xc3\x33\xd1\x4d\x03\x1b\xe1\xff"
71 	"\xfd\xf5\x50\x8d\xca";
72 static const unsigned long lzma_compressed_size = 229;
73 
74 /* lzop -c /tmp/plain.txt > /tmp/plain.lzo */
75 static const char lzo_compressed[] =
76 	"\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a\x10\x30\x20\x60\x09\x40\x01"
77 	"\x05\x03\x00\x00\x09\x00\x00\x81\xb4\x52\x09\x54\xf1\x00\x00\x00"
78 	"\x00\x09\x70\x6c\x61\x69\x6e\x2e\x74\x78\x74\x65\xb1\x07\x9c\x00"
79 	"\x00\x01\x5e\x00\x00\x01\x0f\xc3\xc7\x7a\xe0\x00\x16\x49\x20\x61"
80 	"\x6d\x20\x61\x20\x68\x69\x67\x68\x6c\x79\x20\x63\x6f\x6d\x70\x72"
81 	"\x65\x73\x73\x61\x62\x6c\x65\x20\x62\x69\x74\x20\x6f\x66\x20\x74"
82 	"\x65\x78\x74\x2e\x0a\x20\x2f\x9c\x00\x00\x22\x54\x68\x65\x72\x65"
83 	"\x20\x61\x72\x65\x20\x6d\x61\x6e\x79\x20\x6c\x69\x6b\x65\x20\x6d"
84 	"\x65\x2c\x20\x62\x75\x74\x20\x74\x68\x69\x73\x20\x6f\x6e\x65\x20"
85 	"\x69\x73\x20\x6d\x69\x6e\x65\x2e\x0a\x49\x66\x20\x49\x20\x77\x84"
86 	"\x06\x0a\x6e\x79\x20\x73\x68\x6f\x72\x74\x65\x72\x2c\x20\x74\x90"
87 	"\x08\x00\x08\x77\x6f\x75\x6c\x64\x6e\x27\x74\x20\x62\x65\x20\x6d"
88 	"\x75\x63\x68\x20\x73\x65\x6e\x73\x65\x20\x69\x6e\x0a\xf8\x19\x02"
89 	"\x69\x6e\x67\x20\x6d\x64\x02\x64\x06\x00\x5a\x20\x66\x69\x72\x73"
90 	"\x74\x20\x70\x6c\x61\x63\x65\x2e\x20\x41\x74\x20\x6c\x65\x61\x73"
91 	"\x74\x20\x77\x69\x74\x68\x20\x6c\x7a\x6f\x2c\x20\x61\x6e\x79\x77"
92 	"\x61\x79\x2c\x0a\x77\x68\x69\x63\x68\x20\x61\x70\x70\x65\x61\x72"
93 	"\x73\x20\x74\x6f\x20\x62\x65\x68\x61\x76\x65\x20\x70\x6f\x6f\x72"
94 	"\x6c\x79\x20\x69\x6e\x20\x74\x68\x65\x20\x66\x61\x63\x65\x20\x6f"
95 	"\x66\x20\x73\x68\x6f\x72\x74\x20\x74\x65\x78\x74\x0a\x6d\x65\x73"
96 	"\x73\x61\x67\x65\x73\x2e\x0a\x11\x00\x00\x00\x00\x00\x00";
97 static const unsigned long lzo_compressed_size = 334;
98 
99 /* lz4 -z /tmp/plain.txt > /tmp/plain.lz4 */
100 static const char lz4_compressed[] =
101 	"\x04\x22\x4d\x18\x64\x70\xb9\x01\x01\x00\x00\xff\x19\x49\x20\x61"
102 	"\x6d\x20\x61\x20\x68\x69\x67\x68\x6c\x79\x20\x63\x6f\x6d\x70\x72"
103 	"\x65\x73\x73\x61\x62\x6c\x65\x20\x62\x69\x74\x20\x6f\x66\x20\x74"
104 	"\x65\x78\x74\x2e\x0a\x28\x00\x3d\xf1\x25\x54\x68\x65\x72\x65\x20"
105 	"\x61\x72\x65\x20\x6d\x61\x6e\x79\x20\x6c\x69\x6b\x65\x20\x6d\x65"
106 	"\x2c\x20\x62\x75\x74\x20\x74\x68\x69\x73\x20\x6f\x6e\x65\x20\x69"
107 	"\x73\x20\x6d\x69\x6e\x65\x2e\x0a\x49\x66\x20\x49\x20\x77\x32\x00"
108 	"\xd1\x6e\x79\x20\x73\x68\x6f\x72\x74\x65\x72\x2c\x20\x74\x45\x00"
109 	"\xf4\x0b\x77\x6f\x75\x6c\x64\x6e\x27\x74\x20\x62\x65\x20\x6d\x75"
110 	"\x63\x68\x20\x73\x65\x6e\x73\x65\x20\x69\x6e\x0a\xcf\x00\x50\x69"
111 	"\x6e\x67\x20\x6d\x12\x00\x00\x32\x00\xf0\x11\x20\x66\x69\x72\x73"
112 	"\x74\x20\x70\x6c\x61\x63\x65\x2e\x20\x41\x74\x20\x6c\x65\x61\x73"
113 	"\x74\x20\x77\x69\x74\x68\x20\x6c\x7a\x6f\x2c\x63\x00\xf5\x14\x77"
114 	"\x61\x79\x2c\x0a\x77\x68\x69\x63\x68\x20\x61\x70\x70\x65\x61\x72"
115 	"\x73\x20\x74\x6f\x20\x62\x65\x68\x61\x76\x65\x20\x70\x6f\x6f\x72"
116 	"\x6c\x79\x4e\x00\x30\x61\x63\x65\x27\x01\x01\x95\x00\x01\x2d\x01"
117 	"\xb0\x0a\x6d\x65\x73\x73\x61\x67\x65\x73\x2e\x0a\x00\x00\x00\x00"
118 	"\x9d\x12\x8c\x9d";
119 static const unsigned long lz4_compressed_size = 276;
120 
121 
122 #define TEST_BUFFER_SIZE	512
123 
124 typedef int (*mutate_func)(struct unit_test_state *uts, void *, unsigned long,
125 			   void *, unsigned long, unsigned long *);
126 
127 static int compress_using_gzip(struct unit_test_state *uts,
128 			       void *in, unsigned long in_size,
129 			       void *out, unsigned long out_max,
130 			       unsigned long *out_size)
131 {
132 	int ret;
133 	unsigned long inout_size = out_max;
134 
135 	ret = gzip(out, &inout_size, in, in_size);
136 	if (out_size)
137 		*out_size = inout_size;
138 
139 	return ret;
140 }
141 
142 static int uncompress_using_gzip(struct unit_test_state *uts,
143 				 void *in, unsigned long in_size,
144 				 void *out, unsigned long out_max,
145 				 unsigned long *out_size)
146 {
147 	int ret;
148 	unsigned long inout_size = in_size;
149 
150 	ret = gunzip(out, out_max, in, &inout_size);
151 	if (out_size)
152 		*out_size = inout_size;
153 
154 	return ret;
155 }
156 
157 static int compress_using_bzip2(struct unit_test_state *uts,
158 				void *in, unsigned long in_size,
159 				void *out, unsigned long out_max,
160 				unsigned long *out_size)
161 {
162 	/* There is no bzip2 compression in u-boot, so fake it. */
163 	ut_asserteq(in_size, strlen(plain));
164 	ut_asserteq(0, memcmp(plain, in, in_size));
165 
166 	if (bzip2_compressed_size > out_max)
167 		return -1;
168 
169 	memcpy(out, bzip2_compressed, bzip2_compressed_size);
170 	if (out_size)
171 		*out_size = bzip2_compressed_size;
172 
173 	return 0;
174 }
175 
176 static int uncompress_using_bzip2(struct unit_test_state *uts,
177 				  void *in, unsigned long in_size,
178 				  void *out, unsigned long out_max,
179 				  unsigned long *out_size)
180 {
181 	int ret;
182 	unsigned int inout_size = out_max;
183 
184 	ret = BZ2_bzBuffToBuffDecompress(out, &inout_size, in, in_size,
185 			CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
186 	if (out_size)
187 		*out_size = inout_size;
188 
189 	return (ret != BZ_OK);
190 }
191 
192 static int compress_using_lzma(struct unit_test_state *uts,
193 			       void *in, unsigned long in_size,
194 			       void *out, unsigned long out_max,
195 			       unsigned long *out_size)
196 {
197 	/* There is no lzma compression in u-boot, so fake it. */
198 	ut_asserteq(in_size,  strlen(plain));
199 	ut_asserteq(0, memcmp(plain, in, in_size));
200 
201 	if (lzma_compressed_size > out_max)
202 		return -1;
203 
204 	memcpy(out, lzma_compressed, lzma_compressed_size);
205 	if (out_size)
206 		*out_size = lzma_compressed_size;
207 
208 	return 0;
209 }
210 
211 static int uncompress_using_lzma(struct unit_test_state *uts,
212 				 void *in, unsigned long in_size,
213 				 void *out, unsigned long out_max,
214 				 unsigned long *out_size)
215 {
216 	int ret;
217 	SizeT inout_size = out_max;
218 
219 	ret = lzmaBuffToBuffDecompress(out, &inout_size, in, in_size);
220 	if (out_size)
221 		*out_size = inout_size;
222 
223 	return (ret != SZ_OK);
224 }
225 
226 static int compress_using_lzo(struct unit_test_state *uts,
227 			      void *in, unsigned long in_size,
228 			      void *out, unsigned long out_max,
229 			      unsigned long *out_size)
230 {
231 	/* There is no lzo compression in u-boot, so fake it. */
232 	ut_asserteq(in_size,  strlen(plain));
233 	ut_asserteq(0, memcmp(plain, in, in_size));
234 
235 	if (lzo_compressed_size > out_max)
236 		return -1;
237 
238 	memcpy(out, lzo_compressed, lzo_compressed_size);
239 	if (out_size)
240 		*out_size = lzo_compressed_size;
241 
242 	return 0;
243 }
244 
245 static int uncompress_using_lzo(struct unit_test_state *uts,
246 				void *in, unsigned long in_size,
247 				void *out, unsigned long out_max,
248 				unsigned long *out_size)
249 {
250 	int ret;
251 	size_t input_size = in_size;
252 	size_t output_size = out_max;
253 
254 	ret = lzop_decompress(in, input_size, out, &output_size);
255 	if (out_size)
256 		*out_size = output_size;
257 
258 	return (ret != LZO_E_OK);
259 }
260 
261 static int compress_using_lz4(struct unit_test_state *uts,
262 			      void *in, unsigned long in_size,
263 			      void *out, unsigned long out_max,
264 			      unsigned long *out_size)
265 {
266 	/* There is no lz4 compression in u-boot, so fake it. */
267 	ut_asserteq(in_size,  strlen(plain));
268 	ut_asserteq(0, memcmp(plain, in, in_size));
269 
270 	if (lz4_compressed_size > out_max)
271 		return -1;
272 
273 	memcpy(out, lz4_compressed, lz4_compressed_size);
274 	if (out_size)
275 		*out_size = lz4_compressed_size;
276 
277 	return 0;
278 }
279 
280 static int uncompress_using_lz4(struct unit_test_state *uts,
281 				void *in, unsigned long in_size,
282 				void *out, unsigned long out_max,
283 				unsigned long *out_size)
284 {
285 	int ret;
286 	size_t input_size = in_size;
287 	size_t output_size = out_max;
288 
289 	ret = ulz4fn(in, input_size, out, &output_size);
290 	if (out_size)
291 		*out_size = output_size;
292 
293 	return (ret != 0);
294 }
295 
296 #define errcheck(statement) if (!(statement)) { \
297 	fprintf(stderr, "\tFailed: %s\n", #statement); \
298 	ret = 1; \
299 	goto out; \
300 }
301 
302 struct buf_state {
303 	ulong orig_size;
304 	ulong compressed_size;
305 	ulong uncompressed_size;
306 	void *orig_buf;
307 	void *compressed_buf;
308 	void *uncompressed_buf;
309 	void *compare_buf;
310 };
311 
312 static int run_test_internal(struct unit_test_state *uts, char *name,
313 			     mutate_func compress, mutate_func uncompress,
314 			     struct buf_state *buf)
315 {
316 	int ret;
317 
318 	/* Compress works as expected. */
319 	printf("\torig_size:%lu\n", buf->orig_size);
320 	memset(buf->compressed_buf, 'A', TEST_BUFFER_SIZE);
321 	errcheck(compress(uts, buf->orig_buf, buf->orig_size,
322 			  buf->compressed_buf, buf->compressed_size,
323 			  &buf->compressed_size) == 0);
324 	printf("\tcompressed_size:%lu\n", buf->compressed_size);
325 	errcheck(buf->compressed_size > 0);
326 	errcheck(buf->compressed_size < buf->orig_size);
327 	errcheck(((char *)buf->compressed_buf)[buf->compressed_size - 1] !=
328 			'A');
329 	errcheck(((char *)buf->compressed_buf)[buf->compressed_size] == 'A');
330 
331 	/* Uncompresses with space remaining. */
332 	errcheck(uncompress(uts, buf->compressed_buf, buf->compressed_size,
333 			    buf->uncompressed_buf, buf->uncompressed_size,
334 			    &buf->uncompressed_size) == 0);
335 	printf("\tuncompressed_size:%lu\n", buf->uncompressed_size);
336 	errcheck(buf->uncompressed_size == buf->orig_size);
337 	errcheck(memcmp(buf->orig_buf, buf->uncompressed_buf,
338 			buf->orig_size) == 0);
339 
340 	/* Uncompresses with exactly the right size output buffer. */
341 	memset(buf->uncompressed_buf, 'A', TEST_BUFFER_SIZE);
342 	errcheck(uncompress(uts, buf->compressed_buf, buf->compressed_size,
343 			    buf->uncompressed_buf, buf->orig_size,
344 			    &buf->uncompressed_size) == 0);
345 	errcheck(buf->uncompressed_size == buf->orig_size);
346 	errcheck(memcmp(buf->orig_buf, buf->uncompressed_buf,
347 			buf->orig_size) == 0);
348 	errcheck(((char *)buf->uncompressed_buf)[buf->orig_size] == 'A');
349 
350 	/* Make sure compression does not over-run. */
351 	memset(buf->compare_buf, 'A', TEST_BUFFER_SIZE);
352 	ret = compress(uts, buf->orig_buf, buf->orig_size,
353 		       buf->compare_buf, buf->compressed_size - 1,
354 		       NULL);
355 	errcheck(((char *)buf->compare_buf)[buf->compressed_size] == 'A');
356 	errcheck(ret != 0);
357 	printf("\tcompress does not overrun\n");
358 
359 	/* Make sure decompression does not over-run. */
360 	memset(buf->compare_buf, 'A', TEST_BUFFER_SIZE);
361 	ret = uncompress(uts, buf->compressed_buf, buf->compressed_size,
362 			 buf->compare_buf, buf->uncompressed_size - 1,
363 			 NULL);
364 	errcheck(((char *)buf->compare_buf)[buf->uncompressed_size - 1] == 'A');
365 	errcheck(ret != 0);
366 	printf("\tuncompress does not overrun\n");
367 
368 	/* Got here, everything is fine. */
369 	ret = 0;
370 
371 out:
372 	return ret;
373 }
374 
375 static int run_test(struct unit_test_state *uts, char *name,
376 		    mutate_func compress, mutate_func uncompress)
377 {
378 	struct buf_state sbuf, *buf = &sbuf;
379 	int ret;
380 
381 	printf(" testing %s ...\n", name);
382 
383 	buf->orig_buf = (void *)plain;
384 	buf->orig_size = strlen(buf->orig_buf); /* Trailing NUL not included */
385 	errcheck(buf->orig_size > 0);
386 
387 	buf->compressed_size = TEST_BUFFER_SIZE;
388 	buf->uncompressed_size = TEST_BUFFER_SIZE;
389 	buf->compressed_buf = malloc(buf->compressed_size);
390 	errcheck(buf->compressed_buf);
391 	buf->uncompressed_buf = malloc(buf->uncompressed_size);
392 	errcheck(buf->uncompressed_buf);
393 	buf->compare_buf = malloc(buf->uncompressed_size);
394 	errcheck(buf->compare_buf);
395 
396 	ret = run_test_internal(uts, name, compress, uncompress, buf);
397 out:
398 	printf(" %s: %s\n", name, ret == 0 ? "ok" : "FAILED");
399 
400 	free(buf->compare_buf);
401 	free(buf->uncompressed_buf);
402 	free(buf->compressed_buf);
403 
404 	return ret;
405 }
406 
407 static int compression_test_gzip(struct unit_test_state *uts)
408 {
409 	return run_test(uts, "gzip", compress_using_gzip,
410 			uncompress_using_gzip);
411 }
412 COMPRESSION_TEST(compression_test_gzip, 0);
413 
414 static int compression_test_bzip2(struct unit_test_state *uts)
415 {
416 	return run_test(uts, "bzip2", compress_using_bzip2,
417 			uncompress_using_bzip2);
418 }
419 COMPRESSION_TEST(compression_test_bzip2, 0);
420 
421 static int compression_test_lzma(struct unit_test_state *uts)
422 {
423 	return run_test(uts, "lzma", compress_using_lzma,
424 			uncompress_using_lzma);
425 }
426 COMPRESSION_TEST(compression_test_lzma, 0);
427 
428 static int compression_test_lzo(struct unit_test_state *uts)
429 {
430 	return run_test(uts, "lzo", compress_using_lzo, uncompress_using_lzo);
431 }
432 COMPRESSION_TEST(compression_test_lzo, 0);
433 
434 static int compression_test_lz4(struct unit_test_state *uts)
435 {
436 	return run_test(uts, "lz4", compress_using_lz4, uncompress_using_lz4);
437 }
438 COMPRESSION_TEST(compression_test_lz4, 0);
439 
440 static int compress_using_none(struct unit_test_state *uts,
441 			       void *in, unsigned long in_size,
442 			       void *out, unsigned long out_max,
443 			       unsigned long *out_size)
444 {
445 	/* Here we just copy */
446 	memcpy(out, in, in_size);
447 	*out_size = in_size;
448 
449 	return 0;
450 }
451 
452 /**
453  * run_bootm_test() - Run tests on the bootm decopmression function
454  *
455  * @comp_type:	Compression type to test
456  * @compress:	Our function to compress data
457  * @return 0 if OK, non-zero on failure
458  */
459 static int run_bootm_test(struct unit_test_state *uts, int comp_type,
460 			  mutate_func compress)
461 {
462 	ulong compress_size = 1024;
463 	void *compress_buff;
464 	int unc_len;
465 	int err = 0;
466 	const ulong image_start = 0;
467 	const ulong load_addr = 0x1000;
468 	ulong load_end;
469 
470 	printf("Testing: %s\n", genimg_get_comp_name(comp_type));
471 	compress_buff = map_sysmem(image_start, 0);
472 	unc_len = strlen(plain);
473 	compress(uts, (void *)plain, unc_len, compress_buff, compress_size,
474 		 &compress_size);
475 	err = bootm_decomp_image(comp_type, load_addr, image_start,
476 				 IH_TYPE_KERNEL, map_sysmem(load_addr, 0),
477 				 compress_buff, compress_size, unc_len,
478 				 &load_end);
479 	ut_assertok(err);
480 	err = bootm_decomp_image(comp_type, load_addr, image_start,
481 				 IH_TYPE_KERNEL, map_sysmem(load_addr, 0),
482 				 compress_buff, compress_size, unc_len - 1,
483 				 &load_end);
484 	ut_assert(err);
485 
486 	/* We can't detect corruption when not decompressing */
487 	if (comp_type == IH_COMP_NONE)
488 		return 0;
489 	memset(compress_buff + compress_size / 2, '\x49',
490 	       compress_size / 2);
491 	err = bootm_decomp_image(comp_type, load_addr, image_start,
492 				 IH_TYPE_KERNEL, map_sysmem(load_addr, 0),
493 				 compress_buff, compress_size, 0x10000,
494 				 &load_end);
495 	ut_assert(err);
496 
497 	return 0;
498 }
499 
500 static int compression_test_bootm_gzip(struct unit_test_state *uts)
501 {
502 	return run_bootm_test(uts, IH_COMP_GZIP, compress_using_gzip);
503 }
504 COMPRESSION_TEST(compression_test_bootm_gzip, 0);
505 
506 static int compression_test_bootm_bzip2(struct unit_test_state *uts)
507 {
508 	return run_bootm_test(uts, IH_COMP_BZIP2, compress_using_bzip2);
509 }
510 COMPRESSION_TEST(compression_test_bootm_bzip2, 0);
511 
512 static int compression_test_bootm_lzma(struct unit_test_state *uts)
513 {
514 	return run_bootm_test(uts, IH_COMP_LZMA, compress_using_lzma);
515 }
516 COMPRESSION_TEST(compression_test_bootm_lzma, 0);
517 
518 static int compression_test_bootm_lzo(struct unit_test_state *uts)
519 {
520 	return run_bootm_test(uts, IH_COMP_LZO, compress_using_lzo);
521 }
522 COMPRESSION_TEST(compression_test_bootm_lzo, 0);
523 
524 static int compression_test_bootm_lz4(struct unit_test_state *uts)
525 {
526 	return run_bootm_test(uts, IH_COMP_LZ4, compress_using_lz4);
527 }
528 COMPRESSION_TEST(compression_test_bootm_lz4, 0);
529 
530 static int compression_test_bootm_none(struct unit_test_state *uts)
531 {
532 	return run_bootm_test(uts, IH_COMP_NONE, compress_using_none);
533 }
534 COMPRESSION_TEST(compression_test_bootm_none, 0);
535 
536 int do_ut_compression(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
537 {
538 	struct unit_test *tests = ll_entry_start(struct unit_test,
539 						 compression_test);
540 	const int n_ents = ll_entry_count(struct unit_test, compression_test);
541 
542 	return cmd_ut_category("compression", tests, n_ents, argc, argv);
543 }
544