Our primary user QEMU/mach-virt presents us with a FDT blob padded to 64 KB with plenty of room to set additional properties. However, in the general case, we should only add properties after making sure there is enough room available.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <[email protected]> --- .../Library/PlatformPeiLib/PlatformPeiLib.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.c b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.c index f2404f89d152..540474608deb 100644 --- a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.c +++ b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.c @@ -24,6 +24,15 @@ #include <Guid/EarlyPL011BaseAddress.h> #include <Guid/FdtHob.h> +// +// We may want to apply some changes to the device tree before passing it +// to the OS: for instance, if we find a PL031 RTC node and attach our +// runtime driver to it, we should disable it in the device tree by setting +// its status property to "disabled". Add some padding to make sure this is +// possible. +// +#define FDT_PADDING 256 + EFI_STATUS EFIAPI PlatformPeim ( @@ -32,7 +41,7 @@ PlatformPeim ( { VOID *Base; VOID *NewBase; - UINTN FdtSize; + UINTN FdtPages; UINTN *FdtHobData; UINT64 *UartHobData; INT32 Node, Prev; @@ -46,10 +55,10 @@ PlatformPeim ( Base = (VOID*)(UINTN)PcdGet64 (PcdDeviceTreeInitialBaseAddress); ASSERT (Base != NULL && fdt_check_header (Base) == 0); - FdtSize = fdt_totalsize (Base); - NewBase = AllocatePages (EFI_SIZE_TO_PAGES (FdtSize)); + FdtPages = EFI_SIZE_TO_PAGES (fdt_totalsize (Base) + FDT_PADDING); + NewBase = AllocatePages (FdtPages); ASSERT (NewBase != NULL); - CopyMem (NewBase, Base, FdtSize); + fdt_open_into (Base, NewBase, EFI_PAGES_TO_SIZE (FdtPages)); FdtHobData = BuildGuidHob (&gFdtHobGuid, sizeof *FdtHobData); ASSERT (FdtHobData != NULL); -- 1.8.3.2 ------------------------------------------------------------------------------ New Year. New Location. New Benefits. New Data Center in Ashburn, VA. GigeNET is offering a free month of service with a new server in Ashburn. Choose from 2 high performing configs, both with 100TB of bandwidth. Higher redundancy.Lower latency.Increased capacity.Completely compliant. http://p.sf.net/sfu/gigenet _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel
