227 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/bin/bash
 | |
| #
 | |
| # Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
 | |
| #
 | |
| # Sanity check for mkimage and dumpimage tools
 | |
| #
 | |
| # SPDX-License-Identifier:	GPL-2.0+
 | |
| #
 | |
| # To run this:
 | |
| #
 | |
| # make O=sandbox sandbox_config
 | |
| # make O=sandbox
 | |
| # ./test/image/test-imagetools.sh
 | |
| 
 | |
| BASEDIR=sandbox
 | |
| SRCDIR=${BASEDIR}/boot
 | |
| IMAGE_NAME="v1.0-test"
 | |
| IMAGE_MULTI=linux.img
 | |
| IMAGE_FIT_ITS=linux.its
 | |
| IMAGE_FIT_ITB=linux.itb
 | |
| DATAFILE0=vmlinuz
 | |
| DATAFILE1=initrd.img
 | |
| DATAFILE2=System.map
 | |
| DATAFILES="${DATAFILE0} ${DATAFILE1} ${DATAFILE2}"
 | |
| TEST_OUT=test_output
 | |
| MKIMAGE=${BASEDIR}/tools/mkimage
 | |
| DUMPIMAGE=${BASEDIR}/tools/dumpimage
 | |
| MKIMAGE_LIST=mkimage.list
 | |
| DUMPIMAGE_LIST=dumpimage.list
 | |
| 
 | |
| # Remove all the files we created
 | |
| cleanup()
 | |
| {
 | |
| 	local file
 | |
| 
 | |
| 	for file in ${DATAFILES}; do
 | |
| 		rm -f ${file} ${SRCDIR}/${file}
 | |
| 	done
 | |
| 	rm -f ${IMAGE_MULTI}
 | |
| 	rm -f ${DUMPIMAGE_LIST}
 | |
| 	rm -f ${MKIMAGE_LIST}
 | |
| 	rm -f ${TEST_OUT}
 | |
| 	rmdir ${SRCDIR}
 | |
| }
 | |
| 
 | |
| # Check that two files are the same
 | |
| assert_equal()
 | |
| {
 | |
| 	if ! diff -u $1 $2; then
 | |
| 		echo "Failed."
 | |
| 		cleanup
 | |
| 		exit 1
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| # Create some test files
 | |
| create_files()
 | |
| {
 | |
| 	local file
 | |
| 
 | |
| 	mkdir -p ${SRCDIR}
 | |
| 	for file in ${DATAFILES}; do
 | |
| 		head -c $RANDOM /dev/urandom >${SRCDIR}/${file}
 | |
| 	done
 | |
| }
 | |
| 
 | |
| # Run a command, echoing it first
 | |
| do_cmd()
 | |
| {
 | |
| 	local cmd="$@"
 | |
| 
 | |
| 	echo "# ${cmd}"
 | |
| 	${cmd} 2>&1
 | |
| }
 | |
| 
 | |
| # Run a command, redirecting output
 | |
| # Args:
 | |
| #    redirect_file
 | |
| #    command...
 | |
| do_cmd_redir()
 | |
| {
 | |
| 	local redir="$1"
 | |
| 	shift
 | |
| 	local cmd="$@"
 | |
| 
 | |
| 	echo "# ${cmd}"
 | |
| 	${cmd} >${redir}
 | |
| }
 | |
| 
 | |
| # Write files into an multi-file image
 | |
| create_multi_image()
 | |
| {
 | |
| 	local files="${SRCDIR}/${DATAFILE0}:${SRCDIR}/${DATAFILE1}"
 | |
| 	files+=":${SRCDIR}/${DATAFILE2}"
 | |
| 
 | |
| 	echo -e "\nBuilding multi-file image..."
 | |
| 	do_cmd ${MKIMAGE} -A x86 -O linux -T multi -n \"${IMAGE_NAME}\" \
 | |
| 		-d ${files} ${IMAGE_MULTI}
 | |
| 	echo "done."
 | |
| }
 | |
| 
 | |
| # Extract files from an multi-file image
 | |
| extract_multi_image()
 | |
| {
 | |
| 	echo -e "\nExtracting multi-file image contents..."
 | |
| 	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 0 ${DATAFILE0}
 | |
| 	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 1 ${DATAFILE1}
 | |
| 	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2}
 | |
| 	do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2} -o ${TEST_OUT}
 | |
| 	echo "done."
 | |
| }
 | |
| 
 | |
| # Write files into a FIT image
 | |
| create_fit_image()
 | |
| {
 | |
| 	echo " \
 | |
| 	/dts-v1/; \
 | |
| 	/ { \
 | |
| 	    description = \"FIT image\"; \
 | |
| 	    #address-cells = <1>; \
 | |
| 	\
 | |
| 	    images { \
 | |
| 	        kernel@1 { \
 | |
| 	            description = \"kernel\"; \
 | |
| 	            data = /incbin/(\"${DATAFILE0}\"); \
 | |
| 	            type = \"kernel\"; \
 | |
| 	            arch = \"sandbox\"; \
 | |
| 	            os = \"linux\"; \
 | |
| 	            compression = \"gzip\"; \
 | |
| 	            load = <0x40000>; \
 | |
| 	            entry = <0x8>; \
 | |
| 	        }; \
 | |
| 	        ramdisk@1 { \
 | |
| 	            description = \"filesystem\"; \
 | |
| 	            data = /incbin/(\"${DATAFILE1}\"); \
 | |
| 	            type = \"ramdisk\"; \
 | |
| 	            arch = \"sandbox\"; \
 | |
| 	            os = \"linux\"; \
 | |
| 	            compression = \"none\"; \
 | |
| 	            load = <0x80000>; \
 | |
| 	            entry = <0x16>; \
 | |
| 	        }; \
 | |
| 	        fdt@1 { \
 | |
| 	            description = \"device tree\"; \
 | |
| 	            data = /incbin/(\"${DATAFILE2}\"); \
 | |
| 	            type = \"flat_dt\"; \
 | |
| 	            arch = \"sandbox\"; \
 | |
| 	            compression = \"none\"; \
 | |
| 	        }; \
 | |
| 	    }; \
 | |
| 	    configurations { \
 | |
| 	        default = \"conf@1\"; \
 | |
| 	        conf@1 { \
 | |
| 	            kernel = \"kernel@1\"; \
 | |
| 	            fdt = \"fdt@1\"; \
 | |
| 	        }; \
 | |
| 	    }; \
 | |
| 	}; \
 | |
| 	" > ${IMAGE_FIT_ITS}
 | |
| 
 | |
| 	echo -e "\nBuilding FIT image..."
 | |
| 	do_cmd ${MKIMAGE} -f ${IMAGE_FIT_ITS} ${IMAGE_FIT_ITB}
 | |
| 	echo "done."
 | |
| }
 | |
| 
 | |
| # Extract files from a FIT image
 | |
| extract_fit_image()
 | |
| {
 | |
| 	echo -e "\nExtracting FIT image contents..."
 | |
| 	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 0 ${DATAFILE0}
 | |
| 	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 1 ${DATAFILE1}
 | |
| 	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2}
 | |
| 	do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2} -o ${TEST_OUT}
 | |
| 	echo "done."
 | |
| }
 | |
| 
 | |
| # List the contents of a file
 | |
| # Args:
 | |
| #    image filename
 | |
| list_image()
 | |
| {
 | |
| 	local image="$1"
 | |
| 
 | |
| 	echo -e "\nListing image contents..."
 | |
| 	do_cmd_redir ${MKIMAGE_LIST} ${MKIMAGE} -l ${image}
 | |
| 	do_cmd_redir ${DUMPIMAGE_LIST} ${DUMPIMAGE} -l ${image}
 | |
| 	echo "done."
 | |
| }
 | |
| 
 | |
| main()
 | |
| {
 | |
| 	local file
 | |
| 
 | |
| 	create_files
 | |
| 
 | |
| 	# Compress and extract multi-file images, compare the result
 | |
| 	create_multi_image
 | |
| 	extract_multi_image
 | |
| 	for file in ${DATAFILES}; do
 | |
| 		assert_equal ${file} ${SRCDIR}/${file}
 | |
| 	done
 | |
| 	assert_equal ${TEST_OUT} ${DATAFILE2}
 | |
| 
 | |
| 	# List contents of multi-file image and compares output from tools
 | |
| 	list_image ${IMAGE_MULTI}
 | |
| 	assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
 | |
| 
 | |
| 	# Compress and extract FIT images, compare the result
 | |
| 	create_fit_image
 | |
| 	extract_fit_image
 | |
| 	for file in ${DATAFILES}; do
 | |
| 		assert_equal ${file} ${SRCDIR}/${file}
 | |
| 	done
 | |
| 	assert_equal ${TEST_OUT} ${DATAFILE2}
 | |
| 
 | |
| 	# List contents of FIT image and compares output from tools
 | |
| 	list_image ${IMAGE_FIT_ITB}
 | |
| 	assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
 | |
| 
 | |
| 	# Remove files created
 | |
| 	cleanup
 | |
| 
 | |
| 	echo "Tests passed."
 | |
| }
 | |
| 
 | |
| main
 |