On 20 November 2015 at 10:29, Heyi Guo <[email protected]> wrote:
> Hi Ard,
>
> Do we have special reason of not cleaning the allocated pages? If not
> having, I think it is safer to use "clean and invalidate".
>

Actually, I disagree. If your firmware relies on data making it to
main memory only due to a subsequent clean performed by the next owner
of the memory range, I'd much rather make it explicit.
And clean + invalidate is obviously more costly.

Leif?

> On 11/20/2015 02:25 PM, Ard Biesheuvel wrote:
>>
>> On 20 November 2015 at 06:32, Heyi Guo <[email protected]> wrote:
>>>
>>> It is implied that the memory returned from UncachedMemoryAllocationLib
>>> should have cache cleaned. So we clean and invalidate memory range after
>>> changing memory attribute to uncached.
>>>
>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>> Signed-off-by: Heyi Guo <[email protected]>
>>> Cc: Leif Lindholm <[email protected]>
>>> Cc: Ard Biesheuvel <[email protected]>
>>> ---
>>>   .../Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c
>>> | 3 +++
>>>   .../UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf
>>> | 1 +
>>>   2 files changed, 4 insertions(+)
>>>
>>> diff --git
>>> a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c
>>> b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c
>>> index b859f63..3242579 100644
>>> ---
>>> a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c
>>> +++
>>> b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.c
>>> @@ -25,6 +25,7 @@
>>>   #include <Library/PcdLib.h>
>>>   #include <Library/ArmLib.h>
>>>   #include <Library/DxeServicesTableLib.h>
>>> +#include <Library/CacheMaintenanceLib.h>
>>>
>>>   VOID *
>>>   UncachedInternalAllocatePages (
>>> @@ -165,6 +166,8 @@ AllocatePagesFromList (
>>>       return Status;
>>>     }
>>>
>>> +  WriteBackInvalidateDataCacheRange ((VOID *)(UINTN)Memory,
>>> EFI_PAGES_TO_SIZE (Pages));
>>> +
>>
>> I think invalidate only should be fine here, since it is a new
>> allocation, and we are allocating full pages. Since the architectural
>> max value of CWG is 2 KB, we could never end up discarding data that
>> is not covered by the allocation itself.
>>
>>>     NewNode = AllocatePool (sizeof (FREE_PAGE_NODE));
>>>     if (NewNode == NULL) {
>>>       ASSERT (FALSE);
>>> diff --git
>>> a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf
>>> b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf
>>> index 0a0b6cb..d7a0f2f 100644
>>> ---
>>> a/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf
>>> +++
>>> b/ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf
>>> @@ -38,6 +38,7 @@
>>>     MemoryAllocationLib
>>>     PcdLib
>>>     DxeServicesTableLib
>>> +  CacheMaintenanceLib
>>>
>>>   [Pcd]
>>>     gArmTokenSpaceGuid.PcdArmFreeUncachedMemorySizeThreshold
>>> --
>>> 2.6.2
>>>
>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to