[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1 06/21] ArmVirtualizationPkg: add padding to FDT allocation
On 01/23/15 16:02, Ard Biesheuvel wrote: > 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 <ard.biesheuvel@xxxxxxxxxx> > --- > .../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); > One nit: please keep the original FdtSize assignment (with type UINTN) and use that inside the EFI_SIZE_TO_PAGES() expression, when calculating FdtPages. Two reasons: - EFI_SIZE_TO_PAGES evaluates its argument twice. Although fdt_totalsize() is r/o and probably quick even, it's not very nice to call it twice. - I tried to figure out the return type of fdt_totalsize(), but I gave up quickly after looking at the header file. However, EFI_SIZE_TO_PAGES() should strictly take UINTN, which FdtSize covers at once. Sth like: FdtSize = fdt_totalsize (Base) + FDT_PADDING; FdtPages = EFI_SIZE_TO_PAGES (FdtSize); NewBase = AllocatePages (FdtPages); ... fdt_open_into (Base, NewBase, EFI_PAGES_TO_SIZE (FdtPages)); Thanks Laszlo _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |