On 4 September 2014 04:09, Laszlo Ersek <ler...@redhat.com> wrote:
> Hi Ard,
>
> I started to review your v6 patchset in reverse order -- I first created
> a map between your v5 and v6 patches (as much as it was possible), then
> started to look at the DSC file(s) first. The requirement to dynamically
> determine the UART base address from the DTB is a very intrusive one,
> unfortunately. So, the first thing that caught my eye was the various
> new instances of the SerialPortLib class.
>
> As we discussed on #linaro-enterprise, "EarlyFdtPL011SerialPortLib" is
> not appropriate for DXE_CORE, because it accesses the initial copy of
> the DTB (at the bottom of the system DRAM), and at that point, when the
> DXE_CORE is already running, that memory area is no longer protected
> (because we decided to relocate it instead of protecting it in-place).
>
> So, I didn't get very far in the v6 review, but I do think I can propose
> an improvement for the DXE_CORE's serial port library. Please see the
> following patches.
>

Looks great, thanks! I will look in more detail later today, but one
thing comes to mind already:
since the PcdGet() call in the constructor of the ordinary FdtPL011
library is causing dependency hell and the need for a cloned
UefiBootServicesTableLib, is there any reason we can't use your
DXE_CORE version for *all* stages after DXE_CORE as well? Getting the
base address from a HOB and caching it doesn't seem more heavy weight
than getting it from a Dynamic PCD, and it would allow us to drop some
of the nasty stuff.


> I sought to separate these patches out in such a way that you can review
> them easily, and more importantly, apply them on top of your v6 tree,
> then rebase the entire thing, and *squash* my patches into your patches.
> It should be obvious for each one of mine which one of yours it should
> be squashed into, purely from the paths in each patch.
>

I will try to send out v7 by noon tomorrow, thanks

Cheers,
Ard.



> As a summary, with these "fixups" applied, we have the following
> situation (marking where the "fixups" make a difference relative to your
> v6):
>
> (1) In SEC:
>     - code runs from flash
>     - code uses temporary RAM only
>     - qemu's DTB is protected (distinct from temp RAM)
>     - SerialPortLib ("EarlyFdt" variant) parses QEMU's original DTB for
>       each write call (because it cannot store the UART base anywhere,
>       as state)
>     - PCDs are unavailable
>     - HOBs are unavailable (HobLib definitely)
>     - the SEC half or ArmVirtualizationPlatformLib, ie. function
>       ArmPlatformInitialize(), only asserts
>       !PcdSystemMemoryInitializeInSec
>
> (2) In PEI, while on temporary RAM (covering PEI_CORE and PEIMs):
>     - code runs from flash
>     - code uses temporary RAM only
>     - qemu's DTB is protected (distinct from temp RAM)
>     - SerialPortLib ("EarlyFdt" variant) parses QEMU's original DTB for
>       each write call (because it cannot store the UART base anywhere,
>       as state)
>     - the PCD database is available, in a HOB, located in temp RAM,
>     - HOBs are available, in temp RAM,
>     - the PEI half of ArmVirtualizationPlatformLib, ie. function
>       ArmPlatformInitializeSystemMemory(), running as part of
>       MemoryInitPeim, does the following:
>       - parses QEMU's DTB,
>       - saves the DRAM size in the dynamic PcdSystemMemorySize,
>       - saves the UART base in the dynamic PcdPL011BaseAddress,
>       - saves the UART base address in a new, special HOB [CHANGE].
>         (Note that in general we can't assume that this HOB would be
>         available to any other PEIMs, especially not the PCD PEIM.)
>     - once ArmPlatformInitializeSystemMemory() returns to
>       InitializeMemory(), in ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.c:
>       - permanent PEI RAM is installed, based on PcdSystemMemorySize
>       - the PEI_CORE relocates itself to said perm RAM
>       - the HOB list and the PCD database are migrated to perm RAM
>
> (3) In PEI, while on permanent RAM (covering PEI_CORE and PEIMs):
>     - code runs from flash
>     - code uses permanent RAM
>     - qemu's DTB is protected (distinct from perm RAM)
>     - SerialPortLib ("EarlyFdt" variant) still parses QEMU's original
>       DTB for each write call. Maybe this could be optimized, but it is
>       good enough for the rest of PEI, so DO NOT TOUCH IT. :)
>     - the PCD database is available in perm RAM
>     - HOBs are available in perm RAM,
>     - ArmPlatformPkg/PlatformPei/PlatformPeim can now run (see the Depex
>       it inherits from our PlatformPeiLib instance), and in
>       PlatformPeim():
>       - it copies QEMU's DTB to a freshly allocated block in perm PEI
>         RAM, setting the dynamic PcdDeviceTreeBaseAddress
>       - an FV HOB is built for the DXE IPL PEIM
>       - the original DTB is left in place for the rest of PEI
>
> (4) DXE_CORE
>     - code has been decompressed and runs from RAM
>     - code uses the entirety of the system DRAM
>     - qemu's DTB is *not* protected (must be assumed lost)
>     - the "EarlyFdt" variant of SerialPortLib must not attempt to parse
>       the original DTB as a consequence -- this is the problem in v6
>     - The relocated DTB is protected
>     - the PCD database is protected, but it is inaccessible, because the
>       PPI (PEI driver) is not available any longer, and the protocol
>       (DXE driver) is not available yet
>     - HOBs are protected and accessible (read-only) with HobLib
>     - therefore a new instance of SerialPortLib,
>       DxeCorePL011SerialPortLibInitialize, is added that doesn't parse
>       the old DTB (because that must be considered destroyed), doesn't
>       use any dynamic PCDs (because those are unavailable, see above),
>       instead it relies on the special HOB from step (2) to retrieve the
>       UART base address. [CHANGE]
>
> (5) DXE
>     - code has been decompressed and runs from RAM
>     - code uses the entirety of the system DRAM
>     - qemu's DTB is *not* protected (must be assumed lost)
>     - The relocated DTB is protected
>     - PCD database is available
>     - HOBs are available (r/o)
>     - the "Fdt" instance of SerialPortLib uses the dynamic
>       PcdPL011BaseAddress
>     - VirtFdtDxe runs early (APRIORI DXE) and sets a number of dynamic
>       PCDs from the relocated DTB for other drivers, and links the
>       relocated DTB into the system table for the kernel as well
>
> If you agree, please post v7 with these squashed (and potentially cleaned
> up further, as you see fit).
>
> Thanks
> Laszlo
>
> Laszlo Ersek (9):
>   ArmVirtualizationPkg: DSC: fix line endings
>   ArmVirtualizationPkg: introduce gEarlyPL011BaseAddressGuid
>   ArmVirtualizationPkg: DSC: resolve HobLib dependencies for SEC
>   ArmVirtualizationPlatformLib: lock down client module types
>   ArmVirtualizationPlatformLib: stash dynamic UART base in a HOB in the
>     PEI code
>   ArmVirtualizationPkg: FdtPL011SerialPortLib: lock down allowed clients
>   FdtPL011SerialPortLib.inf: drop bogus PcdSystemMemorySize reference
>   FdtPL011SerialPortLib: add DXE_CORE implementation
>   ArmVirtualizationPkg: DSC: resolve SerialPortLib for DXE_CORE
>
>  .../ArmVirtualizationPlatformLib.inf               |   6 +-
>  .../DxeCorePL011SerialPortLib.inf                  |  46 +++++++
>  .../EarlyFdtPL011SerialPortLib.inf                 |   2 +-
>  .../FdtPL011SerialPortLib.inf                      |   3 +-
>  .../Include/Guid/EarlyPL011BaseAddress.h           |  27 ++++
>  .../Library/ArmVirtualizationPlatformLib/Virt.c    |  22 +++-
>  .../DxeCorePL011SerialPortLib.c                    | 142 
> +++++++++++++++++++++
>  .../ArmVirtualizationPkg/ArmVirtualization.dsc.inc |  50 ++++----
>  .../ArmVirtualizationPkg/ArmVirtualizationPkg.dec  |   1 +
>  9 files changed, 267 insertions(+), 32 deletions(-)
>  create mode 100644 
> ArmPlatformPkg/ArmVirtualizationPkg/Library/FdtPL011SerialPortLib/DxeCorePL011SerialPortLib.inf
>  create mode 100644 
> ArmPlatformPkg/ArmVirtualizationPkg/Include/Guid/EarlyPL011BaseAddress.h
>  create mode 100644 
> ArmPlatformPkg/ArmVirtualizationPkg/Library/FdtPL011SerialPortLib/DxeCorePL011SerialPortLib.c
>
> --
> 1.8.3.1
>

------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to