[PATCH v2] efi/libstub/arm*: Set default address and size cells values for an empty dtb
AKASHI Takahiro
takahiro.akashi at linaro.org
Thu Mar 2 02:23:29 PST 2017
Mark,
On Fri, Feb 24, 2017 at 03:36:44PM +0000, Mark Rutland wrote:
> Hi,
>
> On Tue, Feb 07, 2017 at 02:19:20PM -0700, Jeffrey Hugo wrote:
> > From: Sameer Goel <sgoel at codeaurora.org>
> >
> > In cases where a device tree is not provided (ie ACPI based system), an
> > empty fdt is generated by efistub. #address-cells and #size-cells are not
> > set in the empty fdt, so they default to 1 (4 byte wide). This can be an
> > issue on 64-bit systems where values representing addresses, etc may be
> > 8 bytes wide as the default value does not align with the general
> > requirements for an empty DTB, and is fragile when passed to other agents
> > as extra care is required to read the entire width of a value.
> >
> > This issue is observed on Qualcomm Technologies QDF24XX platforms when
> > kexec-tools inserts 64-bit addresses into the "linux,elfcorehdr" and
> > "linux,usable-memory-range" properties of the fdt. When the values are
> > later consumed, they are truncated to 32-bit.
> >
> > Setting #address-cells and #size-cells to 2 at creation of the empty fdt
> > resolves the observed issue, and makes the fdt less fragile.
> >
> > Signed-off-by: Sameer Goel <sgoel at codeaurora.org>
> > Signed-off-by: Jeffrey Hugo <jhugo at codeaurora.org>
>
> Technically the kdump ABI isn't set in stone yet, and this isn't a
> problem until that goes in.
>
> So while this generally looks ok, it's possible that this may be
> unnecessary, and on reflection I do symptahise with Ard's earlier
> comment that this shouldn't otherwise be necessary for the empty dt.
>
> So I'd prefer if this were folded into the kdump series if it's
> necessary. That way this goes in if it's necessary, and we can drop it
> otherwise.
I don't have any problem in folding this patch into my kdump series,
but I don't know how we should address Robin's comment:
> Hang on, if this code is shared with 32-bit ARM, doesn't this just move
> the problem around?
Since the values of *-cells under root node should reflect the hardware,
the kernel has no way to determine whether they be 1 or 2 here.
Thinking of this circumstance, I'd prefer to always use 64-bit values
for the address and the size. This aligns with other properties under /chosen
node, like initrd-* and uefi-*, whose values are also 64-bit wide.
(I know that the current kernel cannot boot if the entire memory is
located at >4GB, but it's a different issue.)
Thanks,
-Takahiro AKASHI
> Thanks,
> Mark.
>
> > ---
> >
> > [v2]
> > -Add braces to an if when the corresponding else has braces
> > -Remove print statements
> > -Reword commit text
> > -Removed gerrit tag
> >
> > drivers/firmware/efi/libstub/fdt.c | 28 ++++++++++++++++++++++++++--
> > 1 file changed, 26 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c
> > index 921dfa0..22ea73b 100644
> > --- a/drivers/firmware/efi/libstub/fdt.c
> > +++ b/drivers/firmware/efi/libstub/fdt.c
> > @@ -16,6 +16,22 @@
> >
> > #include "efistub.h"
> >
> > +#define EFI_DT_ADDR_CELLS_DEFAULT 2
> > +#define EFI_DT_SIZE_CELLS_DEFAULT 2
> > +
> > +static void fdt_update_cell_size(efi_system_table_t *sys_table, void *fdt)
> > +{
> > + int offset;
> > +
> > + offset = fdt_path_offset(fdt, "/");
> > + /* Set the #address-cells and #size-cells values for an empty tree */
> > +
> > + fdt_setprop_u32(fdt, offset, "#address-cells",
> > + EFI_DT_ADDR_CELLS_DEFAULT);
> > +
> > + fdt_setprop_u32(fdt, offset, "#size-cells", EFI_DT_SIZE_CELLS_DEFAULT);
> > +}
> > +
> > static efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
> > unsigned long orig_fdt_size,
> > void *fdt, int new_fdt_size, char *cmdline_ptr,
> > @@ -42,10 +58,18 @@ static efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
> > }
> > }
> >
> > - if (orig_fdt)
> > + if (orig_fdt) {
> > status = fdt_open_into(orig_fdt, fdt, new_fdt_size);
> > - else
> > + } else {
> > status = fdt_create_empty_tree(fdt, new_fdt_size);
> > + if (status == 0) {
> > + /*
> > + * Any failure from the following function is non
> > + * critical
> > + */
> > + fdt_update_cell_size(sys_table, fdt);
> > + }
> > + }
> >
> > if (status != 0)
> > goto fdt_set_fail;
> > --
> > Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
> > Qualcomm Technologies, Inc. is a member of the
> > Code Aurora Forum, a Linux Foundation Collaborative Project.
> >
More information about the linux-arm-kernel
mailing list