|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v6 2/2] arm/efi: load dom0 modules from DT using UEFI
On Mon, 11 Oct 2021, Stefano Stabellini wrote:
> On Mon, 11 Oct 2021, Luca Fancellu wrote:
> > > On 11 Oct 2021, at 20:53, Stefano Stabellini <sstabellini@xxxxxxxxxx>
> > > wrote:
> > >
> > > On Mon, 11 Oct 2021, Luca Fancellu wrote:
> > >> Add support to load Dom0 boot modules from
> > >> the device tree using the xen,uefi-binary property.
> > >>
> > >> Update documentation about that.
> > >>
> > >> Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx>
> > >
> >
> > Hi Stefano,
> >
> > > Unfortunately, due to the change to the previous patch, this patch now
> > > has one issue, see below.
> > >
> > >
> > >> @@ -754,6 +760,41 @@ static int __init
> > >> handle_module_node(EFI_FILE_HANDLE dir_handle,
> > >> return ERROR_SET_REG_PROPERTY;
> > >> }
> > >>
> > >> + if ( !is_domu_module )
> > >> + {
> > >> + if ( (fdt_node_check_compatible(fdt, module_node_offset,
> > >> + "multiboot,kernel") == 0) )
> > >> + {
> > >> + /*
> > >> + * This is the Dom0 kernel, wire it to the kernel variable
> > >> because it
> > >> + * will be verified by the shim lock protocol later in the
> > >> common
> > >> + * code.
> > >> + */
> > >> + if ( kernel.addr )
> > >> + {
> > >> + PrintMessage(L"Dom0 kernel already found in cfg file.");
> > >> + return ERROR_DOM0_ALREADY_FOUND;
> > >> + }
> > >> + kernel.need_to_free = false; /* Freed using the module
> > >> array */
> > >> + kernel.addr = file->addr;
> > >> + kernel.size = file->size;
> > >> + }
> > >> + else if ( ramdisk.addr &&
> > >> + (fdt_node_check_compatible(fdt, module_node_offset,
> > >> + "multiboot,ramdisk") == 0)
> > >> )
> > >> + {
> > >> + PrintMessage(L"Dom0 ramdisk already found in cfg file.");
> > >> + return ERROR_DOM0_RAMDISK_FOUND;
> > >> + }
> > >> + else if ( xsm.addr &&
> > >> + (fdt_node_check_compatible(fdt, module_node_offset,
> > >> + "xen,xsm-policy") == 0) )
> > >> + {
> > >> + PrintMessage(L"XSM policy already found in cfg file.");
> > >> + return ERROR_XSM_ALREADY_FOUND;
> > >> + }
> > >> + }
> > >> +
> > >> return 0;
> > >> }
> > >>
> > >> @@ -793,7 +834,7 @@ static int __init
> > >> handle_dom0less_domain_node(EFI_FILE_HANDLE dir_handle,
> > >> module_node = fdt_next_subnode(fdt, module_node) )
> > >> {
> > >> int ret = handle_module_node(dir_handle, module_node, addr_cells,
> > >> - size_cells);
> > >> + size_cells, true);
> > >> if ( ret < 0 )
> > >> return ret;
> > >> }
> > >> @@ -803,7 +844,7 @@ static int __init
> > >> handle_dom0less_domain_node(EFI_FILE_HANDLE dir_handle,
> > >>
> > >> /*
> > >> * This function checks for xen domain nodes under the /chosen node for
> > >> possible
> > >> - * domU guests to be loaded.
> > >> + * dom0 and domU guests to be loaded.
> > >> * Returns the number of modules loaded or a negative number for error.
> > >> */
> > >> static int __init efi_check_dt_boot(EFI_FILE_HANDLE dir_handle)
> > >> @@ -830,6 +871,9 @@ static int __init efi_check_dt_boot(EFI_FILE_HANDLE
> > >> dir_handle)
> > >> if ( handle_dom0less_domain_node(dir_handle, node) < 0 )
> > >> return ERROR_DT_MODULE_DOMU;
> > >> }
> > >> + else if ( handle_module_node(dir_handle, node, addr_len,
> > >> size_len,
> > >> + false) < 0 )
> > >> + return ERROR_DT_MODULE_DOM0;
> > >> }
> > >
> > > handle_module_node comes with a "multiboot,module" compatible check now,
> > > which is fine for dom0less DomU modules, but it is not OK for dom0
> > > modules.
> > >
> > > That is because it is also possible to write the dom0 modules (kernel
> > > and ramdisk) with the following compabile strings:
> > >
> > > /chosen/dom0 compatible "xen,linux-zimage" "xen,multiboot-module"
> > > /chosen/dom0-ramdisk compatible "xen,linux-initrd" "xen,multiboot-module"
> >
> > Oh ok I’m surprised because I think even before I was not managing any
> > module
> > with “xen,multiboot-module”, just any multiboot,{kernel,ramdisk,device-tree}
>
> At least by looking at the code it seemed to work before, although we
> weren't explicitly checking for this case
>
>
> > > They are legacy but we are not meant to break support for them. Also
> > > third party tools might still use them -- I checked and even
> > > ImageBuilder still uses them.
> > >
> > > One way to solve the problem is to make the "multiboot,module"
> > > compatible check at the beginning of handle_module_node conditional on
> > > !is_domu_module.
> > >
> > > Or maybe just ignore compabible errors if !is_domu_module. Something like:
> > >
> > > diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h
> > > index 840728d6c0..cbfcd55449 100644
> > > --- a/xen/arch/arm/efi/efi-boot.h
> > > +++ b/xen/arch/arm/efi/efi-boot.h
> > > @@ -721,7 +721,7 @@ static int __init handle_module_node(EFI_FILE_HANDLE
> > > dir_handle,
> > > /* Error while checking the compatible string */
> > > return ERROR_CHECK_MODULE_COMPAT;
> > >
> > > - if ( module_compat != 0 )
> > > + if ( is_domu_module && module_compat != 0 )
> > > /* Module is not a multiboot,module */
> > > return 0;
> > >
> >
> > I can be ok with this change but it means that any node under chosen that
> > is not a “xen,domain”
> > will be handled as it is a Dom0 boot module (if it has xen,uefi-binary), is
> > it always true?
>
> Good point. I don't think it is a safe assumption.
>
>
> > Otherwise I can do these changes:
> >
> > --- a/xen/arch/arm/efi/efi-boot.h
> > +++ b/xen/arch/arm/efi/efi-boot.h
> > @@ -721,10 +721,19 @@ static int __init handle_module_node(EFI_FILE_HANDLE
> > dir_handle,
> > /* Error while checking the compatible string */
> > return ERROR_CHECK_MODULE_COMPAT;
> >
> > - if ( module_compat != 0 )
> > + if ( is_domu_module && (module_compat != 0) )
> > /* Module is not a multiboot,module */
> > return 0;
> >
> > + /*
> > + * For Dom0 boot modules can be specified also using the legacy
> > compatible
> > + * xen,multiboot-module
> > + */
> > + if ( !is_domu_module && module_compat &&
> > + (fdt_node_check_compatible(fdt, module_node_offset,
> > + "xen,multiboot-module") != 0) )
> > + return 0;
> > +
> > /* Read xen,uefi-binary property to get the file name. */
> > uefi_name_prop = fdt_getprop(fdt, module_node_offset,
> > "xen,uefi-binary",
> > &uefi_name_len);
> > @@ -763,7 +772,9 @@ static int __init handle_module_node(EFI_FILE_HANDLE
> > dir_handle,
> > if ( !is_domu_module )
> > {
> > if ( (fdt_node_check_compatible(fdt, module_node_offset,
> > - "multiboot,kernel") == 0) )
> > + "multiboot,kernel") == 0) ||
> > + (fdt_node_check_compatible(fdt, module_node_offset,
> > + "xen,linux-zimage") == 0) )
> > {
> > /*
> > * This is the Dom0 kernel, wire it to the kernel variable
> > because it
> > @@ -780,8 +791,10 @@ static int __init handle_module_node(EFI_FILE_HANDLE
> > dir_handle,
> > kernel.size = file->size;
> > }
> > else if ( ramdisk.addr &&
> > - (fdt_node_check_compatible(fdt, module_node_offset,
> > - "multiboot,ramdisk") == 0) )
> > + ((fdt_node_check_compatible(fdt, module_node_offset,
> > + "multiboot,ramdisk") == 0) ||
> > + (fdt_node_check_compatible(fdt, module_node_offset,
> > + "xen,linux-initrd") == 0)) )
> > {
> > PrintMessage(L"Dom0 ramdisk already found in cfg file.");
> > return ERROR_DOM0_RAMDISK_FOUND;
> >
> >
> > I would need to check for “xen,linux-zimage” and “xen,linux-initrd” however
> > to be sure the user is not specifying the kernel and ramdisk twice.
> >
> > Please let me know if you agree or if there is some issue with them.
>
> I have another idea: I don't think we need to actually check for
> "xen,linux-zimage" or "xen,linux-initrd" because I am pretty sure they
> were always used in conjunction with "xen,multiboot-module".
>
> So maybe it is enough to check for:
>
> - for dom0: "xen,multiboot-module"
> - domU: "multiboot,module"
>
>
> E.g.:
>
> diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h
> index 840728d6c0..076b827bdd 100644
> --- a/xen/arch/arm/efi/efi-boot.h
> +++ b/xen/arch/arm/efi/efi-boot.h
> @@ -713,10 +713,12 @@ static int __init handle_module_node(EFI_FILE_HANDLE
> dir_handle,
> char mod_string[24]; /* Placeholder for module@ + a 64-bit number + \0 */
> int uefi_name_len, file_idx, module_compat;
> module_name *file;
> + const char *compat_string = is_domu_module ? "multiboot,module" :
> + "xen,multiboot-module";
>
> /* Check if the node is a multiboot,module otherwise return */
> module_compat = fdt_node_check_compatible(fdt, module_node_offset,
> - "multiboot,module");
> + compat_string);
> if ( module_compat < 0 )
> /* Error while checking the compatible string */
> return ERROR_CHECK_MODULE_COMPAT;
Well... not exactly like this because this would stop a normal
"multiboot,module" dom0 kernel from being recognized.
So we need for domU: only "multiboot,module"
For Dom0, either "multiboot,module" or "xen,multiboot-module"
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |