u-boot/test/image/test-imagetools.sh
Guilherme Maciel Ferreira 39931f966a dumpimage: fit: extract FIT images
The dumpimage is able to extract components contained in a FIT image:

  $ ./dumpimage -T flat_dt -i CONTAINER.ITB -p INDEX FILE

The CONTAINER.ITB is a regular FIT container file. The INDEX is the poisition
of the sub-image to be retrieved, and FILE is the file (path+name) to save the
extracted sub-image.

For example, given the following kernel.its to build a kernel.itb:

  /dts-v1/;
  / {
      ...
      images {
        kernel@1 {
          description = "Kernel 2.6.32-34";
          data = /incbin/("/boot/vmlinuz-2.6.32-34-generic");
          type = "kernel";
          arch = "ppc";
          os = "linux";
          compression = "gzip";
          load = <00000000>;
          entry = <00000000>;
          hash@1 {
            algo = "md5";
          };
        };
        ...
      };
      ...
    };

The dumpimage can extract the 'kernel@1' node through the following command:

  $ ./dumpimage -T flat_dt -i kernel.itb -p 0 kernel
  Extracted:
   Image 0 (kernel@1)
    Description:  Kernel 2.6.32-34
    Created:      Wed Oct 22 15:50:26 2014
    Type:         Kernel Image
    Compression:  gzip compressed
    Data Size:    4040128 Bytes = 3945.44 kB = 3.85 MB
    Architecture: PowerPC
    OS:           Linux
    Load Address: 0x00000000
    Entry Point:  0x00000000
    Hash algo:    md5
    Hash value:   22352ad39bdc03e2e50f9cc28c1c3652

Which results in the file 'kernel' being exactly the same as '/boot/vmlinuz-2.6.32-34-generic'.

Signed-off-by: Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
2015-01-29 13:38:41 -05:00

226 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