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