Thanks, got the point. It seems vague that who to ensure the cache coherency. MMU? Caller of UpdateCapsule? UpdateCapsule? Consumer of capsule data?
Thanks, Star -----Original Message----- From: edk2-devel [mailto:[email protected]] On Behalf Of Ard Biesheuvel Sent: Thursday, June 7, 2018 12:50 PM To: Zeng, Star <[email protected]> Cc: Ni, Ruiyu <[email protected]>; [email protected]; Leif Lindholm <[email protected]>; Yao, Jiewen <[email protected]>; Gao, Liming <[email protected]>; Kinney, Michael D <[email protected]> Subject: Re: [edk2] [PATCH] MdeModulePkg/CapsulePei: clean Dcache before consuming capsule data On 7 June 2018 at 03:37, Zeng, Star <[email protected]> wrote: > Hi Ard, > > The input parameter CapsuleHeaderArray of UpdateCapsule has the virtual > address. > It has the virtual address of the capsules yes. But how about the data structures passed as the ScatterGatherList? > CapsuleHeaderArray > Virtual pointer to an array of virtual pointers to the capsules being > passed into update capsule. Each capsules is assumed to stored in > contiguous virtual memory. The capsules in the CapsuleHeaderArray must > be the same capsules as the ScatterGatherList. The CapsuleHeaderArray > must have the > > > Thanks, > Star > -----Original Message----- > From: edk2-devel [mailto:[email protected]] On Behalf Of > Ard Biesheuvel > Sent: Wednesday, June 6, 2018 8:10 PM > To: [email protected] > Cc: Ni, Ruiyu <[email protected]>; Ard Biesheuvel > <[email protected]>; Gao, Liming <[email protected]>; Yao, > Jiewen <[email protected]>; Leif Lindholm > <[email protected]>; Kinney, Michael D > <[email protected]>; Zeng, Star <[email protected]> > Subject: Re: [edk2] [PATCH] MdeModulePkg/CapsulePei: clean Dcache > before consuming capsule data > > On 6 June 2018 at 11:52, Ard Biesheuvel <[email protected]> wrote: >> When capsule updates are staged for processing after a warm reboot, >> they are copied into memory with the MMU and caches enabled. When the >> capsule PEI gets around to coalescing the capsule, the MMU and caches >> may still be disabled, and so on architectures where uncached >> accesses are incoherent with the caches (such as ARM and AARCH64), we >> may read stale data if we don't clean the caches to memory first. >> >> Contributed-under: TianoCore Contribution Agreement 1.1 >> Signed-off-by: Ard Biesheuvel <[email protected]> > > Leif asked me to include a note why this cannot be done when > UpdateCapsule() is called. > > > """ > Note that this cache maintenance cannot be done during the invocation of > UpdateCapsule(), since the ScatterGatherList structures are only identified > by physical address, and at runtime, the firmware doesn't know whether and > where this memory is mapped, and cache maintenance requires a virtual address. > """ > >> --- >> MdeModulePkg/Universal/CapsulePei/CapsulePei.inf | 1 + >> MdeModulePkg/Universal/CapsulePei/Common/CapsuleCoalesce.c | 4 ++++ >> 2 files changed, 5 insertions(+) >> >> diff --git a/MdeModulePkg/Universal/CapsulePei/CapsulePei.inf >> b/MdeModulePkg/Universal/CapsulePei/CapsulePei.inf >> index c54bc21a95a8..594e110d1f8a 100644 >> --- a/MdeModulePkg/Universal/CapsulePei/CapsulePei.inf >> +++ b/MdeModulePkg/Universal/CapsulePei/CapsulePei.inf >> @@ -48,6 +48,7 @@ [Packages] >> >> [LibraryClasses] >> BaseLib >> + CacheMaintenanceLib >> HobLib >> BaseMemoryLib >> PeiServicesLib >> diff --git >> a/MdeModulePkg/Universal/CapsulePei/Common/CapsuleCoalesce.c >> b/MdeModulePkg/Universal/CapsulePei/Common/CapsuleCoalesce.c >> index 3e7054cd38a9..1730f925adc5 100644 >> --- a/MdeModulePkg/Universal/CapsulePei/Common/CapsuleCoalesce.c >> +++ b/MdeModulePkg/Universal/CapsulePei/Common/CapsuleCoalesce.c >> @@ -27,6 +27,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >> EXPRESS OR IMPLIED. >> #include <Guid/CapsuleVendor.h> >> >> #include <Library/BaseMemoryLib.h> >> +#include <Library/CacheMaintenanceLib.h> >> #include <Library/DebugLib.h> >> #include <Library/PrintLib.h> >> #include <Library/BaseLib.h> >> @@ -283,6 +284,9 @@ ValidateCapsuleByMemoryResource ( >> DEBUG ((EFI_D_INFO, "Address(0x%lx) Size(0x%lx) in >> MemoryResource[0x%x] - Start(0x%lx) Length(0x%lx)\n", >> Address, Size, >> Index, >> MemoryResource[Index].PhysicalStart, >> MemoryResource[Index].ResourceLength)); >> + >> + WriteBackDataCacheRange ((VOID *)(UINTN)Address, Size); >> + >> return TRUE; >> } >> } >> -- >> 2.17.0 >> > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

