ArmPkg/ArmLib: don't invalidate entire I-cache on range operation
Instead of cleaning the data cache to the PoU by virtual address and subsequently invalidating the entire I-cache, invalidate only the range that we just cleaned. This way, we don't invalidate other cachelines unnecessarily. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
This commit is contained in:
@@ -17,15 +17,16 @@
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
|
||||
STATIC
|
||||
VOID
|
||||
CacheRangeOperation (
|
||||
IN VOID *Start,
|
||||
IN UINTN Length,
|
||||
IN LINE_OPERATION LineOperation
|
||||
IN LINE_OPERATION LineOperation,
|
||||
IN UINTN LineLength
|
||||
)
|
||||
{
|
||||
UINTN ArmCacheLineLength = ArmDataCacheLineLength();
|
||||
UINTN ArmCacheLineAlignmentMask = ArmCacheLineLength - 1;
|
||||
UINTN ArmCacheLineAlignmentMask = LineLength - 1;
|
||||
|
||||
// Align address (rounding down)
|
||||
UINTN AlignedAddress = (UINTN)Start - ((UINTN)Start & ArmCacheLineAlignmentMask);
|
||||
@@ -34,7 +35,7 @@ CacheRangeOperation (
|
||||
// Perform the line operation on an address in each cache line
|
||||
while (AlignedAddress < EndAddress) {
|
||||
LineOperation(AlignedAddress);
|
||||
AlignedAddress += ArmCacheLineLength;
|
||||
AlignedAddress += LineLength;
|
||||
}
|
||||
ArmDataSynchronizationBarrier ();
|
||||
}
|
||||
@@ -64,8 +65,14 @@ InvalidateInstructionCacheRange (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
CacheRangeOperation (Address, Length, ArmCleanDataCacheEntryToPoUByMVA);
|
||||
ArmInvalidateInstructionCache ();
|
||||
CacheRangeOperation (Address, Length, ArmCleanDataCacheEntryToPoUByMVA,
|
||||
ArmDataCacheLineLength ());
|
||||
CacheRangeOperation (Address, Length,
|
||||
ArmInvalidateInstructionCacheEntryToPoUByMVA,
|
||||
ArmInstructionCacheLineLength ());
|
||||
|
||||
ArmInstructionSynchronizationBarrier ();
|
||||
|
||||
return Address;
|
||||
}
|
||||
|
||||
@@ -85,7 +92,8 @@ WriteBackInvalidateDataCacheRange (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
CacheRangeOperation(Address, Length, ArmCleanInvalidateDataCacheEntryByMVA);
|
||||
CacheRangeOperation(Address, Length, ArmCleanInvalidateDataCacheEntryByMVA,
|
||||
ArmDataCacheLineLength ());
|
||||
return Address;
|
||||
}
|
||||
|
||||
@@ -105,7 +113,8 @@ WriteBackDataCacheRange (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
CacheRangeOperation(Address, Length, ArmCleanDataCacheEntryByMVA);
|
||||
CacheRangeOperation(Address, Length, ArmCleanDataCacheEntryByMVA,
|
||||
ArmDataCacheLineLength ());
|
||||
return Address;
|
||||
}
|
||||
|
||||
@@ -116,6 +125,7 @@ InvalidateDataCacheRange (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
CacheRangeOperation(Address, Length, ArmInvalidateDataCacheEntryByMVA);
|
||||
CacheRangeOperation(Address, Length, ArmInvalidateDataCacheEntryByMVA,
|
||||
ArmDataCacheLineLength ());
|
||||
return Address;
|
||||
}
|
||||
|
Reference in New Issue
Block a user