diff --git a/grub-core/loader/efi/fdt.c b/grub-core/loader/efi/fdt.c index c0c6800f7..a4c6e8036 100644 --- a/grub-core/loader/efi/fdt.c +++ b/grub-core/loader/efi/fdt.c @@ -29,6 +29,12 @@ static void *loaded_fdt; static void *fdt; +#define FDT_ADDR_CELLS_STRING "#address-cells" +#define FDT_SIZE_CELLS_STRING "#size-cells" +#define FDT_ADDR_SIZE_EXTRA ((2 * grub_fdt_prop_entry_size (sizeof(grub_uint32_t))) + \ + sizeof (FDT_ADDR_CELLS_STRING) + \ + sizeof (FDT_SIZE_CELLS_STRING)) + void * grub_fdt_load (grub_size_t additional_size) { @@ -46,8 +52,11 @@ grub_fdt_load (grub_size_t additional_size) else raw_fdt = grub_efi_get_firmware_fdt(); - size = - raw_fdt ? grub_fdt_get_totalsize (raw_fdt) : GRUB_FDT_EMPTY_TREE_SZ; + if (raw_fdt) + size = grub_fdt_get_totalsize (raw_fdt); + else + size = GRUB_FDT_EMPTY_TREE_SZ + FDT_ADDR_SIZE_EXTRA; + size += additional_size; grub_dprintf ("linux", "allocating %d bytes for fdt\n", size); @@ -63,6 +72,8 @@ grub_fdt_load (grub_size_t additional_size) else { grub_fdt_create_empty_tree (fdt, size); + grub_fdt_set_prop32 (fdt, 0, FDT_ADDR_CELLS_STRING, 2); + grub_fdt_set_prop32 (fdt, 0, FDT_SIZE_CELLS_STRING, 2); } return fdt; }