From c58aceee7dc243467dd87f07ccc61859f8d945e6 Mon Sep 17 00:00:00 2001 From: João Henrique Ferreira de Freitas Date: Thu, 12 Sep 2013 19:02:08 +0000 Subject: boot-directdisk: Allow for EFI-only boot direct disk images MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Condition building PCBIOS legacy images on MACHINE_FEATURES containing "pcbios" or not containing "efi". This ensures existing BSPs will continue to get the old PCBIOS legacy-only images. New BSPs can add "efi", "pcbios", or both. The images created likewise support one or the other or both. Signed-off-by: João Henrique Ferreira de Freitas Signed-off-by: Saul Wold Signed-off-by: Richard Purdie --- meta/classes/boot-directdisk.bbclass | 65 ++++++++++++++++++++++++++++++------ meta/classes/syslinux.bbclass | 5 +++ 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/meta/classes/boot-directdisk.bbclass b/meta/classes/boot-directdisk.bbclass index 8a55aae6a3..4b9d7bd128 100644 --- a/meta/classes/boot-directdisk.bbclass +++ b/meta/classes/boot-directdisk.bbclass @@ -31,6 +31,29 @@ EXCLUDE_FROM_WORLD = "1" BOOTDD_VOLUME_ID ?= "boot" BOOTDD_EXTRA_SPACE ?= "16384" +EFI = "${@base_contains("MACHINE_FEATURES", "efi", "1", "0", d)}" +EFI_CLASS = "${@base_contains("MACHINE_FEATURES", "efi", "grub-efi", "", d)}" + +# Include legacy boot if MACHINE_FEATURES includes "pcbios" or if it does not +# contain "efi". This way legacy is supported by default if neither is +# specified, maintaining the original behavior. +def pcbios(d): + pcbios = base_contains("MACHINE_FEATURES", "pcbios", "1", "0", d) + if pcbios == "0": + pcbios = base_contains("MACHINE_FEATURES", "efi", "0", "1", d) + return pcbios + +def pcbios_class(d): + if d.getVar("PCBIOS", True) == "1": + return "syslinux" + return "" + +PCBIOS = "${@pcbios(d)}" +PCBIOS_CLASS = "${@pcbios_class(d)}" + +inherit ${PCBIOS_CLASS} +inherit ${EFI_CLASS} + # Get the build_syslinux_cfg() function from the syslinux class AUTO_SYSLINUXCFG = "1" @@ -38,17 +61,32 @@ DISK_SIGNATURE ?= "${DISK_SIGNATURE_GENERATED}" SYSLINUX_ROOT ?= "root=/dev/sda2" SYSLINUX_TIMEOUT ?= "10" -inherit syslinux - +populate() { + DEST=$1 + install -d ${DEST} + + # Install bzImage, initrd, and rootfs.img in DEST for all loaders to use. + install -m 0644 ${STAGING_KERNEL_DIR}/bzImage ${DEST}/vmlinuz + + if [ -n "${INITRD}" ] && [ -s "${INITRD}" ]; then + install -m 0644 ${INITRD} ${DEST}/initrd + fi + +} + build_boot_dd() { HDDDIR="${S}/hdd/boot" HDDIMG="${S}/hdd.image" IMAGE=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hdddirect - install -d $HDDDIR - install -m 0644 ${STAGING_KERNEL_DIR}/bzImage $HDDDIR/vmlinuz - install -m 0644 ${S}/syslinux.cfg $HDDDIR/syslinux.cfg - install -m 444 ${STAGING_DATADIR}/syslinux/ldlinux.sys $HDDDIR/ldlinux.sys + populate ${HDDDIR} + + if [ "${PCBIOS}" = "1" ]; then + syslinux_hddimg_populate + fi + if [ "${EFI}" = "1" ]; then + grubefi_hddimg_populate + fi BLOCKS=`du -bks $HDDDIR | cut -f 1` BLOCKS=`expr $BLOCKS + ${BOOTDD_EXTRA_SPACE}` @@ -62,7 +100,9 @@ build_boot_dd() { mkdosfs -n ${BOOTDD_VOLUME_ID} -S 512 -C $HDDIMG $BLOCKS mcopy -i $HDDIMG -s $HDDDIR/* ::/ - syslinux $HDDIMG + if [ "${PCBIOS}" = "1" ]; then + syslinux_hdddirect_install $HDDIMG + fi chmod 644 $HDDIMG ROOTFSBLOCKS=`du -Lbks ${ROOTFS} | cut -f 1` @@ -85,9 +125,11 @@ build_boot_dd() { dd of=$IMAGE bs=1 seek=440 conv=notrunc OFFSET=`expr $END2 / 512` - dd if=${STAGING_DATADIR}/syslinux/mbr.bin of=$IMAGE conv=notrunc + if [ "${PCBIOS}" = "1" ]; then + dd if=${STAGING_DATADIR}/syslinux/mbr.bin of=$IMAGE conv=notrunc + fi dd if=$HDDIMG of=$IMAGE conv=notrunc seek=1 bs=512 - dd if=${ROOTFS} of=$IMAGE conv=notrunc seek=$OFFSET bs=512 + dd if=${ROOTFS} of=$IMAGE conv=notrunc seek=$OFFSET bs=512 cd ${DEPLOY_DIR_IMAGE} rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.hdddirect @@ -96,7 +138,10 @@ build_boot_dd() { python do_bootdirectdisk() { validate_disk_signature(d) - bb.build.exec_func('build_syslinux_cfg', d) + if d.getVar("PCBIOS", True) == "1": + bb.build.exec_func('build_syslinux_cfg', d) + if d.getVar("EFI", True) == "1": + bb.build.exec_func('build_grub_cfg', d) bb.build.exec_func('build_boot_dd', d) } diff --git a/meta/classes/syslinux.bbclass b/meta/classes/syslinux.bbclass index 501bc6db8e..dae66097bc 100644 --- a/meta/classes/syslinux.bbclass +++ b/meta/classes/syslinux.bbclass @@ -64,6 +64,11 @@ syslinux_hddimg_install() { syslinux ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hddimg } +syslinux_hdddirect_install() { + DEST=$1 + syslinux $DEST +} + python build_syslinux_cfg () { import copy import sys -- cgit 1.2.3-korg