diff mbox series

[2/2] kernel-fit-image: introduce FIT_OS variable to override 'os' field

Message ID 30d89efad3d693785555868ea8c7f1c7b7b5cf46.1783422721.git.nora.schiffer@ew.tq-group.com
State Changes Requested
Headers show
Series kernel-fit-image: optional addresses for kernel_noload, OS override | expand

Commit Message

Nora Schiffer July 7, 2026, 11:29 a.m. UTC
U-Boot can load an EFI application from a FIT image; this requires
setting the OS to "efi" (usually in combination with type
"kernel_noload"). Doing so is a convenient approach for giving the OS
access to EFI services while preserving other benefits of FIT image boot.

Signed-off-by: Nora Schiffer <nora.schiffer@ew.tq-group.com>
---
 meta/classes-recipe/kernel-fit-image.bbclass |  3 ++-
 meta/conf/image-fitimage.conf                |  4 ++++
 meta/lib/oe/fitimage.py                      | 11 ++++++-----
 meta/lib/oeqa/selftest/cases/fitimage.py     | 13 +++++++++++--
 4 files changed, 23 insertions(+), 8 deletions(-)

Comments

Adrian Freihofer July 19, 2026, 7:37 p.m. UTC | #1
On Tue, 2026-07-07 at 13:29 +0200, Nora Schiffer via
lists.openembedded.org wrote:
> U-Boot can load an EFI application from a FIT image; this requires
> setting the OS to "efi" (usually in combination with type
> "kernel_noload"). Doing so is a convenient approach for giving the OS
> access to EFI services while preserving other benefits of FIT image
> boot.
> 
> Signed-off-by: Nora Schiffer <nora.schiffer@ew.tq-group.com>
> ---
>  meta/classes-recipe/kernel-fit-image.bbclass |  3 ++-
>  meta/conf/image-fitimage.conf                |  4 ++++
>  meta/lib/oe/fitimage.py                      | 11 ++++++-----
>  meta/lib/oeqa/selftest/cases/fitimage.py     | 13 +++++++++++--
>  4 files changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/meta/classes-recipe/kernel-fit-image.bbclass
> b/meta/classes-recipe/kernel-fit-image.bbclass
> index 448a88ccb1..899516e372 100644
> --- a/meta/classes-recipe/kernel-fit-image.bbclass
> +++ b/meta/classes-recipe/kernel-fit-image.bbclass
> @@ -69,7 +69,8 @@ python do_compile() {
>      # Collect all the its nodes before the its file is generated and
> mkimage gets executed
>      root_node = oe.fitimage.ItsNodeRootKernel(
>          d.getVar("FIT_DESC"), d.getVar("FIT_ADDRESS_CELLS"),
> -        d.getVar('HOST_PREFIX'), d.getVar('UBOOT_ARCH'), 
> d.getVar("FIT_CONF_PREFIX"),
> +        d.getVar('HOST_PREFIX'), d.getVar('UBOOT_ARCH'),
> d.getVar('FIT_OS'),
> +        d.getVar("FIT_CONF_PREFIX"),
>          oe.types.boolean(d.getVar('FIT_KERNEL_SIGN_ENABLE')),
> d.getVar("FIT_KERNEL_SIGN_KEYDIR"),
>          d.getVar("UBOOT_MKIMAGE"),
> d.getVar("UBOOT_MKIMAGE_DTCOPTS"),
>          d.getVar('FIT_MKIMAGE_EXTRA_OPTS'),
> diff --git a/meta/conf/image-fitimage.conf b/meta/conf/image-
> fitimage.conf
> index 2fdb816d55..a06d30e494 100644
> --- a/meta/conf/image-fitimage.conf
> +++ b/meta/conf/image-fitimage.conf
> @@ -37,6 +37,10 @@ FIT_CONF_PREFIX[doc] = "Prefix to use for FIT
> configuration node name"
>  
>  FIT_SUPPORTED_INITRAMFS_FSTYPES ?= "cpio.lz4 cpio.lzo cpio.lzma
> cpio.xz cpio.zst cpio.gz ext2.gz cpio"
>  
> +# os field of the kernel and various other images in the FIT image.
> Set to "efi"
> +# to load a kernel with EFI stub as an EFI application.
> +FIT_OS ?= "linux"
> +
>  # Allow user to support special use cases where the kernel binary is
>  # not included in the FIT image itself.
>  # This is particularly useful for UKI-based setups, where the kernel
> diff --git a/meta/lib/oe/fitimage.py b/meta/lib/oe/fitimage.py
> index 81d18f6c91..86a0e44e12 100644
> --- a/meta/lib/oe/fitimage.py
> +++ b/meta/lib/oe/fitimage.py
> @@ -153,7 +153,7 @@ class ItsNodeRootKernel(ItsNode):
>      If a device tree included in the FIT image, the default
> configuration is the
>      firt DTB. If there is no dtb present than the default
> configuation the kernel.
>      """
> -    def __init__(self, description, address_cells, host_prefix,
> arch, conf_prefix,
> +    def __init__(self, description, address_cells, host_prefix,
> arch, os, conf_prefix,

Should we use "os" as a variable name? What happens if

import os

os = "efi" ?

os.path.join(...)

To be on the save side, I would suggest to use fit_os, for example.

Thank you for the patch. I think this needs a v2 because of this
detail. But otherwise it looks good to me.

Sorry for the late response,
Adrian


>                   sign_enable=False, sign_keydir=None,
>                   mkimage=None, mkimage_dtcopts=None,
>                   mkimage_extra_opts=None,
> @@ -171,6 +171,7 @@ class ItsNodeRootKernel(ItsNode):
>  
>          self._host_prefix = host_prefix
>          self._arch = arch
> +        self._os = os
>          self._conf_prefix = conf_prefix
>  
>          # Signature related properties
> @@ -279,7 +280,7 @@ class ItsNodeRootKernel(ItsNode):
>          opt_props = {
>              "data": '/incbin/("' + kernel_path + '")',
>              "arch": self._arch,
> -            "os": "linux",
> +            "os": self._os,
>          }
>          if load:
>              opt_props["load"] = f"<{load}>"
> @@ -370,7 +371,7 @@ class ItsNodeRootKernel(ItsNode):
>              {
>                  "data": '/incbin/("' + setup_path + '")',
>                  "arch": self._arch,
> -                "os": "linux",
> +                "os": self._os,
>                  "load": load,
>                  "entry": entry
>              }
> @@ -385,7 +386,7 @@ class ItsNodeRootKernel(ItsNode):
>              "data": '/incbin/("' + ramdisk_path + '")',
>              "type": "ramdisk",
>              "arch": self._arch,
> -            "os": "linux"
> +            "os": self._os,
>          }
>          if load:
>              opt_props["load"] = f"<{load}>"
> @@ -406,7 +407,7 @@ class ItsNodeRootKernel(ItsNode):
>          opt_props = {
>              "data": '/incbin/("' + filepath + '")',
>              "arch": arch if arch is not None else self._arch,
> -            "os": os if os is not None else "linux",
> +            "os": os if os is not None else self._os,
>          }
>  
>          if load:
> diff --git a/meta/lib/oeqa/selftest/cases/fitimage.py
> b/meta/lib/oeqa/selftest/cases/fitimage.py
> index c5f2975223..d28b5b8965 100644
> --- a/meta/lib/oeqa/selftest/cases/fitimage.py
> +++ b/meta/lib/oeqa/selftest/cases/fitimage.py
> @@ -670,6 +670,7 @@ class KernelFitImageBase(FitImageTestCase):
>              'FIT_LOADABLES',
>              'FIT_LOADABLE_ENTRYPOINT',
>              'FIT_LOADABLE_LOADADDRESS',
> +            'FIT_OS',
>              'FIT_SIGN_ALG',
>              'FIT_SIGN_INDIVIDUAL',
>              'FIT_UBOOT_ENV',
> @@ -904,7 +905,7 @@ class KernelFitImageBase(FitImageTestCase):
>              # 'compression = "' +
> str(bb_vars['FIT_KERNEL_COMP_ALG']) + '";', defined based on files in
> TMPDIR, not ideal...
>              'data = /incbin/("linux.bin");',
>              'arch = "' + str(bb_vars['UBOOT_ARCH']) + '";',
> -            'os = "linux";',
> +            'os = "%s";' % bb_vars['FIT_OS'],
>              'load = <' + str(bb_vars['UBOOT_LOADADDRESS']) + '>;',
>              'entry = <' + str(bb_vars['UBOOT_ENTRYPOINT']) + '>;',
>          ]
> @@ -1463,6 +1464,7 @@ class FitImagePyTests(KernelFitImageBase):
>              'FIT_KEY_SIGN_PKCS': "-x509",
>              'FIT_LOADABLES': "",
>              'FIT_LINUX_BIN': "linux.bin",
> +            'FIT_OS': "linux",
>              'FIT_PAD_ALG': "pkcs-1.5",
>              'FIT_SIGN_ALG': "rsa2048",
>              'FIT_SIGN_INDIVIDUAL': "0",
> @@ -1503,7 +1505,8 @@ class FitImagePyTests(KernelFitImageBase):
>  
>          root_node = oe.fitimage.ItsNodeRootKernel(
>              bb_vars["FIT_DESC"], bb_vars["FIT_ADDRESS_CELLS"],
> -            bb_vars['HOST_PREFIX'], bb_vars['UBOOT_ARCH'], 
> bb_vars["FIT_CONF_PREFIX"],
> +            bb_vars['HOST_PREFIX'], bb_vars['UBOOT_ARCH'],
> bb_vars['FIT_OS'],
> +            bb_vars["FIT_CONF_PREFIX"],
>              oe.types.boolean(bb_vars['UBOOT_SIGN_ENABLE']),
> bb_vars["UBOOT_SIGN_KEYDIR"],
>              bb_vars["UBOOT_MKIMAGE"],
> bb_vars["UBOOT_MKIMAGE_DTCOPTS"],
>              bb_vars["UBOOT_MKIMAGE_SIGN"],
> bb_vars["UBOOT_MKIMAGE_SIGN_ARGS"],
> @@ -1609,6 +1612,12 @@ class FitImagePyTests(KernelFitImageBase):
>          }
>          self._test_fitimage_py(bb_vars_overrides)
>  
> +    def test_fitimage_py_conf_os(self):
> +        """Test FIT_OS functionality"""
> +        bb_vars_overrides = {
> +            'FIT_OS': "efi",
> +        }
> +        self._test_fitimage_py(bb_vars_overrides)
>  
>  class UBootFitImageTests(FitImageTestCase):
>      """Test cases for the uboot-sign bbclass"""
> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#240383):
> https://lists.openembedded.org/g/openembedded-core/message/240383
> Mute This Topic: https://lists.openembedded.org/mt/120154469/4454582
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe:
> https://lists.openembedded.org/g/openembedded-core/unsub [
> adrian.freihofer@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
Nora Schiffer July 20, 2026, 12:15 p.m. UTC | #2
On Sun, 2026-07-19 at 21:37 +0200, adrian.freihofer@gmail.com wrote:
> On Tue, 2026-07-07 at 13:29 +0200, Nora Schiffer via
> lists.openembedded.org wrote:
> > U-Boot can load an EFI application from a FIT image; this requires
> > setting the OS to "efi" (usually in combination with type
> > "kernel_noload"). Doing so is a convenient approach for giving the OS
> > access to EFI services while preserving other benefits of FIT image
> > boot.
> > 
> > Signed-off-by: Nora Schiffer <nora.schiffer@ew.tq-group.com>
> > ---
> >  meta/classes-recipe/kernel-fit-image.bbclass |  3 ++-
> >  meta/conf/image-fitimage.conf                |  4 ++++
> >  meta/lib/oe/fitimage.py                      | 11 ++++++-----
> >  meta/lib/oeqa/selftest/cases/fitimage.py     | 13 +++++++++++--
> >  4 files changed, 23 insertions(+), 8 deletions(-)
> > 
> > diff --git a/meta/classes-recipe/kernel-fit-image.bbclass
> > b/meta/classes-recipe/kernel-fit-image.bbclass
> > index 448a88ccb1..899516e372 100644
> > --- a/meta/classes-recipe/kernel-fit-image.bbclass
> > +++ b/meta/classes-recipe/kernel-fit-image.bbclass
> > @@ -69,7 +69,8 @@ python do_compile() {
> >      # Collect all the its nodes before the its file is generated and
> > mkimage gets executed
> >      root_node = oe.fitimage.ItsNodeRootKernel(
> >          d.getVar("FIT_DESC"), d.getVar("FIT_ADDRESS_CELLS"),
> > -        d.getVar('HOST_PREFIX'), d.getVar('UBOOT_ARCH'), 
> > d.getVar("FIT_CONF_PREFIX"),
> > +        d.getVar('HOST_PREFIX'), d.getVar('UBOOT_ARCH'),
> > d.getVar('FIT_OS'),
> > +        d.getVar("FIT_CONF_PREFIX"),
> >          oe.types.boolean(d.getVar('FIT_KERNEL_SIGN_ENABLE')),
> > d.getVar("FIT_KERNEL_SIGN_KEYDIR"),
> >          d.getVar("UBOOT_MKIMAGE"),
> > d.getVar("UBOOT_MKIMAGE_DTCOPTS"),
> >          d.getVar('FIT_MKIMAGE_EXTRA_OPTS'),
> > diff --git a/meta/conf/image-fitimage.conf b/meta/conf/image-
> > fitimage.conf
> > index 2fdb816d55..a06d30e494 100644
> > --- a/meta/conf/image-fitimage.conf
> > +++ b/meta/conf/image-fitimage.conf
> > @@ -37,6 +37,10 @@ FIT_CONF_PREFIX[doc] = "Prefix to use for FIT
> > configuration node name"
> >  
> >  FIT_SUPPORTED_INITRAMFS_FSTYPES ?= "cpio.lz4 cpio.lzo cpio.lzma
> > cpio.xz cpio.zst cpio.gz ext2.gz cpio"
> >  
> > +# os field of the kernel and various other images in the FIT image.
> > Set to "efi"
> > +# to load a kernel with EFI stub as an EFI application.
> > +FIT_OS ?= "linux"
> > +
> >  # Allow user to support special use cases where the kernel binary is
> >  # not included in the FIT image itself.
> >  # This is particularly useful for UKI-based setups, where the kernel
> > diff --git a/meta/lib/oe/fitimage.py b/meta/lib/oe/fitimage.py
> > index 81d18f6c91..86a0e44e12 100644
> > --- a/meta/lib/oe/fitimage.py
> > +++ b/meta/lib/oe/fitimage.py
> > @@ -153,7 +153,7 @@ class ItsNodeRootKernel(ItsNode):
> >      If a device tree included in the FIT image, the default
> > configuration is the
> >      firt DTB. If there is no dtb present than the default
> > configuation the kernel.
> >      """
> > -    def __init__(self, description, address_cells, host_prefix,
> > arch, conf_prefix,
> > +    def __init__(self, description, address_cells, host_prefix,
> > arch, os, conf_prefix,
> 
> Should we use "os" as a variable name? What happens if
> 
> import os
> 
> os = "efi" ?
> 
> os.path.join(...)
> 
> To be on the save side, I would suggest to use fit_os, for example.
> 
> Thank you for the patch. I think this needs a v2 because of this
> detail. But otherwise it looks good to me.
> 
> Sorry for the late response,
> Adrian

Hi Adrian,

thanks for the review. Changing the identifier to fit_os makes sense to me, will
update in v2 or a follow-up patch (depending on whether the v1 currently in
master-next makes it to master or not).

Best,
Nora


> 
> 
> >                   sign_enable=False, sign_keydir=None,
> >                   mkimage=None, mkimage_dtcopts=None,
> >                   mkimage_extra_opts=None,
> > @@ -171,6 +171,7 @@ class ItsNodeRootKernel(ItsNode):
> >  
> >          self._host_prefix = host_prefix
> >          self._arch = arch
> > +        self._os = os
> >          self._conf_prefix = conf_prefix
> >  
> >          # Signature related properties
> > @@ -279,7 +280,7 @@ class ItsNodeRootKernel(ItsNode):
> >          opt_props = {
> >              "data": '/incbin/("' + kernel_path + '")',
> >              "arch": self._arch,
> > -            "os": "linux",
> > +            "os": self._os,
> >          }
> >          if load:
> >              opt_props["load"] = f"<{load}>"
> > @@ -370,7 +371,7 @@ class ItsNodeRootKernel(ItsNode):
> >              {
> >                  "data": '/incbin/("' + setup_path + '")',
> >                  "arch": self._arch,
> > -                "os": "linux",
> > +                "os": self._os,
> >                  "load": load,
> >                  "entry": entry
> >              }
> > @@ -385,7 +386,7 @@ class ItsNodeRootKernel(ItsNode):
> >              "data": '/incbin/("' + ramdisk_path + '")',
> >              "type": "ramdisk",
> >              "arch": self._arch,
> > -            "os": "linux"
> > +            "os": self._os,
> >          }
> >          if load:
> >              opt_props["load"] = f"<{load}>"
> > @@ -406,7 +407,7 @@ class ItsNodeRootKernel(ItsNode):
> >          opt_props = {
> >              "data": '/incbin/("' + filepath + '")',
> >              "arch": arch if arch is not None else self._arch,
> > -            "os": os if os is not None else "linux",
> > +            "os": os if os is not None else self._os,
> >          }
> >  
> >          if load:
> > diff --git a/meta/lib/oeqa/selftest/cases/fitimage.py
> > b/meta/lib/oeqa/selftest/cases/fitimage.py
> > index c5f2975223..d28b5b8965 100644
> > --- a/meta/lib/oeqa/selftest/cases/fitimage.py
> > +++ b/meta/lib/oeqa/selftest/cases/fitimage.py
> > @@ -670,6 +670,7 @@ class KernelFitImageBase(FitImageTestCase):
> >              'FIT_LOADABLES',
> >              'FIT_LOADABLE_ENTRYPOINT',
> >              'FIT_LOADABLE_LOADADDRESS',
> > +            'FIT_OS',
> >              'FIT_SIGN_ALG',
> >              'FIT_SIGN_INDIVIDUAL',
> >              'FIT_UBOOT_ENV',
> > @@ -904,7 +905,7 @@ class KernelFitImageBase(FitImageTestCase):
> >              # 'compression = "' +
> > str(bb_vars['FIT_KERNEL_COMP_ALG']) + '";', defined based on files in
> > TMPDIR, not ideal...
> >              'data = /incbin/("linux.bin");',
> >              'arch = "' + str(bb_vars['UBOOT_ARCH']) + '";',
> > -            'os = "linux";',
> > +            'os = "%s";' % bb_vars['FIT_OS'],
> >              'load = <' + str(bb_vars['UBOOT_LOADADDRESS']) + '>;',
> >              'entry = <' + str(bb_vars['UBOOT_ENTRYPOINT']) + '>;',
> >          ]
> > @@ -1463,6 +1464,7 @@ class FitImagePyTests(KernelFitImageBase):
> >              'FIT_KEY_SIGN_PKCS': "-x509",
> >              'FIT_LOADABLES': "",
> >              'FIT_LINUX_BIN': "linux.bin",
> > +            'FIT_OS': "linux",
> >              'FIT_PAD_ALG': "pkcs-1.5",
> >              'FIT_SIGN_ALG': "rsa2048",
> >              'FIT_SIGN_INDIVIDUAL': "0",
> > @@ -1503,7 +1505,8 @@ class FitImagePyTests(KernelFitImageBase):
> >  
> >          root_node = oe.fitimage.ItsNodeRootKernel(
> >              bb_vars["FIT_DESC"], bb_vars["FIT_ADDRESS_CELLS"],
> > -            bb_vars['HOST_PREFIX'], bb_vars['UBOOT_ARCH'], 
> > bb_vars["FIT_CONF_PREFIX"],
> > +            bb_vars['HOST_PREFIX'], bb_vars['UBOOT_ARCH'],
> > bb_vars['FIT_OS'],
> > +            bb_vars["FIT_CONF_PREFIX"],
> >              oe.types.boolean(bb_vars['UBOOT_SIGN_ENABLE']),
> > bb_vars["UBOOT_SIGN_KEYDIR"],
> >              bb_vars["UBOOT_MKIMAGE"],
> > bb_vars["UBOOT_MKIMAGE_DTCOPTS"],
> >              bb_vars["UBOOT_MKIMAGE_SIGN"],
> > bb_vars["UBOOT_MKIMAGE_SIGN_ARGS"],
> > @@ -1609,6 +1612,12 @@ class FitImagePyTests(KernelFitImageBase):
> >          }
> >          self._test_fitimage_py(bb_vars_overrides)
> >  
> > +    def test_fitimage_py_conf_os(self):
> > +        """Test FIT_OS functionality"""
> > +        bb_vars_overrides = {
> > +            'FIT_OS': "efi",
> > +        }
> > +        self._test_fitimage_py(bb_vars_overrides)
> >  
> >  class UBootFitImageTests(FitImageTestCase):
> >      """Test cases for the uboot-sign bbclass"""
> > 
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#240383):
> > https://lists.openembedded.org/g/openembedded-core/message/240383
> > Mute This Topic: https://lists.openembedded.org/mt/120154469/4454582
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe:
> > https://lists.openembedded.org/g/openembedded-core/unsub [
> > adrian.freihofer@gmail.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
Nora Schiffer July 20, 2026, 12:20 p.m. UTC | #3
On Mon, 2026-07-20 at 14:15 +0200, Nora Schiffer wrote:
> On Sun, 2026-07-19 at 21:37 +0200, adrian.freihofer@gmail.com wrote:
> > On Tue, 2026-07-07 at 13:29 +0200, Nora Schiffer via
> > lists.openembedded.org wrote:
> > > U-Boot can load an EFI application from a FIT image; this requires
> > > setting the OS to "efi" (usually in combination with type
> > > "kernel_noload"). Doing so is a convenient approach for giving the OS
> > > access to EFI services while preserving other benefits of FIT image
> > > boot.
> > > 
> > > Signed-off-by: Nora Schiffer <nora.schiffer@ew.tq-group.com>
> > > ---
> > >  meta/classes-recipe/kernel-fit-image.bbclass |  3 ++-
> > >  meta/conf/image-fitimage.conf                |  4 ++++
> > >  meta/lib/oe/fitimage.py                      | 11 ++++++-----
> > >  meta/lib/oeqa/selftest/cases/fitimage.py     | 13 +++++++++++--
> > >  4 files changed, 23 insertions(+), 8 deletions(-)
> > > 
> > > diff --git a/meta/classes-recipe/kernel-fit-image.bbclass
> > > b/meta/classes-recipe/kernel-fit-image.bbclass
> > > index 448a88ccb1..899516e372 100644
> > > --- a/meta/classes-recipe/kernel-fit-image.bbclass
> > > +++ b/meta/classes-recipe/kernel-fit-image.bbclass
> > > @@ -69,7 +69,8 @@ python do_compile() {
> > >      # Collect all the its nodes before the its file is generated and
> > > mkimage gets executed
> > >      root_node = oe.fitimage.ItsNodeRootKernel(
> > >          d.getVar("FIT_DESC"), d.getVar("FIT_ADDRESS_CELLS"),
> > > -        d.getVar('HOST_PREFIX'), d.getVar('UBOOT_ARCH'), 
> > > d.getVar("FIT_CONF_PREFIX"),
> > > +        d.getVar('HOST_PREFIX'), d.getVar('UBOOT_ARCH'),
> > > d.getVar('FIT_OS'),
> > > +        d.getVar("FIT_CONF_PREFIX"),
> > >          oe.types.boolean(d.getVar('FIT_KERNEL_SIGN_ENABLE')),
> > > d.getVar("FIT_KERNEL_SIGN_KEYDIR"),
> > >          d.getVar("UBOOT_MKIMAGE"),
> > > d.getVar("UBOOT_MKIMAGE_DTCOPTS"),
> > >          d.getVar('FIT_MKIMAGE_EXTRA_OPTS'),
> > > diff --git a/meta/conf/image-fitimage.conf b/meta/conf/image-
> > > fitimage.conf
> > > index 2fdb816d55..a06d30e494 100644
> > > --- a/meta/conf/image-fitimage.conf
> > > +++ b/meta/conf/image-fitimage.conf
> > > @@ -37,6 +37,10 @@ FIT_CONF_PREFIX[doc] = "Prefix to use for FIT
> > > configuration node name"
> > >  
> > >  FIT_SUPPORTED_INITRAMFS_FSTYPES ?= "cpio.lz4 cpio.lzo cpio.lzma
> > > cpio.xz cpio.zst cpio.gz ext2.gz cpio"
> > >  
> > > +# os field of the kernel and various other images in the FIT image.
> > > Set to "efi"
> > > +# to load a kernel with EFI stub as an EFI application.
> > > +FIT_OS ?= "linux"
> > > +
> > >  # Allow user to support special use cases where the kernel binary is
> > >  # not included in the FIT image itself.
> > >  # This is particularly useful for UKI-based setups, where the kernel
> > > diff --git a/meta/lib/oe/fitimage.py b/meta/lib/oe/fitimage.py
> > > index 81d18f6c91..86a0e44e12 100644
> > > --- a/meta/lib/oe/fitimage.py
> > > +++ b/meta/lib/oe/fitimage.py
> > > @@ -153,7 +153,7 @@ class ItsNodeRootKernel(ItsNode):
> > >      If a device tree included in the FIT image, the default
> > > configuration is the
> > >      firt DTB. If there is no dtb present than the default
> > > configuation the kernel.
> > >      """
> > > -    def __init__(self, description, address_cells, host_prefix,
> > > arch, conf_prefix,
> > > +    def __init__(self, description, address_cells, host_prefix,
> > > arch, os, conf_prefix,
> > 
> > Should we use "os" as a variable name? What happens if
> > 
> > import os
> > 
> > os = "efi" ?
> > 
> > os.path.join(...)
> > 
> > To be on the save side, I would suggest to use fit_os, for example.
> > 
> > Thank you for the patch. I think this needs a v2 because of this
> > detail. But otherwise it looks good to me.
> > 
> > Sorry for the late response,
> > Adrian
> 
> Hi Adrian,
> 
> thanks for the review. Changing the identifier to fit_os makes sense to me, will
> update in v2 or a follow-up patch (depending on whether the v1 currently in
> master-next makes it to master or not).
> 
> Best,
> Nora

Ah, I copied this from fitimage_emit_section_loadable(), which already has an
argument named os. Will fix both in a follow-up.

Best,
Nora


> 
> 
> > 
> > 
> > >                   sign_enable=False, sign_keydir=None,
> > >                   mkimage=None, mkimage_dtcopts=None,
> > >                   mkimage_extra_opts=None,
> > > @@ -171,6 +171,7 @@ class ItsNodeRootKernel(ItsNode):
> > >  
> > >          self._host_prefix = host_prefix
> > >          self._arch = arch
> > > +        self._os = os
> > >          self._conf_prefix = conf_prefix
> > >  
> > >          # Signature related properties
> > > @@ -279,7 +280,7 @@ class ItsNodeRootKernel(ItsNode):
> > >          opt_props = {
> > >              "data": '/incbin/("' + kernel_path + '")',
> > >              "arch": self._arch,
> > > -            "os": "linux",
> > > +            "os": self._os,
> > >          }
> > >          if load:
> > >              opt_props["load"] = f"<{load}>"
> > > @@ -370,7 +371,7 @@ class ItsNodeRootKernel(ItsNode):
> > >              {
> > >                  "data": '/incbin/("' + setup_path + '")',
> > >                  "arch": self._arch,
> > > -                "os": "linux",
> > > +                "os": self._os,
> > >                  "load": load,
> > >                  "entry": entry
> > >              }
> > > @@ -385,7 +386,7 @@ class ItsNodeRootKernel(ItsNode):
> > >              "data": '/incbin/("' + ramdisk_path + '")',
> > >              "type": "ramdisk",
> > >              "arch": self._arch,
> > > -            "os": "linux"
> > > +            "os": self._os,
> > >          }
> > >          if load:
> > >              opt_props["load"] = f"<{load}>"
> > > @@ -406,7 +407,7 @@ class ItsNodeRootKernel(ItsNode):
> > >          opt_props = {
> > >              "data": '/incbin/("' + filepath + '")',
> > >              "arch": arch if arch is not None else self._arch,
> > > -            "os": os if os is not None else "linux",
> > > +            "os": os if os is not None else self._os,
> > >          }
> > >  
> > >          if load:
> > > diff --git a/meta/lib/oeqa/selftest/cases/fitimage.py
> > > b/meta/lib/oeqa/selftest/cases/fitimage.py
> > > index c5f2975223..d28b5b8965 100644
> > > --- a/meta/lib/oeqa/selftest/cases/fitimage.py
> > > +++ b/meta/lib/oeqa/selftest/cases/fitimage.py
> > > @@ -670,6 +670,7 @@ class KernelFitImageBase(FitImageTestCase):
> > >              'FIT_LOADABLES',
> > >              'FIT_LOADABLE_ENTRYPOINT',
> > >              'FIT_LOADABLE_LOADADDRESS',
> > > +            'FIT_OS',
> > >              'FIT_SIGN_ALG',
> > >              'FIT_SIGN_INDIVIDUAL',
> > >              'FIT_UBOOT_ENV',
> > > @@ -904,7 +905,7 @@ class KernelFitImageBase(FitImageTestCase):
> > >              # 'compression = "' +
> > > str(bb_vars['FIT_KERNEL_COMP_ALG']) + '";', defined based on files in
> > > TMPDIR, not ideal...
> > >              'data = /incbin/("linux.bin");',
> > >              'arch = "' + str(bb_vars['UBOOT_ARCH']) + '";',
> > > -            'os = "linux";',
> > > +            'os = "%s";' % bb_vars['FIT_OS'],
> > >              'load = <' + str(bb_vars['UBOOT_LOADADDRESS']) + '>;',
> > >              'entry = <' + str(bb_vars['UBOOT_ENTRYPOINT']) + '>;',
> > >          ]
> > > @@ -1463,6 +1464,7 @@ class FitImagePyTests(KernelFitImageBase):
> > >              'FIT_KEY_SIGN_PKCS': "-x509",
> > >              'FIT_LOADABLES': "",
> > >              'FIT_LINUX_BIN': "linux.bin",
> > > +            'FIT_OS': "linux",
> > >              'FIT_PAD_ALG': "pkcs-1.5",
> > >              'FIT_SIGN_ALG': "rsa2048",
> > >              'FIT_SIGN_INDIVIDUAL': "0",
> > > @@ -1503,7 +1505,8 @@ class FitImagePyTests(KernelFitImageBase):
> > >  
> > >          root_node = oe.fitimage.ItsNodeRootKernel(
> > >              bb_vars["FIT_DESC"], bb_vars["FIT_ADDRESS_CELLS"],
> > > -            bb_vars['HOST_PREFIX'], bb_vars['UBOOT_ARCH'], 
> > > bb_vars["FIT_CONF_PREFIX"],
> > > +            bb_vars['HOST_PREFIX'], bb_vars['UBOOT_ARCH'],
> > > bb_vars['FIT_OS'],
> > > +            bb_vars["FIT_CONF_PREFIX"],
> > >              oe.types.boolean(bb_vars['UBOOT_SIGN_ENABLE']),
> > > bb_vars["UBOOT_SIGN_KEYDIR"],
> > >              bb_vars["UBOOT_MKIMAGE"],
> > > bb_vars["UBOOT_MKIMAGE_DTCOPTS"],
> > >              bb_vars["UBOOT_MKIMAGE_SIGN"],
> > > bb_vars["UBOOT_MKIMAGE_SIGN_ARGS"],
> > > @@ -1609,6 +1612,12 @@ class FitImagePyTests(KernelFitImageBase):
> > >          }
> > >          self._test_fitimage_py(bb_vars_overrides)
> > >  
> > > +    def test_fitimage_py_conf_os(self):
> > > +        """Test FIT_OS functionality"""
> > > +        bb_vars_overrides = {
> > > +            'FIT_OS': "efi",
> > > +        }
> > > +        self._test_fitimage_py(bb_vars_overrides)
> > >  
> > >  class UBootFitImageTests(FitImageTestCase):
> > >      """Test cases for the uboot-sign bbclass"""
> > > 
> > > -=-=-=-=-=-=-=-=-=-=-=-
> > > Links: You receive all messages sent to this group.
> > > View/Reply Online (#240383):
> > > https://lists.openembedded.org/g/openembedded-core/message/240383
> > > Mute This Topic: https://lists.openembedded.org/mt/120154469/4454582
> > > Group Owner: openembedded-core+owner@lists.openembedded.org
> > > Unsubscribe:
> > > https://lists.openembedded.org/g/openembedded-core/unsub [
> > > adrian.freihofer@gmail.com]
> > > -=-=-=-=-=-=-=-=-=-=-=-
>
diff mbox series

Patch

diff --git a/meta/classes-recipe/kernel-fit-image.bbclass b/meta/classes-recipe/kernel-fit-image.bbclass
index 448a88ccb1..899516e372 100644
--- a/meta/classes-recipe/kernel-fit-image.bbclass
+++ b/meta/classes-recipe/kernel-fit-image.bbclass
@@ -69,7 +69,8 @@  python do_compile() {
     # Collect all the its nodes before the its file is generated and mkimage gets executed
     root_node = oe.fitimage.ItsNodeRootKernel(
         d.getVar("FIT_DESC"), d.getVar("FIT_ADDRESS_CELLS"),
-        d.getVar('HOST_PREFIX'), d.getVar('UBOOT_ARCH'),  d.getVar("FIT_CONF_PREFIX"),
+        d.getVar('HOST_PREFIX'), d.getVar('UBOOT_ARCH'), d.getVar('FIT_OS'),
+        d.getVar("FIT_CONF_PREFIX"),
         oe.types.boolean(d.getVar('FIT_KERNEL_SIGN_ENABLE')), d.getVar("FIT_KERNEL_SIGN_KEYDIR"),
         d.getVar("UBOOT_MKIMAGE"), d.getVar("UBOOT_MKIMAGE_DTCOPTS"),
         d.getVar('FIT_MKIMAGE_EXTRA_OPTS'),
diff --git a/meta/conf/image-fitimage.conf b/meta/conf/image-fitimage.conf
index 2fdb816d55..a06d30e494 100644
--- a/meta/conf/image-fitimage.conf
+++ b/meta/conf/image-fitimage.conf
@@ -37,6 +37,10 @@  FIT_CONF_PREFIX[doc] = "Prefix to use for FIT configuration node name"
 
 FIT_SUPPORTED_INITRAMFS_FSTYPES ?= "cpio.lz4 cpio.lzo cpio.lzma cpio.xz cpio.zst cpio.gz ext2.gz cpio"
 
+# os field of the kernel and various other images in the FIT image. Set to "efi"
+# to load a kernel with EFI stub as an EFI application.
+FIT_OS ?= "linux"
+
 # Allow user to support special use cases where the kernel binary is
 # not included in the FIT image itself.
 # This is particularly useful for UKI-based setups, where the kernel
diff --git a/meta/lib/oe/fitimage.py b/meta/lib/oe/fitimage.py
index 81d18f6c91..86a0e44e12 100644
--- a/meta/lib/oe/fitimage.py
+++ b/meta/lib/oe/fitimage.py
@@ -153,7 +153,7 @@  class ItsNodeRootKernel(ItsNode):
     If a device tree included in the FIT image, the default configuration is the
     firt DTB. If there is no dtb present than the default configuation the kernel.
     """
-    def __init__(self, description, address_cells, host_prefix, arch, conf_prefix,
+    def __init__(self, description, address_cells, host_prefix, arch, os, conf_prefix,
                  sign_enable=False, sign_keydir=None,
                  mkimage=None, mkimage_dtcopts=None,
                  mkimage_extra_opts=None,
@@ -171,6 +171,7 @@  class ItsNodeRootKernel(ItsNode):
 
         self._host_prefix = host_prefix
         self._arch = arch
+        self._os = os
         self._conf_prefix = conf_prefix
 
         # Signature related properties
@@ -279,7 +280,7 @@  class ItsNodeRootKernel(ItsNode):
         opt_props = {
             "data": '/incbin/("' + kernel_path + '")',
             "arch": self._arch,
-            "os": "linux",
+            "os": self._os,
         }
         if load:
             opt_props["load"] = f"<{load}>"
@@ -370,7 +371,7 @@  class ItsNodeRootKernel(ItsNode):
             {
                 "data": '/incbin/("' + setup_path + '")',
                 "arch": self._arch,
-                "os": "linux",
+                "os": self._os,
                 "load": load,
                 "entry": entry
             }
@@ -385,7 +386,7 @@  class ItsNodeRootKernel(ItsNode):
             "data": '/incbin/("' + ramdisk_path + '")',
             "type": "ramdisk",
             "arch": self._arch,
-            "os": "linux"
+            "os": self._os,
         }
         if load:
             opt_props["load"] = f"<{load}>"
@@ -406,7 +407,7 @@  class ItsNodeRootKernel(ItsNode):
         opt_props = {
             "data": '/incbin/("' + filepath + '")',
             "arch": arch if arch is not None else self._arch,
-            "os": os if os is not None else "linux",
+            "os": os if os is not None else self._os,
         }
 
         if load:
diff --git a/meta/lib/oeqa/selftest/cases/fitimage.py b/meta/lib/oeqa/selftest/cases/fitimage.py
index c5f2975223..d28b5b8965 100644
--- a/meta/lib/oeqa/selftest/cases/fitimage.py
+++ b/meta/lib/oeqa/selftest/cases/fitimage.py
@@ -670,6 +670,7 @@  class KernelFitImageBase(FitImageTestCase):
             'FIT_LOADABLES',
             'FIT_LOADABLE_ENTRYPOINT',
             'FIT_LOADABLE_LOADADDRESS',
+            'FIT_OS',
             'FIT_SIGN_ALG',
             'FIT_SIGN_INDIVIDUAL',
             'FIT_UBOOT_ENV',
@@ -904,7 +905,7 @@  class KernelFitImageBase(FitImageTestCase):
             # 'compression = "' + str(bb_vars['FIT_KERNEL_COMP_ALG']) + '";', defined based on files in TMPDIR, not ideal...
             'data = /incbin/("linux.bin");',
             'arch = "' + str(bb_vars['UBOOT_ARCH']) + '";',
-            'os = "linux";',
+            'os = "%s";' % bb_vars['FIT_OS'],
             'load = <' + str(bb_vars['UBOOT_LOADADDRESS']) + '>;',
             'entry = <' + str(bb_vars['UBOOT_ENTRYPOINT']) + '>;',
         ]
@@ -1463,6 +1464,7 @@  class FitImagePyTests(KernelFitImageBase):
             'FIT_KEY_SIGN_PKCS': "-x509",
             'FIT_LOADABLES': "",
             'FIT_LINUX_BIN': "linux.bin",
+            'FIT_OS': "linux",
             'FIT_PAD_ALG': "pkcs-1.5",
             'FIT_SIGN_ALG': "rsa2048",
             'FIT_SIGN_INDIVIDUAL': "0",
@@ -1503,7 +1505,8 @@  class FitImagePyTests(KernelFitImageBase):
 
         root_node = oe.fitimage.ItsNodeRootKernel(
             bb_vars["FIT_DESC"], bb_vars["FIT_ADDRESS_CELLS"],
-            bb_vars['HOST_PREFIX'], bb_vars['UBOOT_ARCH'],  bb_vars["FIT_CONF_PREFIX"],
+            bb_vars['HOST_PREFIX'], bb_vars['UBOOT_ARCH'], bb_vars['FIT_OS'],
+            bb_vars["FIT_CONF_PREFIX"],
             oe.types.boolean(bb_vars['UBOOT_SIGN_ENABLE']), bb_vars["UBOOT_SIGN_KEYDIR"],
             bb_vars["UBOOT_MKIMAGE"], bb_vars["UBOOT_MKIMAGE_DTCOPTS"],
             bb_vars["UBOOT_MKIMAGE_SIGN"], bb_vars["UBOOT_MKIMAGE_SIGN_ARGS"],
@@ -1609,6 +1612,12 @@  class FitImagePyTests(KernelFitImageBase):
         }
         self._test_fitimage_py(bb_vars_overrides)
 
+    def test_fitimage_py_conf_os(self):
+        """Test FIT_OS functionality"""
+        bb_vars_overrides = {
+            'FIT_OS': "efi",
+        }
+        self._test_fitimage_py(bb_vars_overrides)
 
 class UBootFitImageTests(FitImageTestCase):
     """Test cases for the uboot-sign bbclass"""