Re: [OE-core] [PATCH 3/3] classes: Add gummiboot class

2014-03-12 Thread Koen Kooi

Op 11 mrt. 2014, om 22:38 heeft Darren Hart dvh...@linux.intel.com het 
volgende geschreven:

 On 3/7/14, 1:57, Stanacar, StefanX stefanx.stana...@intel.com wrote:
 
 
 
 
 On Thu, 2014-03-06 at 14:36 -0800, Darren Hart wrote:
 On 3/6/14, 10:15, Stefan Stanacar stefanx.stana...@intel.com wrote:
 
 Adds a gummiboot class similar to grub-efi class and makes the
 necessary
 changes so it can be used for live/hddimg images as well.
 
 One can set EFI_PROVIDER = gummiboot in local.conf to use gummiboot
 instead of grub-efi.
 Gummiboot requires some kernel options that are not enabled by default,
 so one has to build
 with KERNEL_FEATURES_append =  cfg/efi-ext.
 
 cfg/efi is insufficient?
 
 
 cfg/efi doesn't have CONFIG_EFI_STUB=y which is required by gummiboot.
 cfg/efi-ext adds more than that, it's true.
 
 Weird... Although the STUB should probably be in efi rather than efi-ext.
 I'm surprised gummiboot requires STUB... Since STUB is there to allow the
 kernel to be booted directly, no bootloader required. I guess gummiboot is
 slightly less than a boot loader :-)

The gummiboot docs still claim to support both 'linux' and 'efi', so it's 
supposed to work.

regards,

Koen

 
 I'd Ack a patch to move STUB from efi-ext to efi.
 
 
 
 It's also a good idea to enable CONFIG_EFIVARS_FS, which is the
 newer/better interface than CONFIG_EFI_VARS that cfg/efi-ext enables.
 
 
 Hrm... OK, perhaps time to revisit those fragments and update them for
 current usage.
 
 
 --
 Darren
 
 
 The install scripts have been updated too, keeping the old behaviour
 around,
 but accounting for the new boot loader config files (if they exist).
 It can be argued that the installer and bootimg are a bit wierd and not
 necessarily correct,
 but I wanted to have the exact same behviour with gummiboot.
 With the default EFI_PROVIDER = grub-efi nothing changes, everthing
 should be just as before.
 
 I've tested live boot, install and normal boot on:
   - FRI2
   - genericx86-64 on NUC
 with:
 EFI_PROVIDER = gummiboot
 KERNEL_FEATURES_append =  cfg/efi-ext
 in local.conf.
 
 Signed-off-by: Stefan Stanacar stefanx.stana...@intel.com
 
 
 Generally looks good. My only reservation is the same as for 2/3, should
 we define an EFI interface rather than having to construct function
 names
 in the consumers of this class?
 
 I don't have a strong opinion here, it just seemed the simplest way atm,
 then adding another interface.
 
 Cheers,
 Stefan
 
 
 --
 Darren
 
 ---
 meta/classes/gummiboot.bbclass | 112
 +
 .../initrdscripts/files/init-install-efi.sh|  51 +++---
 2 files changed, 147 insertions(+), 16 deletions(-)
 create mode 100644 meta/classes/gummiboot.bbclass
 
 diff --git a/meta/classes/gummiboot.bbclass
 b/meta/classes/gummiboot.bbclass
 new file mode 100644
 index 000..5c11286
 --- /dev/null
 +++ b/meta/classes/gummiboot.bbclass
 @@ -0,0 +1,112 @@
 +EFICLASS_FUNC_PREFIX = gummiboot
 +
 +do_bootimg[depends] += gummiboot:do_deploy
 +do_bootdirectdisk[depends] += gummiboot:do_deploy
 +
 +EFIDIR = /EFI/BOOT
 +
 +GUMMIBOOT_CFG ?= ${S}/loader.conf
 +GUMMIBOOT_ENTRIES ?= 
 +GUMMIBOOT_TIMEOUT ?= 10
 +
 +gummiboot_populate() {
 +DEST=$1
 +
 +EFI_IMAGE=gummibootia32.efi
 +DEST_EFI_IMAGE=bootia32.efi
 +if [ ${TARGET_ARCH} = x86_64 ]; then
 +EFI_IMAGE=gummibootx64.efi
 +DEST_EFI_IMAGE=bootx64.efi
 +fi
 +
 +install -d ${DEST}${EFIDIR}
 +# gummiboot requires these paths for configuration files
 +# they are not customizable so no point in new vars
 +install -d ${DEST}/loader
 +install -d ${DEST}/loader/entries
 +install -m 0644 ${DEPLOY_DIR_IMAGE}/${EFI_IMAGE}
 ${DEST}${EFIDIR}/${DEST_EFI_IMAGE}
 +install -m 0644 ${GUMMIBOOT_CFG} ${DEST}/loader/loader.conf
 +for i in ${GUMMIBOOT_ENTRIES}; do
 +install -m 0644 ${i} ${DEST}/loader/entries
 +done
 +}
 +
 +gummiboot_iso_populate() {
 +iso_dir=$1
 +gummiboot_populate $iso_dir
 +mkdir -p ${EFIIMGDIR}/${EFIDIR}
 +cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
 +cp $iso_dir/vmlinuz ${EFIIMGDIR}
 +echo ${DEST_EFI_IMAGE}  ${EFIIMGDIR}/startup.nsh
 +if [ -f $iso_dir/initrd ] ; then
 +cp $iso_dir/initrd ${EFIIMGDIR}
 +fi
 +}
 +
 +gummiboot_hddimg_populate() {
 +gummiboot_populate $1
 +}
 +
 +python build_gummiboot_cfg() {
 +s = d.getVar(S, True)
 +labels = d.getVar('LABELS', True)
 +if not labels:
 +bb.debug(1, LABELS not defined, nothing to do)
 +return
 +
 +if labels == []:
 +bb.debug(1, No labels, nothing to do)
 +return
 +
 +cfile = d.getVar('GUMMIBOOT_CFG', True)
 +try:
 + cfgfile = open(cfile, 'w')
 +except OSError:
 +raise bb.build.funcFailed('Unable to open %s' % (cfile))
 +
 +cfgfile.write('# Automatically created by OE\n')
 +

Re: [OE-core] [PATCH 3/3] classes: Add gummiboot class

2014-03-12 Thread Matt Fleming
On Tue, 11 Mar, at 01:38:08PM, Darren Hart wrote:
 
 I'm surprised gummiboot requires STUB... Since STUB is there to allow the
 kernel to be booted directly, no bootloader required. I guess gummiboot is
 slightly less than a boot loader :-)

Gummiboot is an EFI application loader.

Since CONFIG_EFI_STUB sticks a PE/COFF header at the front of the
bzImage, it appears as an EFI application which gummiboot knows how to
load and run. This is also the reason you can execute the bzImage from
the EFI shell (or Boot Manager).

-- 
Matt Fleming, Intel Open Source Technology Center
-- 
___
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core


Re: [OE-core] [PATCH 3/3] classes: Add gummiboot class

2014-03-12 Thread Stanacar, StefanX



On Wed, 2014-03-12 at 07:18 +0100, Koen Kooi wrote:
 Op 11 mrt. 2014, om 22:38 heeft Darren Hart dvh...@linux.intel.com het 
 volgende geschreven:
 
  On 3/7/14, 1:57, Stanacar, StefanX stefanx.stana...@intel.com wrote:
  
  
  
  
  On Thu, 2014-03-06 at 14:36 -0800, Darren Hart wrote:
  On 3/6/14, 10:15, Stefan Stanacar stefanx.stana...@intel.com wrote:
  
  Adds a gummiboot class similar to grub-efi class and makes the
  necessary
  changes so it can be used for live/hddimg images as well.
  
  One can set EFI_PROVIDER = gummiboot in local.conf to use gummiboot
  instead of grub-efi.
  Gummiboot requires some kernel options that are not enabled by default,
  so one has to build
  with KERNEL_FEATURES_append =  cfg/efi-ext.
  
  cfg/efi is insufficient?
  
  
  cfg/efi doesn't have CONFIG_EFI_STUB=y which is required by gummiboot.
  cfg/efi-ext adds more than that, it's true.
  
  Weird... Although the STUB should probably be in efi rather than efi-ext.
  I'm surprised gummiboot requires STUB... Since STUB is there to allow the
  kernel to be booted directly, no bootloader required. I guess gummiboot is
  slightly less than a boot loader :-)
 
 The gummiboot docs still claim to support both 'linux' and 'efi', so it's 
 supposed to work.

The site claims that Linux kernels need to be built with
CONFIG_EFI_STUB, and without that for me it wouldn't boot.

What you're saying is for the config file 
From the site:

efi executable EFI image
options options to pass to the EFI image / kernel command line
linux   linux kernel image (gummiboot still requires the kernel to have an
EFI stub)
initrd  initramfs image (gummiboot just adds this as option initrd=)

Cheers,
Stefan

 
 regards,
 
 Koen
 
  
  I'd Ack a patch to move STUB from efi-ext to efi.
  
  
  
  It's also a good idea to enable CONFIG_EFIVARS_FS, which is the
  newer/better interface than CONFIG_EFI_VARS that cfg/efi-ext enables.
  
  
  Hrm... OK, perhaps time to revisit those fragments and update them for
  current usage.
  
  
  --
  Darren
  
  
  The install scripts have been updated too, keeping the old behaviour
  around,
  but accounting for the new boot loader config files (if they exist).
  It can be argued that the installer and bootimg are a bit wierd and not
  necessarily correct,
  but I wanted to have the exact same behviour with gummiboot.
  With the default EFI_PROVIDER = grub-efi nothing changes, everthing
  should be just as before.
  
  I've tested live boot, install and normal boot on:
- FRI2
- genericx86-64 on NUC
  with:
  EFI_PROVIDER = gummiboot
  KERNEL_FEATURES_append =  cfg/efi-ext
  in local.conf.
  
  Signed-off-by: Stefan Stanacar stefanx.stana...@intel.com
  
  
  Generally looks good. My only reservation is the same as for 2/3, should
  we define an EFI interface rather than having to construct function
  names
  in the consumers of this class?
  
  I don't have a strong opinion here, it just seemed the simplest way atm,
  then adding another interface.
  
  Cheers,
  Stefan
  
  
  --
  Darren
  
  ---
  meta/classes/gummiboot.bbclass | 112
  +
  .../initrdscripts/files/init-install-efi.sh|  51 +++---
  2 files changed, 147 insertions(+), 16 deletions(-)
  create mode 100644 meta/classes/gummiboot.bbclass
  
  diff --git a/meta/classes/gummiboot.bbclass
  b/meta/classes/gummiboot.bbclass
  new file mode 100644
  index 000..5c11286
  --- /dev/null
  +++ b/meta/classes/gummiboot.bbclass
  @@ -0,0 +1,112 @@
  +EFICLASS_FUNC_PREFIX = gummiboot
  +
  +do_bootimg[depends] += gummiboot:do_deploy
  +do_bootdirectdisk[depends] += gummiboot:do_deploy
  +
  +EFIDIR = /EFI/BOOT
  +
  +GUMMIBOOT_CFG ?= ${S}/loader.conf
  +GUMMIBOOT_ENTRIES ?= 
  +GUMMIBOOT_TIMEOUT ?= 10
  +
  +gummiboot_populate() {
  +DEST=$1
  +
  +EFI_IMAGE=gummibootia32.efi
  +DEST_EFI_IMAGE=bootia32.efi
  +if [ ${TARGET_ARCH} = x86_64 ]; then
  +EFI_IMAGE=gummibootx64.efi
  +DEST_EFI_IMAGE=bootx64.efi
  +fi
  +
  +install -d ${DEST}${EFIDIR}
  +# gummiboot requires these paths for configuration files
  +# they are not customizable so no point in new vars
  +install -d ${DEST}/loader
  +install -d ${DEST}/loader/entries
  +install -m 0644 ${DEPLOY_DIR_IMAGE}/${EFI_IMAGE}
  ${DEST}${EFIDIR}/${DEST_EFI_IMAGE}
  +install -m 0644 ${GUMMIBOOT_CFG} ${DEST}/loader/loader.conf
  +for i in ${GUMMIBOOT_ENTRIES}; do
  +install -m 0644 ${i} ${DEST}/loader/entries
  +done
  +}
  +
  +gummiboot_iso_populate() {
  +iso_dir=$1
  +gummiboot_populate $iso_dir
  +mkdir -p ${EFIIMGDIR}/${EFIDIR}
  +cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
  +cp $iso_dir/vmlinuz ${EFIIMGDIR}
  +echo ${DEST_EFI_IMAGE}  ${EFIIMGDIR}/startup.nsh
  +if [ -f $iso_dir/initrd ] ; then
  +cp $iso_dir/initrd 

Re: [OE-core] [PATCH 3/3] classes: Add gummiboot class

2014-03-11 Thread Darren Hart
On 3/7/14, 1:57, Stanacar, StefanX stefanx.stana...@intel.com wrote:




On Thu, 2014-03-06 at 14:36 -0800, Darren Hart wrote:
 On 3/6/14, 10:15, Stefan Stanacar stefanx.stana...@intel.com wrote:
 
 Adds a gummiboot class similar to grub-efi class and makes the
necessary
 changes so it can be used for live/hddimg images as well.
 
 One can set EFI_PROVIDER = gummiboot in local.conf to use gummiboot
 instead of grub-efi.
 Gummiboot requires some kernel options that are not enabled by default,
 so one has to build
 with KERNEL_FEATURES_append =  cfg/efi-ext.
 
 cfg/efi is insufficient?
 

cfg/efi doesn't have CONFIG_EFI_STUB=y which is required by gummiboot.
cfg/efi-ext adds more than that, it's true.

Weird... Although the STUB should probably be in efi rather than efi-ext.
I'm surprised gummiboot requires STUB... Since STUB is there to allow the
kernel to be booted directly, no bootloader required. I guess gummiboot is
slightly less than a boot loader :-)

I'd Ack a patch to move STUB from efi-ext to efi.



It's also a good idea to enable CONFIG_EFIVARS_FS, which is the
newer/better interface than CONFIG_EFI_VARS that cfg/efi-ext enables.


Hrm... OK, perhaps time to revisit those fragments and update them for
current usage.


--
Darren

 
 The install scripts have been updated too, keeping the old behaviour
 around,
 but accounting for the new boot loader config files (if they exist).
 It can be argued that the installer and bootimg are a bit wierd and not
 necessarily correct,
 but I wanted to have the exact same behviour with gummiboot.
 With the default EFI_PROVIDER = grub-efi nothing changes, everthing
 should be just as before.
 
 I've tested live boot, install and normal boot on:
 - FRI2
 - genericx86-64 on NUC
 with:
   EFI_PROVIDER = gummiboot
   KERNEL_FEATURES_append =  cfg/efi-ext
 in local.conf.
 
 Signed-off-by: Stefan Stanacar stefanx.stana...@intel.com
 
 
 Generally looks good. My only reservation is the same as for 2/3, should
 we define an EFI interface rather than having to construct function
names
 in the consumers of this class?

I don't have a strong opinion here, it just seemed the simplest way atm,
then adding another interface.

Cheers,
Stefan

 
 --
 Darren
 
 ---
  meta/classes/gummiboot.bbclass | 112
 +
  .../initrdscripts/files/init-install-efi.sh|  51 +++---
  2 files changed, 147 insertions(+), 16 deletions(-)
  create mode 100644 meta/classes/gummiboot.bbclass
 
 diff --git a/meta/classes/gummiboot.bbclass
 b/meta/classes/gummiboot.bbclass
 new file mode 100644
 index 000..5c11286
 --- /dev/null
 +++ b/meta/classes/gummiboot.bbclass
 @@ -0,0 +1,112 @@
 +EFICLASS_FUNC_PREFIX = gummiboot
 +
 +do_bootimg[depends] += gummiboot:do_deploy
 +do_bootdirectdisk[depends] += gummiboot:do_deploy
 +
 +EFIDIR = /EFI/BOOT
 +
 +GUMMIBOOT_CFG ?= ${S}/loader.conf
 +GUMMIBOOT_ENTRIES ?= 
 +GUMMIBOOT_TIMEOUT ?= 10
 +
 +gummiboot_populate() {
 +DEST=$1
 +
 +EFI_IMAGE=gummibootia32.efi
 +DEST_EFI_IMAGE=bootia32.efi
 +if [ ${TARGET_ARCH} = x86_64 ]; then
 +EFI_IMAGE=gummibootx64.efi
 +DEST_EFI_IMAGE=bootx64.efi
 +fi
 +
 +install -d ${DEST}${EFIDIR}
 +# gummiboot requires these paths for configuration files
 +# they are not customizable so no point in new vars
 +install -d ${DEST}/loader
 +install -d ${DEST}/loader/entries
 +install -m 0644 ${DEPLOY_DIR_IMAGE}/${EFI_IMAGE}
 ${DEST}${EFIDIR}/${DEST_EFI_IMAGE}
 +install -m 0644 ${GUMMIBOOT_CFG} ${DEST}/loader/loader.conf
 +for i in ${GUMMIBOOT_ENTRIES}; do
 +install -m 0644 ${i} ${DEST}/loader/entries
 +done
 +}
 +
 +gummiboot_iso_populate() {
 +iso_dir=$1
 +gummiboot_populate $iso_dir
 +mkdir -p ${EFIIMGDIR}/${EFIDIR}
 +cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
 +cp $iso_dir/vmlinuz ${EFIIMGDIR}
 +echo ${DEST_EFI_IMAGE}  ${EFIIMGDIR}/startup.nsh
 +if [ -f $iso_dir/initrd ] ; then
 +cp $iso_dir/initrd ${EFIIMGDIR}
 +fi
 +}
 +
 +gummiboot_hddimg_populate() {
 +gummiboot_populate $1
 +}
 +
 +python build_gummiboot_cfg() {
 +s = d.getVar(S, True)
 +labels = d.getVar('LABELS', True)
 +if not labels:
 +bb.debug(1, LABELS not defined, nothing to do)
 +return
 +
 +if labels == []:
 +bb.debug(1, No labels, nothing to do)
 +return
 +
 +cfile = d.getVar('GUMMIBOOT_CFG', True)
 +try:
 + cfgfile = open(cfile, 'w')
 +except OSError:
 +raise bb.build.funcFailed('Unable to open %s' % (cfile))
 +
 +cfgfile.write('# Automatically created by OE\n')
 +cfgfile.write('default %s\n' % (labels.split()[0]))
 +timeout = d.getVar('GUMMIBOOT_TIMEOUT', True)
 +if timeout:
 +cfgfile.write('timeout %s\n' % timeout)
 +else:
 +cfgfile.write('timeout 10\n')
 +

Re: [OE-core] [PATCH 3/3] classes: Add gummiboot class

2014-03-07 Thread Stanacar, StefanX



On Thu, 2014-03-06 at 14:36 -0800, Darren Hart wrote:
 On 3/6/14, 10:15, Stefan Stanacar stefanx.stana...@intel.com wrote:
 
 Adds a gummiboot class similar to grub-efi class and makes the necessary
 changes so it can be used for live/hddimg images as well.
 
 One can set EFI_PROVIDER = gummiboot in local.conf to use gummiboot
 instead of grub-efi.
 Gummiboot requires some kernel options that are not enabled by default,
 so one has to build
 with KERNEL_FEATURES_append =  cfg/efi-ext.
 
 cfg/efi is insufficient?
 

cfg/efi doesn't have CONFIG_EFI_STUB=y which is required by gummiboot.
cfg/efi-ext adds more than that, it's true.

It's also a good idea to enable CONFIG_EFIVARS_FS, which is the
newer/better interface than CONFIG_EFI_VARS that cfg/efi-ext enables.

 
 The install scripts have been updated too, keeping the old behaviour
 around,
 but accounting for the new boot loader config files (if they exist).
 It can be argued that the installer and bootimg are a bit wierd and not
 necessarily correct,
 but I wanted to have the exact same behviour with gummiboot.
 With the default EFI_PROVIDER = grub-efi nothing changes, everthing
 should be just as before.
 
 I've tested live boot, install and normal boot on:
 - FRI2
 - genericx86-64 on NUC
 with:
   EFI_PROVIDER = gummiboot
   KERNEL_FEATURES_append =  cfg/efi-ext
 in local.conf.
 
 Signed-off-by: Stefan Stanacar stefanx.stana...@intel.com
 
 
 Generally looks good. My only reservation is the same as for 2/3, should
 we define an EFI interface rather than having to construct function names
 in the consumers of this class?

I don't have a strong opinion here, it just seemed the simplest way atm,
then adding another interface.

Cheers,
Stefan

 
 --
 Darren
 
 ---
  meta/classes/gummiboot.bbclass | 112
 +
  .../initrdscripts/files/init-install-efi.sh|  51 +++---
  2 files changed, 147 insertions(+), 16 deletions(-)
  create mode 100644 meta/classes/gummiboot.bbclass
 
 diff --git a/meta/classes/gummiboot.bbclass
 b/meta/classes/gummiboot.bbclass
 new file mode 100644
 index 000..5c11286
 --- /dev/null
 +++ b/meta/classes/gummiboot.bbclass
 @@ -0,0 +1,112 @@
 +EFICLASS_FUNC_PREFIX = gummiboot
 +
 +do_bootimg[depends] += gummiboot:do_deploy
 +do_bootdirectdisk[depends] += gummiboot:do_deploy
 +
 +EFIDIR = /EFI/BOOT
 +
 +GUMMIBOOT_CFG ?= ${S}/loader.conf
 +GUMMIBOOT_ENTRIES ?= 
 +GUMMIBOOT_TIMEOUT ?= 10
 +
 +gummiboot_populate() {
 +DEST=$1
 +
 +EFI_IMAGE=gummibootia32.efi
 +DEST_EFI_IMAGE=bootia32.efi
 +if [ ${TARGET_ARCH} = x86_64 ]; then
 +EFI_IMAGE=gummibootx64.efi
 +DEST_EFI_IMAGE=bootx64.efi
 +fi
 +
 +install -d ${DEST}${EFIDIR}
 +# gummiboot requires these paths for configuration files
 +# they are not customizable so no point in new vars
 +install -d ${DEST}/loader
 +install -d ${DEST}/loader/entries
 +install -m 0644 ${DEPLOY_DIR_IMAGE}/${EFI_IMAGE}
 ${DEST}${EFIDIR}/${DEST_EFI_IMAGE}
 +install -m 0644 ${GUMMIBOOT_CFG} ${DEST}/loader/loader.conf
 +for i in ${GUMMIBOOT_ENTRIES}; do
 +install -m 0644 ${i} ${DEST}/loader/entries
 +done
 +}
 +
 +gummiboot_iso_populate() {
 +iso_dir=$1
 +gummiboot_populate $iso_dir
 +mkdir -p ${EFIIMGDIR}/${EFIDIR}
 +cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
 +cp $iso_dir/vmlinuz ${EFIIMGDIR}
 +echo ${DEST_EFI_IMAGE}  ${EFIIMGDIR}/startup.nsh
 +if [ -f $iso_dir/initrd ] ; then
 +cp $iso_dir/initrd ${EFIIMGDIR}
 +fi
 +}
 +
 +gummiboot_hddimg_populate() {
 +gummiboot_populate $1
 +}
 +
 +python build_gummiboot_cfg() {
 +s = d.getVar(S, True)
 +labels = d.getVar('LABELS', True)
 +if not labels:
 +bb.debug(1, LABELS not defined, nothing to do)
 +return
 +
 +if labels == []:
 +bb.debug(1, No labels, nothing to do)
 +return
 +
 +cfile = d.getVar('GUMMIBOOT_CFG', True)
 +try:
 + cfgfile = open(cfile, 'w')
 +except OSError:
 +raise bb.build.funcFailed('Unable to open %s' % (cfile))
 +
 +cfgfile.write('# Automatically created by OE\n')
 +cfgfile.write('default %s\n' % (labels.split()[0]))
 +timeout = d.getVar('GUMMIBOOT_TIMEOUT', True)
 +if timeout:
 +cfgfile.write('timeout %s\n' % timeout)
 +else:
 +cfgfile.write('timeout 10\n')
 +cfgfile.close()
 +
 +for label in labels.split():
 +localdata = d.createCopy()
 +
 +overrides = localdata.getVar('OVERRIDES', True)
 +if not overrides:
 +raise bb.build.FuncFailed('OVERRIDES not defined')
 +
 +entryfile = %s/%s.conf % (s, label)
 +d.appendVar(GUMMIBOOT_ENTRIES,   + entryfile)
 +try:
 +entrycfg = open(entryfile, w)
 +except OSError:
 +raise bb.build.funcFailed('Unable to open %s' % 

[OE-core] [PATCH 3/3] classes: Add gummiboot class

2014-03-06 Thread Stefan Stanacar
Adds a gummiboot class similar to grub-efi class and makes the necessary
changes so it can be used for live/hddimg images as well.

One can set EFI_PROVIDER = gummiboot in local.conf to use gummiboot instead 
of grub-efi.
Gummiboot requires some kernel options that are not enabled by default, so one 
has to build
with KERNEL_FEATURES_append =  cfg/efi-ext.

The install scripts have been updated too, keeping the old behaviour around,
but accounting for the new boot loader config files (if they exist).
It can be argued that the installer and bootimg are a bit wierd and not 
necessarily correct,
but I wanted to have the exact same behviour with gummiboot.
With the default EFI_PROVIDER = grub-efi nothing changes, everthing should be 
just as before.

I've tested live boot, install and normal boot on:
- FRI2
- genericx86-64 on NUC
with:
  EFI_PROVIDER = gummiboot
  KERNEL_FEATURES_append =  cfg/efi-ext
in local.conf.

Signed-off-by: Stefan Stanacar stefanx.stana...@intel.com
---
 meta/classes/gummiboot.bbclass | 112 +
 .../initrdscripts/files/init-install-efi.sh|  51 +++---
 2 files changed, 147 insertions(+), 16 deletions(-)
 create mode 100644 meta/classes/gummiboot.bbclass

diff --git a/meta/classes/gummiboot.bbclass b/meta/classes/gummiboot.bbclass
new file mode 100644
index 000..5c11286
--- /dev/null
+++ b/meta/classes/gummiboot.bbclass
@@ -0,0 +1,112 @@
+EFICLASS_FUNC_PREFIX = gummiboot
+
+do_bootimg[depends] += gummiboot:do_deploy
+do_bootdirectdisk[depends] += gummiboot:do_deploy
+
+EFIDIR = /EFI/BOOT
+
+GUMMIBOOT_CFG ?= ${S}/loader.conf
+GUMMIBOOT_ENTRIES ?= 
+GUMMIBOOT_TIMEOUT ?= 10
+
+gummiboot_populate() {
+DEST=$1
+
+EFI_IMAGE=gummibootia32.efi
+DEST_EFI_IMAGE=bootia32.efi
+if [ ${TARGET_ARCH} = x86_64 ]; then
+EFI_IMAGE=gummibootx64.efi
+DEST_EFI_IMAGE=bootx64.efi
+fi
+
+install -d ${DEST}${EFIDIR}
+# gummiboot requires these paths for configuration files
+# they are not customizable so no point in new vars
+install -d ${DEST}/loader
+install -d ${DEST}/loader/entries
+install -m 0644 ${DEPLOY_DIR_IMAGE}/${EFI_IMAGE} 
${DEST}${EFIDIR}/${DEST_EFI_IMAGE}
+install -m 0644 ${GUMMIBOOT_CFG} ${DEST}/loader/loader.conf
+for i in ${GUMMIBOOT_ENTRIES}; do
+install -m 0644 ${i} ${DEST}/loader/entries
+done
+}
+
+gummiboot_iso_populate() {
+iso_dir=$1
+gummiboot_populate $iso_dir
+mkdir -p ${EFIIMGDIR}/${EFIDIR}
+cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
+cp $iso_dir/vmlinuz ${EFIIMGDIR}
+echo ${DEST_EFI_IMAGE}  ${EFIIMGDIR}/startup.nsh
+if [ -f $iso_dir/initrd ] ; then
+cp $iso_dir/initrd ${EFIIMGDIR}
+fi
+}
+
+gummiboot_hddimg_populate() {
+gummiboot_populate $1
+}
+
+python build_gummiboot_cfg() {
+s = d.getVar(S, True)
+labels = d.getVar('LABELS', True)
+if not labels:
+bb.debug(1, LABELS not defined, nothing to do)
+return
+
+if labels == []:
+bb.debug(1, No labels, nothing to do)
+return
+
+cfile = d.getVar('GUMMIBOOT_CFG', True)
+try:
+ cfgfile = open(cfile, 'w')
+except OSError:
+raise bb.build.funcFailed('Unable to open %s' % (cfile))
+
+cfgfile.write('# Automatically created by OE\n')
+cfgfile.write('default %s\n' % (labels.split()[0]))
+timeout = d.getVar('GUMMIBOOT_TIMEOUT', True)
+if timeout:
+cfgfile.write('timeout %s\n' % timeout)
+else:
+cfgfile.write('timeout 10\n')
+cfgfile.close()
+
+for label in labels.split():
+localdata = d.createCopy()
+
+overrides = localdata.getVar('OVERRIDES', True)
+if not overrides:
+raise bb.build.FuncFailed('OVERRIDES not defined')
+
+entryfile = %s/%s.conf % (s, label)
+d.appendVar(GUMMIBOOT_ENTRIES,   + entryfile)
+try:
+entrycfg = open(entryfile, w)
+except OSError:
+raise bb.build.funcFailed('Unable to open %s' % (entryfile))
+localdata.setVar('OVERRIDES', label + ':' + overrides)
+bb.data.update_data(localdata)
+
+entrycfg.write('title %s\n' % label)
+entrycfg.write('linux /vmlinuz\n')
+
+append = localdata.getVar('APPEND', True)
+initrd = localdata.getVar('INITRD', True)
+
+if initrd:
+entrycfg.write('initrd /initrd\n')
+lb = label
+if label == install:
+lb = install-efi
+entrycfg.write('options LABEL=%s ' % lb)
+if append:
+entrycfg.write('%s' % append)
+entrycfg.write('\n')
+entrycfg.close()
+}
+
+python build_efi_cfg() {
+bb.build.exec_func(build_gummiboot_cfg, d)
+}
diff --git a/meta/recipes-core/initrdscripts/files/init-install-efi.sh 
b/meta/recipes-core/initrdscripts/files/init-install-efi.sh
index 

Re: [OE-core] [PATCH 3/3] classes: Add gummiboot class

2014-03-06 Thread Darren Hart
On 3/6/14, 10:15, Stefan Stanacar stefanx.stana...@intel.com wrote:

Adds a gummiboot class similar to grub-efi class and makes the necessary
changes so it can be used for live/hddimg images as well.

One can set EFI_PROVIDER = gummiboot in local.conf to use gummiboot
instead of grub-efi.
Gummiboot requires some kernel options that are not enabled by default,
so one has to build
with KERNEL_FEATURES_append =  cfg/efi-ext.

cfg/efi is insufficient?


The install scripts have been updated too, keeping the old behaviour
around,
but accounting for the new boot loader config files (if they exist).
It can be argued that the installer and bootimg are a bit wierd and not
necessarily correct,
but I wanted to have the exact same behviour with gummiboot.
With the default EFI_PROVIDER = grub-efi nothing changes, everthing
should be just as before.

I've tested live boot, install and normal boot on:
- FRI2
- genericx86-64 on NUC
with:
  EFI_PROVIDER = gummiboot
  KERNEL_FEATURES_append =  cfg/efi-ext
in local.conf.

Signed-off-by: Stefan Stanacar stefanx.stana...@intel.com


Generally looks good. My only reservation is the same as for 2/3, should
we define an EFI interface rather than having to construct function names
in the consumers of this class?

--
Darren

---
 meta/classes/gummiboot.bbclass | 112
+
 .../initrdscripts/files/init-install-efi.sh|  51 +++---
 2 files changed, 147 insertions(+), 16 deletions(-)
 create mode 100644 meta/classes/gummiboot.bbclass

diff --git a/meta/classes/gummiboot.bbclass
b/meta/classes/gummiboot.bbclass
new file mode 100644
index 000..5c11286
--- /dev/null
+++ b/meta/classes/gummiboot.bbclass
@@ -0,0 +1,112 @@
+EFICLASS_FUNC_PREFIX = gummiboot
+
+do_bootimg[depends] += gummiboot:do_deploy
+do_bootdirectdisk[depends] += gummiboot:do_deploy
+
+EFIDIR = /EFI/BOOT
+
+GUMMIBOOT_CFG ?= ${S}/loader.conf
+GUMMIBOOT_ENTRIES ?= 
+GUMMIBOOT_TIMEOUT ?= 10
+
+gummiboot_populate() {
+DEST=$1
+
+EFI_IMAGE=gummibootia32.efi
+DEST_EFI_IMAGE=bootia32.efi
+if [ ${TARGET_ARCH} = x86_64 ]; then
+EFI_IMAGE=gummibootx64.efi
+DEST_EFI_IMAGE=bootx64.efi
+fi
+
+install -d ${DEST}${EFIDIR}
+# gummiboot requires these paths for configuration files
+# they are not customizable so no point in new vars
+install -d ${DEST}/loader
+install -d ${DEST}/loader/entries
+install -m 0644 ${DEPLOY_DIR_IMAGE}/${EFI_IMAGE}
${DEST}${EFIDIR}/${DEST_EFI_IMAGE}
+install -m 0644 ${GUMMIBOOT_CFG} ${DEST}/loader/loader.conf
+for i in ${GUMMIBOOT_ENTRIES}; do
+install -m 0644 ${i} ${DEST}/loader/entries
+done
+}
+
+gummiboot_iso_populate() {
+iso_dir=$1
+gummiboot_populate $iso_dir
+mkdir -p ${EFIIMGDIR}/${EFIDIR}
+cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
+cp $iso_dir/vmlinuz ${EFIIMGDIR}
+echo ${DEST_EFI_IMAGE}  ${EFIIMGDIR}/startup.nsh
+if [ -f $iso_dir/initrd ] ; then
+cp $iso_dir/initrd ${EFIIMGDIR}
+fi
+}
+
+gummiboot_hddimg_populate() {
+gummiboot_populate $1
+}
+
+python build_gummiboot_cfg() {
+s = d.getVar(S, True)
+labels = d.getVar('LABELS', True)
+if not labels:
+bb.debug(1, LABELS not defined, nothing to do)
+return
+
+if labels == []:
+bb.debug(1, No labels, nothing to do)
+return
+
+cfile = d.getVar('GUMMIBOOT_CFG', True)
+try:
+ cfgfile = open(cfile, 'w')
+except OSError:
+raise bb.build.funcFailed('Unable to open %s' % (cfile))
+
+cfgfile.write('# Automatically created by OE\n')
+cfgfile.write('default %s\n' % (labels.split()[0]))
+timeout = d.getVar('GUMMIBOOT_TIMEOUT', True)
+if timeout:
+cfgfile.write('timeout %s\n' % timeout)
+else:
+cfgfile.write('timeout 10\n')
+cfgfile.close()
+
+for label in labels.split():
+localdata = d.createCopy()
+
+overrides = localdata.getVar('OVERRIDES', True)
+if not overrides:
+raise bb.build.FuncFailed('OVERRIDES not defined')
+
+entryfile = %s/%s.conf % (s, label)
+d.appendVar(GUMMIBOOT_ENTRIES,   + entryfile)
+try:
+entrycfg = open(entryfile, w)
+except OSError:
+raise bb.build.funcFailed('Unable to open %s' % (entryfile))
+localdata.setVar('OVERRIDES', label + ':' + overrides)
+bb.data.update_data(localdata)
+
+entrycfg.write('title %s\n' % label)
+entrycfg.write('linux /vmlinuz\n')
+
+append = localdata.getVar('APPEND', True)
+initrd = localdata.getVar('INITRD', True)
+
+if initrd:
+entrycfg.write('initrd /initrd\n')
+lb = label
+if label == install:
+lb = install-efi
+entrycfg.write('options LABEL=%s ' % lb)
+if append:
+entrycfg.write('%s' %