Patchwork boot-directdisk: Allow for EFI-only boot direct disk images

login
register
mail settings
Submitter João Henrique Freitas
Date Sept. 12, 2013, 7:02 p.m.
Message ID <1379012528-7683-1-git-send-email-joaohf@gmail.com>
Download mbox | patch
Permalink /patch/57913/
State Accepted
Commit c58aceee7dc243467dd87f07ccc61859f8d945e6
Headers show

Comments

João Henrique Freitas - Sept. 12, 2013, 7:02 p.m.
From: João Henrique Ferreira de Freitas <joaohf@gmail.com>

    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>
---
 meta/classes/boot-directdisk.bbclass | 65 ++++++++++++++++++++++++++++++------
 meta/classes/syslinux.bbclass        |  5 +++
 2 files changed, 60 insertions(+), 10 deletions(-)
Darren Hart - Sept. 12, 2013, 8:53 p.m.
On Thu, 2013-09-12 at 16:02 -0300, Joao Henrique Ferreira de Freitas
wrote:
> From: João Henrique Ferreira de Freitas <joaohf@gmail.com>
> 
>     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.

Nitpic: please keep your commit message line length under something like
72 chars to allow for some indentation from the git log command,
otherwise this gets truncated in an 80 char terminal.

Otherwise looks good.

> 
> Signed-off-by: João Henrique Ferreira de Freitas <joaohf@gmail.com>

Reviewed-by: Darren Hart <dvhart@linux.intel.com>

> ---
>  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 8a55aae..4b9d7bd 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 501bc6d..dae6609 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

Patch

diff --git a/meta/classes/boot-directdisk.bbclass b/meta/classes/boot-directdisk.bbclass
index 8a55aae..4b9d7bd 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 501bc6d..dae6609 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