[OE-core] [PATCH] kernel-fitimage: add initramfs support
Marek Vasut
marex at denx.de
Thu May 26 18:32:01 UTC 2016
On 05/26/2016 03:53 PM, George McCollister wrote:
> On Wed, May 25, 2016 at 5:33 PM, Marek Vasut <marex at denx.de> wrote:
>> On 05/25/2016 01:25 AM, George McCollister wrote:
>>> If INITRAMFS_IMAGE is set, build an additional fitImage containing the
>>> initramfs. Copy the additional fitImage and the source .its file used to
>>> create it to DEPLOYDIR. The fitImage containing the initramfs must be
>>> built before do_deploy and after do_install to avoid circular dependencies.
>>
>> Yes, the circular dep is quite nasty.
>>
>>> UBOOT_RD_LOADADDRESS - Specifies the load address used by u-boot for the
>>> initramfs.
>>> UBOOT_RD_ENTRYPOINT - Specifies the entry point used by u-boot for the
>>> initramfs.
>>>
>>> Signed-off-by: George McCollister <george.mccollister at gmail.com>
>>> ---
>>> meta/classes/kernel-fitimage.bbclass | 275 +++++++++++++++++++++++------------
>>> 1 file changed, 180 insertions(+), 95 deletions(-)
>>>
>>> diff --git a/meta/classes/kernel-fitimage.bbclass b/meta/classes/kernel-fitimage.bbclass
>>> index 298eda2..2c2a642 100644
>>> --- a/meta/classes/kernel-fitimage.bbclass
>>> +++ b/meta/classes/kernel-fitimage.bbclass
>>> @@ -14,7 +14,7 @@ python __anonymous () {
>>>
>>> image = d.getVar('INITRAMFS_IMAGE', True)
>>> if image:
>>> - d.appendVarFlag('do_assemble_fitimage', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
>>> + d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
>>>
>>> # Verified boot will sign the fitImage and append the public key to
>>> # U-boot dtb. We ensure the U-Boot dtb is deployed before assembling
>>> @@ -30,8 +30,9 @@ UBOOT_MKIMAGE_DTCOPTS ??= ""
>>> #
>>> # Emit the fitImage ITS header
>>> #
>>> +# $1 ... .its filename
>>> fitimage_emit_fit_header() {
>>> - cat << EOF >> fit-image.its
>>> + cat << EOF >> ${1}
>>> /dts-v1/;
>>>
>>> / {
>>> @@ -43,32 +44,33 @@ EOF
>>> #
>>> # Emit the fitImage section bits
>>> #
>>> -# $1 ... Section bit type: imagestart - image section start
>>> +# $1 ... .its filename
>>> +# $2 ... Section bit type: imagestart - image section start
>>> # confstart - configuration section start
>>> # sectend - section end
>>> # fitend - fitimage end
>>> #
>>> fitimage_emit_section_maint() {
>>> - case $1 in
>>> + case $2 in
>>> imagestart)
>>> - cat << EOF >> fit-image.its
>>> + cat << EOF >> ${1}
>>>
>>> images {
>>> EOF
>>> ;;
>>> confstart)
>>> - cat << EOF >> fit-image.its
>>> + cat << EOF >> ${1}
>>>
>>> configurations {
>>> EOF
>>> ;;
>>> sectend)
>>> - cat << EOF >> fit-image.its
>>> + cat << EOF >> ${1}
>>> };
>>> EOF
>>> ;;
>>> fitend)
>>> - cat << EOF >> fit-image.its
>>> + cat << EOF >> ${1}
>>> };
>>> EOF
>>> ;;
>>
>> OK
>>
>>> @@ -78,9 +80,10 @@ EOF
>>> #
>>> # Emit the fitImage ITS kernel section
>>> #
>>> -# $1 ... Image counter
>>> -# $2 ... Path to kernel image
>>> -# $3 ... Compression type
>>> +# $1 ... .its filename
>>> +# $2 ... Image counter
>>> +# $3 ... Path to kernel image
>>> +# $4 ... Compression type
>>> fitimage_emit_section_kernel() {
>>>
>>> kernel_csum="sha1"
>>> @@ -88,17 +91,17 @@ fitimage_emit_section_kernel() {
>>> ENTRYPOINT=${UBOOT_ENTRYPOINT}
>>> if test -n "${UBOOT_ENTRYSYMBOL}"; then
>>> ENTRYPOINT=`${HOST_PREFIX}nm ${S}/vmlinux | \
>>> - awk '$3=="${UBOOT_ENTRYSYMBOL}" {print $1}'`
>>> + awk '$4=="${UBOOT_ENTRYSYMBOL}" {print $2}'`
>>> fi
>>>
>>> - cat << EOF >> fit-image.its
>>> - kernel@${1} {
>>> + cat << EOF >> ${1}
>>> + kernel@${2} {
>>> description = "Linux kernel";
>>> - data = /incbin/("${2}");
>>> + data = /incbin/("${3}");
>>> type = "kernel";
>>> arch = "${UBOOT_ARCH}";
>>> os = "linux";
>>> - compression = "${3}";
>>> + compression = "${4}";
>>> load = <${UBOOT_LOADADDRESS}>;
>>> entry = <${ENTRYPOINT}>;
>>> hash at 1 {
>>
>> OK
>>
>>> @@ -111,16 +114,17 @@ EOF
>>> #
>>> # Emit the fitImage ITS DTB section
>>> #
>>> -# $1 ... Image counter
>>> -# $2 ... Path to DTB image
>>> +# $1 ... .its filename
>>> +# $2 ... Image counter
>>> +# $3 ... Path to DTB image
>>> fitimage_emit_section_dtb() {
>>>
>>> dtb_csum="sha1"
>>>
>>> - cat << EOF >> fit-image.its
>>> - fdt@${1} {
>>> + cat << EOF >> ${1}
>>> + fdt@${2} {
>>> description = "Flattened Device Tree blob";
>>> - data = /incbin/("${2}");
>>> + data = /incbin/("${3}");
>>> type = "flat_dt";
>>> arch = "${UBOOT_ARCH}";
>>> compression = "none";
>>
>> OK
>>
>>> @@ -132,10 +136,39 @@ EOF
>>> }
>>>
>>> #
>>> +# Emit the fitImage ITS ramdisk section
>>> +#
>>> +# $1 ... .its filename
>>> +# $2 ... Image counter
>>> +# $3 ... Path to ramdisk image
>>> +fitimage_emit_section_ramdisk() {
>>> +
>>> + ramdisk_csum="sha1"
>>> +
>>> + cat << EOF >> ${1}
>>> + ramdisk@${2} {
>>> + description = "ramdisk image";
>>> + data = /incbin/("${3}");
>>> + type = "ramdisk";
>>> + arch = "${UBOOT_ARCH}";
>>> + os = "linux";
>>
>> Do you need to set this for ramdisk ?
> Without it, I get this error when trying to boot:
> ## Loading ramdisk from FIT Image at 82000000 ...
> Using 'conf at 1' configuration
> Trying 'ramdisk at 1' ramdisk subimage
> Description: ramdisk image
> Type: RAMDisk Image
> Compression: uncompressed
> Data Start: 0x8250d3cc
> Data Size: 5395968 Bytes = 5.1 MiB
> Architecture: ARM
> OS: Unknown OS
> Load Address: 0x81000000
> Entry Point: 0x81000000
> Hash algo: sha1
> Hash value: d5a83229e5d045a685d03419f5495d2eab7513a7
> Verifying Hash Integrity ... sha1+ OK
> No Unknown OS ARM RAMDisk Image Image
> Ramdisk image is corrupt or invalid
Oh, hmmmm, that's not great but it does make sense. Thanks for checking!
>>> + compression = "none";
>>> + load = <${UBOOT_RD_LOADADDRESS}>;
>>> + entry = <${UBOOT_RD_ENTRYPOINT}>;
>>> + hash at 1 {
>>> + algo = "${ramdisk_csum}";
>>> + };
>>> + };
>>> +EOF
>>> +}
>>> +
>>> +#
>>> # Emit the fitImage ITS configuration section
>>> #
>>> -# $1 ... Linux kernel ID
>>> -# $2 ... DTB image ID
>>> +# $1 ... .its filename
>>> +# $2 ... Linux kernel ID
>>> +# $3 ... DTB image ID
>>> +# $4 ... ramdisk ID
>>> fitimage_emit_section_config() {
>>>
>>> conf_csum="sha1"
>>> @@ -144,21 +177,29 @@ fitimage_emit_section_config() {
>>> fi
>>>
>>> # Test if we have any DTBs at all
>>> - if [ -z "${2}" ] ; then
>>> + if [ -z "${3}" ] ; then
>>> conf_desc="Boot Linux kernel"
>>> fdt_line=""
>>> - else
>>> + ramdisk_line=""
>>> + elif [ -z "${4}" ]; then
>>> conf_desc="Boot Linux kernel with FDT blob"
>>> - fdt_line="fdt = \"fdt@${2}\";"
>>> + fdt_line="fdt = \"fdt@${3}\";"
>>> + ramdisk_line=""
>>> + else
>>> + # TODO - handle ramdisk without FDT blob
>>
>> I really don't like the todo here :) Maybe you can check if the DT image
>> ends with .dtb or not to discern ramdisk and DT ?
> Okay, this should be taken care of. See incoming v2 patch.
Thanks!
>>> + conf_desc="Boot Linux kernel with FDT blob, ramdisk"
>>> + fdt_line="fdt = \"fdt@${3}\";"
>>> + ramdisk_line="ramdisk = \"ramdisk@${4}\";"
>>> fi
>>> - kernel_line="kernel = \"kernel@${1}\";"
>>> + kernel_line="kernel = \"kernel@${2}\";"
>>>
>>> - cat << EOF >> fit-image.its
>>> + cat << EOF >> ${1}
>>> default = "conf at 1";
>>> conf at 1 {
>>> description = "${conf_desc}";
>>> ${kernel_line}
>>> ${fdt_line}
>>> + ${ramdisk_line}
>>> hash at 1 {
>>> algo = "${conf_csum}";
>>> };
>>> @@ -166,102 +207,131 @@ EOF
>>>
>>> if [ ! -z "${conf_sign_keyname}" ] ; then
>>>
>>> - if [ -z "${2}" ] ; then
>>> + if [ -z "${3}" ] ; then
>>> sign_line="sign-images = \"kernel\";"
>>> - else
>>> + elif [ -z "${4}" ]; then
>>> sign_line="sign-images = \"fdt\", \"kernel\";"
>>> + else
>>> + sign_line="sign-images = \"ramdisk\", \"fdt\", \"kernel\";"
>>> fi
>>>
>>> - cat << EOF >> fit-image.its
>>> + cat << EOF >> ${1}
>>> signature at 1 {
>>> algo = "${conf_csum},rsa2048";
>>> key-name-hint = "${conf_sign_keyname}";
>>> - sign-images = "fdt", "kernel";
>>> + ${sign_line}
>>> };
>>> EOF
>>> fi
>>>
>>> - cat << EOF >> fit-image.its
>>> + cat << EOF >> ${1}
>>> };
>>
>> OK
>>
>>> EOF
>>> }
>>>
>>> -do_assemble_fitimage() {
>>> - if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then
>>> - kernelcount=1
>>> - dtbcount=""
>>> - rm -f fit-image.its arch/${ARCH}/boot/fitImage
>>> -
>>> - fitimage_emit_fit_header
>>> -
>>> - #
>>> - # Step 1: Prepare a kernel image section.
>>> - #
>>> - fitimage_emit_section_maint imagestart
>>> -
>>> - uboot_prep_kimage
>>> - fitimage_emit_section_kernel "${kernelcount}" linux.bin "${linux_comp}"
>>> -
>>> - #
>>> - # Step 2: Prepare a DTB image section
>>> - #
>>> - if test -n "${KERNEL_DEVICETREE}"; then
>>> - dtbcount=1
>>> - for DTB in ${KERNEL_DEVICETREE}; do
>>> - if echo ${DTB} | grep -q '/dts/'; then
>>> - bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
>>> - DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>>> - fi
>>> - DTB_PATH="arch/${ARCH}/boot/dts/${DTB}"
>>> - if [ ! -e "${DTB_PATH}" ]; then
>>> - DTB_PATH="arch/${ARCH}/boot/${DTB}"
>>> - fi
>>> -
>>> - fitimage_emit_section_dtb ${dtbcount} ${DTB_PATH}
>>> - dtbcount=`expr ${dtbcount} + 1`
>>> - done
>>> - fi
>>> +#
>>> +# Assemble fitImage
>>> +#
>>> +# $1 ... .its filename
>>> +# $2 ... fitImage name
>>> +# $3 ... include ramdisk
>>> +fitimage_assemble() {
>>> + kernelcount=1
>>> + dtbcount=""
>>> + ramdiskcount=${3}
>>> + rm -f ${1} arch/${ARCH}/boot/${2}
>>> +
>>> + fitimage_emit_fit_header ${1}
>>> +
>>> + #
>>> + # Step 1: Prepare a kernel image section.
>>> + #
>>> + fitimage_emit_section_maint ${1} imagestart
>>> +
>>> + uboot_prep_kimage
>>> + fitimage_emit_section_kernel ${1} "${kernelcount}" linux.bin "${linux_comp}"
>>> +
>>> + #
>>> + # Step 2: Prepare a DTB image section
>>> + #
>>> + if test -n "${KERNEL_DEVICETREE}"; then
>>> + dtbcount=1
>>> + for DTB in ${KERNEL_DEVICETREE}; do
>>> + if echo ${DTB} | grep -q '/dts/'; then
>>> + bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
>>> + DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>>> + fi
>>> + DTB_PATH="arch/${ARCH}/boot/dts/${DTB}"
>>> + if [ ! -e "${DTB_PATH}" ]; then
>>> + DTB_PATH="arch/${ARCH}/boot/${DTB}"
>>> + fi
>>> +
>>> + fitimage_emit_section_dtb ${1} ${dtbcount} ${DTB_PATH}
>>> + dtbcount=`expr ${dtbcount} + 1`
>>> + done
>>> + fi
>>>
>>> - fitimage_emit_section_maint sectend
>>> + #
>>> + # Step 3: Prepare a ramdisk section.
>>> + #
>>> + if [ "x${ramdiskcount}" = "x1" ] ; then
>>> + copy_initramfs
>>> + fitimage_emit_section_ramdisk ${1} "${ramdiskcount}" ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
>>> + fi
>>>
>>> - # Force the first Kernel and DTB in the default config
>>> - kernelcount=1
>>> - dtbcount=1
>>> + fitimage_emit_section_maint ${1} sectend
>>> +
>>> + # Force the first Kernel and DTB in the default config
>>> + kernelcount=1
>>> + dtbcount=1
>>>
>>> - #
>>> - # Step 3: Prepare a configurations section
>>> - #
>>> - fitimage_emit_section_maint confstart
>>> + #
>>> + # Step 4: Prepare a configurations section
>>> + #
>>> + fitimage_emit_section_maint ${1} confstart
>>>
>>> - fitimage_emit_section_config ${kernelcount} ${dtbcount}
>>> + fitimage_emit_section_config ${1} ${kernelcount} ${dtbcount} ${ramdiskcount}
>>>
>>> - fitimage_emit_section_maint sectend
>>> + fitimage_emit_section_maint ${1} sectend
>>>
>>> - fitimage_emit_section_maint fitend
>>> + fitimage_emit_section_maint ${1} fitend
>>>
>>> - #
>>> - # Step 4: Assemble the image
>>> - #
>>> + #
>>> + # Step 5: Assemble the image
>>> + #
>>> + uboot-mkimage \
>>> + ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
>>> + -f ${1} \
>>> + arch/${ARCH}/boot/${2}
>>> +
>>> + #
>>> + # Step 6: Sign the image and add public key to U-Boot dtb
>>> + #
>>> + if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then
>>> uboot-mkimage \
>>> ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
>>> - -f fit-image.its \
>>> - arch/${ARCH}/boot/fitImage
>>> -
>>> - #
>>> - # Step 5: Sign the image and add public key to U-Boot dtb
>>> - #
>>> - if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then
>>> - uboot-mkimage \
>>> - ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
>>> - -F -k "${UBOOT_SIGN_KEYDIR}" \
>>> - -K "${DEPLOY_DIR_IMAGE}/${UBOOT_DTB_BINARY}" \
>>> - -r arch/${ARCH}/boot/fitImage
>>> - fi
>>> + -F -k "${UBOOT_SIGN_KEYDIR}" \
>>> + -K "${DEPLOY_DIR_IMAGE}/${UBOOT_DTB_BINARY}" \
>>> + -r arch/${ARCH}/boot/${2}
>>> + fi
>>> +}
>>> +
>>> +do_assemble_fitimage() {
>>> + if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then
>>> + fitimage_assemble fit-image.its fitImage
>>> fi
>>> }
>>>
>>> addtask assemble_fitimage before do_install after do_compile
>>>
>>> +do_assemble_fitimage_initramfs() {
>>> + if test "x${KERNEL_IMAGETYPE}" = "xfitImage" -a -n "${INITRAMFS_IMAGE}" ; then
>>> + fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage-${INITRAMFS_IMAGE} 1
>>> + fi
>>> +}
>>> +
>>> +addtask assemble_fitimage_initramfs before do_deploy after do_install
>>> +
>>> kernel_do_deploy[vardepsexclude] = "DATETIME"
>>> kernel_do_deploy_append() {
>>> # Update deploy directory
>>> @@ -275,8 +345,23 @@ kernel_do_deploy_append() {
>>> linux_bin_symlink_name=${KERNEL_IMAGETYPE}-linux.bin-${MACHINE}
>>> install -m 0644 linux.bin ${DEPLOYDIR}/${linux_bin_base_name}.bin
>>>
>>> + if [ -n "${INITRAMFS_IMAGE}" ]; then
>>> + echo "Copying fit-image-${INITRAMFS_IMAGE}.its source file..."
>>> + its_initramfs_base_name="${KERNEL_IMAGETYPE}-its-${INITRAMFS_IMAGE}-${PV}-${PR}-${MACHINE}-${DATETIME}"
>>> + its_initramfs_symlink_name=${KERNEL_IMAGETYPE}-its-${INITRAMFS_IMAGE}-${MACHINE}
>>> + install -m 0644 fit-image-${INITRAMFS_IMAGE}.its ${DEPLOYDIR}/${its_initramfs_base_name}.its
>>> + fit_initramfs_base_name="${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${PV}-${PR}-${MACHINE}-${DATETIME}"
>>> + fit_initramfs_symlink_name=${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}
>>> + install -m 0644 arch/${ARCH}/boot/fitImage-${INITRAMFS_IMAGE} ${DEPLOYDIR}/${fit_initramfs_base_name}.bin
>>> + fi
>>> +
>>> cd ${DEPLOYDIR}
>>> ln -sf ${its_base_name}.its ${its_symlink_name}.its
>>> ln -sf ${linux_bin_base_name}.bin ${linux_bin_symlink_name}.bin
>>> +
>>> + if [ -n "${INITRAMFS_IMAGE}" ]; then
>>> + ln -sf ${its_initramfs_base_name}.its ${its_initramfs_symlink_name}.its
>>> + ln -sf ${fit_initramfs_base_name}.bin ${fit_initramfs_symlink_name}.bin
>>> + fi
>>> fi
>>> }
>>>
>> Cool stuff, thanks!
>>
>> --
>> Best regards,
>> Marek Vasut
--
Best regards,
Marek Vasut
More information about the Openembedded-core
mailing list