16496d00fSGuilherme Maciel Ferreira#!/bin/bash
26496d00fSGuilherme Maciel Ferreira#
36496d00fSGuilherme Maciel Ferreira# Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
46496d00fSGuilherme Maciel Ferreira#
56496d00fSGuilherme Maciel Ferreira# Sanity check for mkimage and dumpimage tools
66496d00fSGuilherme Maciel Ferreira#
76496d00fSGuilherme Maciel Ferreira# SPDX-License-Identifier:	GPL-2.0+
86496d00fSGuilherme Maciel Ferreira#
96496d00fSGuilherme Maciel Ferreira# To run this:
106496d00fSGuilherme Maciel Ferreira#
116496d00fSGuilherme Maciel Ferreira# make O=sandbox sandbox_config
126496d00fSGuilherme Maciel Ferreira# make O=sandbox
136496d00fSGuilherme Maciel Ferreira# ./test/image/test-imagetools.sh
146496d00fSGuilherme Maciel Ferreira
156496d00fSGuilherme Maciel FerreiraBASEDIR=sandbox
16f41f5b7cSGuilherme Maciel FerreiraSRCDIR=${BASEDIR}/boot
176496d00fSGuilherme Maciel FerreiraIMAGE_NAME="v1.0-test"
18f41f5b7cSGuilherme Maciel FerreiraIMAGE_MULTI=linux.img
19*39931f96SGuilherme Maciel FerreiraIMAGE_FIT_ITS=linux.its
20*39931f96SGuilherme Maciel FerreiraIMAGE_FIT_ITB=linux.itb
216496d00fSGuilherme Maciel FerreiraDATAFILE0=vmlinuz
226496d00fSGuilherme Maciel FerreiraDATAFILE1=initrd.img
236496d00fSGuilherme Maciel FerreiraDATAFILE2=System.map
246496d00fSGuilherme Maciel FerreiraDATAFILES="${DATAFILE0} ${DATAFILE1} ${DATAFILE2}"
256496d00fSGuilherme Maciel FerreiraTEST_OUT=test_output
266496d00fSGuilherme Maciel FerreiraMKIMAGE=${BASEDIR}/tools/mkimage
276496d00fSGuilherme Maciel FerreiraDUMPIMAGE=${BASEDIR}/tools/dumpimage
286496d00fSGuilherme Maciel FerreiraMKIMAGE_LIST=mkimage.list
296496d00fSGuilherme Maciel FerreiraDUMPIMAGE_LIST=dumpimage.list
306496d00fSGuilherme Maciel Ferreira
316496d00fSGuilherme Maciel Ferreira# Remove all the files we created
326496d00fSGuilherme Maciel Ferreiracleanup()
336496d00fSGuilherme Maciel Ferreira{
346496d00fSGuilherme Maciel Ferreira	local file
356496d00fSGuilherme Maciel Ferreira
366496d00fSGuilherme Maciel Ferreira	for file in ${DATAFILES}; do
376496d00fSGuilherme Maciel Ferreira		rm -f ${file} ${SRCDIR}/${file}
386496d00fSGuilherme Maciel Ferreira	done
39*39931f96SGuilherme Maciel Ferreira	rm -f ${IMAGE_MULTI}
40*39931f96SGuilherme Maciel Ferreira	rm -f ${DUMPIMAGE_LIST}
41*39931f96SGuilherme Maciel Ferreira	rm -f ${MKIMAGE_LIST}
42*39931f96SGuilherme Maciel Ferreira	rm -f ${TEST_OUT}
436496d00fSGuilherme Maciel Ferreira	rmdir ${SRCDIR}
446496d00fSGuilherme Maciel Ferreira}
456496d00fSGuilherme Maciel Ferreira
466496d00fSGuilherme Maciel Ferreira# Check that two files are the same
476496d00fSGuilherme Maciel Ferreiraassert_equal()
486496d00fSGuilherme Maciel Ferreira{
49f41f5b7cSGuilherme Maciel Ferreira	if ! diff -u $1 $2; then
506496d00fSGuilherme Maciel Ferreira		echo "Failed."
516496d00fSGuilherme Maciel Ferreira		cleanup
526496d00fSGuilherme Maciel Ferreira		exit 1
536496d00fSGuilherme Maciel Ferreira	fi
546496d00fSGuilherme Maciel Ferreira}
556496d00fSGuilherme Maciel Ferreira
566496d00fSGuilherme Maciel Ferreira# Create some test files
576496d00fSGuilherme Maciel Ferreiracreate_files()
586496d00fSGuilherme Maciel Ferreira{
596496d00fSGuilherme Maciel Ferreira	local file
606496d00fSGuilherme Maciel Ferreira
616496d00fSGuilherme Maciel Ferreira	mkdir -p ${SRCDIR}
626496d00fSGuilherme Maciel Ferreira	for file in ${DATAFILES}; do
636496d00fSGuilherme Maciel Ferreira		head -c $RANDOM /dev/urandom >${SRCDIR}/${file}
646496d00fSGuilherme Maciel Ferreira	done
656496d00fSGuilherme Maciel Ferreira}
666496d00fSGuilherme Maciel Ferreira
676496d00fSGuilherme Maciel Ferreira# Run a command, echoing it first
686496d00fSGuilherme Maciel Ferreirado_cmd()
696496d00fSGuilherme Maciel Ferreira{
706496d00fSGuilherme Maciel Ferreira	local cmd="$@"
716496d00fSGuilherme Maciel Ferreira
726496d00fSGuilherme Maciel Ferreira	echo "# ${cmd}"
736496d00fSGuilherme Maciel Ferreira	${cmd} 2>&1
746496d00fSGuilherme Maciel Ferreira}
756496d00fSGuilherme Maciel Ferreira
766496d00fSGuilherme Maciel Ferreira# Run a command, redirecting output
776496d00fSGuilherme Maciel Ferreira# Args:
786496d00fSGuilherme Maciel Ferreira#    redirect_file
796496d00fSGuilherme Maciel Ferreira#    command...
806496d00fSGuilherme Maciel Ferreirado_cmd_redir()
816496d00fSGuilherme Maciel Ferreira{
826496d00fSGuilherme Maciel Ferreira	local redir="$1"
836496d00fSGuilherme Maciel Ferreira	shift
846496d00fSGuilherme Maciel Ferreira	local cmd="$@"
856496d00fSGuilherme Maciel Ferreira
866496d00fSGuilherme Maciel Ferreira	echo "# ${cmd}"
876496d00fSGuilherme Maciel Ferreira	${cmd} >${redir}
886496d00fSGuilherme Maciel Ferreira}
896496d00fSGuilherme Maciel Ferreira
90f41f5b7cSGuilherme Maciel Ferreira# Write files into an multi-file image
91f41f5b7cSGuilherme Maciel Ferreiracreate_multi_image()
926496d00fSGuilherme Maciel Ferreira{
936496d00fSGuilherme Maciel Ferreira	local files="${SRCDIR}/${DATAFILE0}:${SRCDIR}/${DATAFILE1}"
946496d00fSGuilherme Maciel Ferreira	files+=":${SRCDIR}/${DATAFILE2}"
956496d00fSGuilherme Maciel Ferreira
96f41f5b7cSGuilherme Maciel Ferreira	echo -e "\nBuilding multi-file image..."
976496d00fSGuilherme Maciel Ferreira	do_cmd ${MKIMAGE} -A x86 -O linux -T multi -n \"${IMAGE_NAME}\" \
98f41f5b7cSGuilherme Maciel Ferreira		-d ${files} ${IMAGE_MULTI}
996496d00fSGuilherme Maciel Ferreira	echo "done."
1006496d00fSGuilherme Maciel Ferreira}
1016496d00fSGuilherme Maciel Ferreira
102f41f5b7cSGuilherme Maciel Ferreira# Extract files from an multi-file image
103f41f5b7cSGuilherme Maciel Ferreiraextract_multi_image()
1046496d00fSGuilherme Maciel Ferreira{
105f41f5b7cSGuilherme Maciel Ferreira	echo -e "\nExtracting multi-file image contents..."
106f41f5b7cSGuilherme Maciel Ferreira	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 0 ${DATAFILE0}
107f41f5b7cSGuilherme Maciel Ferreira	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 1 ${DATAFILE1}
108f41f5b7cSGuilherme Maciel Ferreira	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2}
109f41f5b7cSGuilherme Maciel Ferreira	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2} -o ${TEST_OUT}
1106496d00fSGuilherme Maciel Ferreira	echo "done."
1116496d00fSGuilherme Maciel Ferreira}
1126496d00fSGuilherme Maciel Ferreira
113*39931f96SGuilherme Maciel Ferreira# Write files into a FIT image
114*39931f96SGuilherme Maciel Ferreiracreate_fit_image()
115*39931f96SGuilherme Maciel Ferreira{
116*39931f96SGuilherme Maciel Ferreira	echo " \
117*39931f96SGuilherme Maciel Ferreira	/dts-v1/; \
118*39931f96SGuilherme Maciel Ferreira	/ { \
119*39931f96SGuilherme Maciel Ferreira	    description = \"FIT image\"; \
120*39931f96SGuilherme Maciel Ferreira	    #address-cells = <1>; \
121*39931f96SGuilherme Maciel Ferreira	\
122*39931f96SGuilherme Maciel Ferreira	    images { \
123*39931f96SGuilherme Maciel Ferreira	        kernel@1 { \
124*39931f96SGuilherme Maciel Ferreira	            description = \"kernel\"; \
125*39931f96SGuilherme Maciel Ferreira	            data = /incbin/(\"${DATAFILE0}\"); \
126*39931f96SGuilherme Maciel Ferreira	            type = \"kernel\"; \
127*39931f96SGuilherme Maciel Ferreira	            arch = \"sandbox\"; \
128*39931f96SGuilherme Maciel Ferreira	            os = \"linux\"; \
129*39931f96SGuilherme Maciel Ferreira	            compression = \"gzip\"; \
130*39931f96SGuilherme Maciel Ferreira	            load = <0x40000>; \
131*39931f96SGuilherme Maciel Ferreira	            entry = <0x8>; \
132*39931f96SGuilherme Maciel Ferreira	        }; \
133*39931f96SGuilherme Maciel Ferreira	        ramdisk@1 { \
134*39931f96SGuilherme Maciel Ferreira	            description = \"filesystem\"; \
135*39931f96SGuilherme Maciel Ferreira	            data = /incbin/(\"${DATAFILE1}\"); \
136*39931f96SGuilherme Maciel Ferreira	            type = \"ramdisk\"; \
137*39931f96SGuilherme Maciel Ferreira	            arch = \"sandbox\"; \
138*39931f96SGuilherme Maciel Ferreira	            os = \"linux\"; \
139*39931f96SGuilherme Maciel Ferreira	            compression = \"none\"; \
140*39931f96SGuilherme Maciel Ferreira	            load = <0x80000>; \
141*39931f96SGuilherme Maciel Ferreira	            entry = <0x16>; \
142*39931f96SGuilherme Maciel Ferreira	        }; \
143*39931f96SGuilherme Maciel Ferreira	        fdt@1 { \
144*39931f96SGuilherme Maciel Ferreira	            description = \"device tree\"; \
145*39931f96SGuilherme Maciel Ferreira	            data = /incbin/(\"${DATAFILE2}\"); \
146*39931f96SGuilherme Maciel Ferreira	            type = \"flat_dt\"; \
147*39931f96SGuilherme Maciel Ferreira	            arch = \"sandbox\"; \
148*39931f96SGuilherme Maciel Ferreira	            compression = \"none\"; \
149*39931f96SGuilherme Maciel Ferreira	        }; \
150*39931f96SGuilherme Maciel Ferreira	    }; \
151*39931f96SGuilherme Maciel Ferreira	    configurations { \
152*39931f96SGuilherme Maciel Ferreira	        default = \"conf@1\"; \
153*39931f96SGuilherme Maciel Ferreira	        conf@1 { \
154*39931f96SGuilherme Maciel Ferreira	            kernel = \"kernel@1\"; \
155*39931f96SGuilherme Maciel Ferreira	            fdt = \"fdt@1\"; \
156*39931f96SGuilherme Maciel Ferreira	        }; \
157*39931f96SGuilherme Maciel Ferreira	    }; \
158*39931f96SGuilherme Maciel Ferreira	}; \
159*39931f96SGuilherme Maciel Ferreira	" > ${IMAGE_FIT_ITS}
160*39931f96SGuilherme Maciel Ferreira
161*39931f96SGuilherme Maciel Ferreira	echo -e "\nBuilding FIT image..."
162*39931f96SGuilherme Maciel Ferreira	do_cmd ${MKIMAGE} -f ${IMAGE_FIT_ITS} ${IMAGE_FIT_ITB}
163*39931f96SGuilherme Maciel Ferreira	echo "done."
164*39931f96SGuilherme Maciel Ferreira}
165*39931f96SGuilherme Maciel Ferreira
166*39931f96SGuilherme Maciel Ferreira# Extract files from a FIT image
167*39931f96SGuilherme Maciel Ferreiraextract_fit_image()
168*39931f96SGuilherme Maciel Ferreira{
169*39931f96SGuilherme Maciel Ferreira	echo -e "\nExtracting FIT image contents..."
170*39931f96SGuilherme Maciel Ferreira	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 0 ${DATAFILE0}
171*39931f96SGuilherme Maciel Ferreira	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 1 ${DATAFILE1}
172*39931f96SGuilherme Maciel Ferreira	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2}
173*39931f96SGuilherme Maciel Ferreira	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2} -o ${TEST_OUT}
174*39931f96SGuilherme Maciel Ferreira	echo "done."
175*39931f96SGuilherme Maciel Ferreira}
176*39931f96SGuilherme Maciel Ferreira
1776496d00fSGuilherme Maciel Ferreira# List the contents of a file
178f41f5b7cSGuilherme Maciel Ferreira# Args:
179f41f5b7cSGuilherme Maciel Ferreira#    image filename
1806496d00fSGuilherme Maciel Ferreiralist_image()
1816496d00fSGuilherme Maciel Ferreira{
182f41f5b7cSGuilherme Maciel Ferreira	local image="$1"
183f41f5b7cSGuilherme Maciel Ferreira
1846496d00fSGuilherme Maciel Ferreira	echo -e "\nListing image contents..."
185f41f5b7cSGuilherme Maciel Ferreira	do_cmd_redir ${MKIMAGE_LIST} ${MKIMAGE} -l ${image}
186f41f5b7cSGuilherme Maciel Ferreira	do_cmd_redir ${DUMPIMAGE_LIST} ${DUMPIMAGE} -l ${image}
1876496d00fSGuilherme Maciel Ferreira	echo "done."
1886496d00fSGuilherme Maciel Ferreira}
1896496d00fSGuilherme Maciel Ferreira
1906496d00fSGuilherme Maciel Ferreiramain()
1916496d00fSGuilherme Maciel Ferreira{
1926496d00fSGuilherme Maciel Ferreira	local file
1936496d00fSGuilherme Maciel Ferreira
1946496d00fSGuilherme Maciel Ferreira	create_files
1956496d00fSGuilherme Maciel Ferreira
196f41f5b7cSGuilherme Maciel Ferreira	# Compress and extract multi-file images, compare the result
197f41f5b7cSGuilherme Maciel Ferreira	create_multi_image
198f41f5b7cSGuilherme Maciel Ferreira	extract_multi_image
1996496d00fSGuilherme Maciel Ferreira	for file in ${DATAFILES}; do
2006496d00fSGuilherme Maciel Ferreira		assert_equal ${file} ${SRCDIR}/${file}
2016496d00fSGuilherme Maciel Ferreira	done
2026496d00fSGuilherme Maciel Ferreira	assert_equal ${TEST_OUT} ${DATAFILE2}
2036496d00fSGuilherme Maciel Ferreira
204f41f5b7cSGuilherme Maciel Ferreira	# List contents of multi-file image and compares output from tools
205f41f5b7cSGuilherme Maciel Ferreira	list_image ${IMAGE_MULTI}
2066496d00fSGuilherme Maciel Ferreira	assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
2076496d00fSGuilherme Maciel Ferreira
208*39931f96SGuilherme Maciel Ferreira	# Compress and extract FIT images, compare the result
209*39931f96SGuilherme Maciel Ferreira	create_fit_image
210*39931f96SGuilherme Maciel Ferreira	extract_fit_image
211*39931f96SGuilherme Maciel Ferreira	for file in ${DATAFILES}; do
212*39931f96SGuilherme Maciel Ferreira		assert_equal ${file} ${SRCDIR}/${file}
213*39931f96SGuilherme Maciel Ferreira	done
214*39931f96SGuilherme Maciel Ferreira	assert_equal ${TEST_OUT} ${DATAFILE2}
215*39931f96SGuilherme Maciel Ferreira
216*39931f96SGuilherme Maciel Ferreira	# List contents of FIT image and compares output from tools
217*39931f96SGuilherme Maciel Ferreira	list_image ${IMAGE_FIT_ITB}
218*39931f96SGuilherme Maciel Ferreira	assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
219*39931f96SGuilherme Maciel Ferreira
2206496d00fSGuilherme Maciel Ferreira	# Remove files created
2216496d00fSGuilherme Maciel Ferreira	cleanup
2226496d00fSGuilherme Maciel Ferreira
2236496d00fSGuilherme Maciel Ferreira	echo "Tests passed."
2246496d00fSGuilherme Maciel Ferreira}
2256496d00fSGuilherme Maciel Ferreira
2266496d00fSGuilherme Maciel Ferreiramain
227