]> code.ossystems Code Review - openembedded-core.git/commitdiff
boot-directdisk: Allow for EFI-only boot direct disk images
authorJoão Henrique Ferreira de Freitas <joaohf@gmail.com>
Thu, 12 Sep 2013 19:02:08 +0000 (19:02 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Sat, 14 Sep 2013 07:26:44 +0000 (08:26 +0100)
    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 <joaohf@gmail.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/boot-directdisk.bbclass
meta/classes/syslinux.bbclass

index 8a55aae6a3a26f82864c4db98acf438212e9ae53..4b9d7bd128d80befd54064a70decbb6eb32f409f 100644 (file)
@@ -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)
 }
 
index 501bc6db8ea0e47ce20d4c9b272404e1481f63c4..dae66097bc82fed7193c62f274c73607f00b684e 100644 (file)
@@ -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