On 7 June 2018 at 12:27, Zeng, Star <[email protected]> wrote:
> I think checking validity is other code's responsibility, after that the new 
> code to perform cache maintenance. They are separated.
> I prefer to cover both paths.
>

OK, fair enough.


>
> Thanks,
> Star
> -----Original Message-----
> From: edk2-devel [mailto:[email protected]] On Behalf Of Ard 
> Biesheuvel
> Sent: Thursday, June 7, 2018 6:14 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 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
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to