On 7 June 2018 at 12:12, Zeng, Star <[email protected]> wrote: > 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. >
OK. I think it is a bad idea to perform cache maintenance on an address that may be invalid. So I'd prefer to keep the single invocation. > > 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

