From 1a65d11d4b8f056fdf22c31a92d1e58dec6d89f6 Mon Sep 17 00:00:00 2001 From: George McCollister Date: Fri, 15 Jul 2016 15:40:54 -0500 Subject: kernel-fitimage: Add x86 support For x86, bzImage must be built instead of zImage. Include setup.bin (which is required to boot the kernel) in the fitimage and always use a load/boot address of 0x00090000. For details see: http://git.denx.de/?p=u-boot.git;a=blob;f=doc/uImage.FIT/x86-fit-boot.txt Signed-off-by: George McCollister Signed-off-by: Ross Burton --- meta/classes/kernel-fitimage.bbclass | 112 +++++++++++++++++++++++++---------- 1 file changed, 82 insertions(+), 30 deletions(-) diff --git a/meta/classes/kernel-fitimage.bbclass b/meta/classes/kernel-fitimage.bbclass index f05d8a54b5..8580247f82 100644 --- a/meta/classes/kernel-fitimage.bbclass +++ b/meta/classes/kernel-fitimage.bbclass @@ -7,12 +7,17 @@ python __anonymous () { depends = "%s u-boot-mkimage-native dtc-native" % depends d.setVar("DEPENDS", depends) + if d.getVar("UBOOT_ARCH", True) == "x86": + replacementtype = "bzImage" + else: + replacementtype = "zImage" + # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal # to kernel.bbclass . We have to override it, since we pack zImage # (at least for now) into the fitImage . typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE", True) or "" if 'fitImage' in typeformake.split(): - d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake.replace('fitImage', 'zImage')) + d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake.replace('fitImage', replacementtype)) image = d.getVar('INITRAMFS_IMAGE', True) if image: @@ -137,6 +142,33 @@ fitimage_emit_section_dtb() { EOF } +# +# Emit the fitImage ITS setup section +# +# $1 ... .its filename +# $2 ... Image counter +# $3 ... Path to setup image +fitimage_emit_section_setup() { + + setup_csum="sha1" + + cat << EOF >> ${1} + setup@${2} { + description = "Linux setup.bin"; + data = /incbin/("${3}"); + type = "x86_setup"; + arch = "${UBOOT_ARCH}"; + os = "linux"; + compression = "none"; + load = <0x00090000>; + entry = <0x00090000>; + hash@1 { + algo = "${setup_csum}"; + }; + }; +EOF +} + # # Emit the fitImage ITS ramdisk section # @@ -171,6 +203,7 @@ EOF # $2 ... Linux kernel ID # $3 ... DTB image ID # $4 ... ramdisk ID +# $5 ... config ID fitimage_emit_section_config() { conf_csum="sha1" @@ -179,24 +212,25 @@ fitimage_emit_section_config() { fi # Test if we have any DTBs at all - if [ -z "${3}" -a -z "${4}" ] ; then - conf_desc="Boot Linux kernel" - fdt_line="" - ramdisk_line="" - elif [ -z "${4}" ]; then - conf_desc="Boot Linux kernel with FDT blob" - fdt_line="fdt = \"fdt@${3}\";" - ramdisk_line="" - elif [ -z "${3}" ]; then - conf_desc="Boot Linux kernel with ramdisk" - fdt_line="" - ramdisk_line="ramdisk = \"ramdisk@${4}\";" - else - conf_desc="Boot Linux kernel with FDT blob, ramdisk" + conf_desc="Linux kernel" + kernel_line="kernel = \"kernel@${2}\";" + fdt_line="" + ramdisk_line="" + + if [ -n "${3}" ]; then + conf_desc="${conf_desc}, FDT blob" fdt_line="fdt = \"fdt@${3}\";" + fi + + if [ -n "${4}" ]; then + conf_desc="${conf_desc}, ramdisk" ramdisk_line="ramdisk = \"ramdisk@${4}\";" fi - kernel_line="kernel = \"kernel@${2}\";" + + if [ -n "${5}" ]; then + conf_desc="${conf_desc}, setup" + setup_line="setup = \"setup@${5}\";" + fi cat << EOF >> ${1} default = "conf@1"; @@ -205,6 +239,7 @@ fitimage_emit_section_config() { ${kernel_line} ${fdt_line} ${ramdisk_line} + ${setup_line} hash@1 { algo = "${conf_csum}"; }; @@ -212,16 +247,22 @@ EOF if [ ! -z "${conf_sign_keyname}" ] ; then - if [ -z "${3}" -a -z "${4}" ] ; then - sign_line="sign-images = \"kernel\";" - elif [ -z "${4}" ]; then - sign_line="sign-images = \"fdt\", \"kernel\";" - elif [ -z "${3}" ]; then - sign_line="sign-images = \"ramdisk\", \"kernel\";" - else - sign_line="sign-images = \"ramdisk\", \"fdt\", \"kernel\";" + sign_line="sign-images = \"kernel\"" + + if [ -n "${3}" ]; then + sign_line="${sign_line}, \"fdt\"" + fi + + if [ -n "${4}" ]; then + sign_line="${sign_line}, \"ramdisk\"" fi + if [ -n "${5}" ]; then + sign_line="${sign_line}, \"setup\"" + fi + + sign_line="${sign_line};" + cat << EOF >> ${1} signature@1 { algo = "${conf_csum},rsa2048"; @@ -246,6 +287,7 @@ fitimage_assemble() { kernelcount=1 dtbcount="" ramdiskcount=${3} + setupcount="" rm -f ${1} arch/${ARCH}/boot/${2} fitimage_emit_fit_header ${1} @@ -279,7 +321,15 @@ fitimage_assemble() { fi # - # Step 3: Prepare a ramdisk section. + # Step 3: Prepare a setup section. (For x86) + # + if test -e arch/${ARCH}/boot/setup.bin ; then + setupcount=1 + fitimage_emit_section_setup ${1} "${setupcount}" arch/${ARCH}/boot/setup.bin + fi + + # + # Step 4: Prepare a ramdisk section. # if [ "x${ramdiskcount}" = "x1" ] ; then copy_initramfs @@ -290,21 +340,23 @@ fitimage_assemble() { # Force the first Kernel and DTB in the default config kernelcount=1 - dtbcount=1 + if test -n "${dtbcount}"; then + dtbcount=1 + fi # - # Step 4: Prepare a configurations section + # Step 5: Prepare a configurations section # fitimage_emit_section_maint ${1} confstart - fitimage_emit_section_config ${1} ${kernelcount} ${dtbcount} ${ramdiskcount} + fitimage_emit_section_config ${1} "${kernelcount}" "${dtbcount}" "${ramdiskcount}" "${setupcount}" fitimage_emit_section_maint ${1} sectend fitimage_emit_section_maint ${1} fitend # - # Step 5: Assemble the image + # Step 6: Assemble the image # uboot-mkimage \ ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \ @@ -312,7 +364,7 @@ fitimage_assemble() { arch/${ARCH}/boot/${2} # - # Step 6: Sign the image and add public key to U-Boot dtb + # Step 7: Sign the image and add public key to U-Boot dtb # if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then uboot-mkimage \ -- cgit 1.2.3-korg