Since capsule data pointer may be invalid (for example, point to MMIO), we enhanced code to validate the capsule by memory resource HOB, and *recommend* platform/silicon (memory reference code) to report memory resource HOB before capsule coalescing. To consider and compatible with some platform may not report memory resource HOB before capsule coalescing, then MemoryResource == NULL and the code thinks it is valid.
Thanks, Star -----Original Message----- From: Ard Biesheuvel [mailto:[email protected]] Sent: Thursday, June 7, 2018 5:52 PM To: Zeng, Star <[email protected]> Cc: Ni, Ruiyu <[email protected]>; [email protected]; Gao, Liming <[email protected]>; Yao, Jiewen <[email protected]>; Leif Lindholm <[email protected]>; Kinney, Michael D <[email protected]> Subject: Re: [edk2] [PATCH] MdeModulePkg/CapsulePei: clean Dcache before consuming capsule data On 7 June 2018 at 11:46, Zeng, Star <[email protected]> wrote: > Ok, I want to know whether others have some idea, so let's wait some time? > > About the code change, I have three minor comments below. > 1. I suggest adding some code comment for the new line code. OK > 2. There are two paths in ValidateCapsuleByMemoryResource() to return TRUE, > should the new line code be added for both of them? Good question: In which circumstances is the MemoryResource == NULL case expected to occur? > 3. There is VS2015 building failure like below with the patch. The code needs > to typecast parameter 'Size'. > > warning C4244: 'function': conversion from 'UINT64' to 'UINTN', > possible loss of data > Will fix. > > Thanks, > Star > -----Original Message----- > From: edk2-devel [mailto:[email protected]] On Behalf Of > Ard Biesheuvel > Sent: Thursday, June 7, 2018 2:00 PM > To: Zeng, Star <[email protected]> > Cc: Ni, Ruiyu <[email protected]>; [email protected]; Gao, > Liming <[email protected]>; Yao, Jiewen <[email protected]>; > Leif Lindholm <[email protected]>; Kinney, Michael D > <[email protected]> > Subject: Re: [edk2] [PATCH] MdeModulePkg/CapsulePei: clean Dcache > before consuming capsule data > > On 7 June 2018 at 07:41, Zeng, Star <[email protected]> wrote: >> Thanks, got the point. >> >> It seems vague that who to ensure the cache coherency. MMU? Caller of >> UpdateCapsule? UpdateCapsule? Consumer of capsule data? >> > > Unfortunately, since the spec does not mention it at all, we cannot rely on > the caller of UpdateCapsule() to ensure this. That would require a spec > change, and break backward compatibility with older revisions. > > The main issue here is that ARM does not provide the means to clean the > entire cache, the only architectural method is clean cacheline by virtual > address. > > So that leaves: > - UpdateCapsule - problematic because it may be called at runtime and > the firmware has no means of translating the physical addresses > - ResetSystem - same as above: it is a runtime service, and so it > cannot rely on a mapping to exist for those physical addresses > - SEC - lacks the information about where the capsule resides > - CapsulePei - already extracts the information about the capsule address in > memory, and can perform the cache maintenance right before consuming the data. > > So unless anyone has any other suggestions, I think this approach is the only > feasible one. > > If there are any concerns about adding this for architectures, I can look > into refactoring CapsulePei and add it only for ARM/AARCH64. > > Thanks, > Ard. > > > >> -----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 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

