On 11 May 2016 at 11:13, Ard Biesheuvel <[email protected]> wrote:
> 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 <[email protected]>

Reviewed-by: Leif Lindholm <[email protected]>

> ---
> v2:
> - use correct stride for Icache maintenance by VA
> - issue an ISB after completing the Icache maintenance
>
>  ArmPkg/Include/Library/ArmLib.h                                | 10 +++++++--
>  ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.c | 23 
> +++++++++++++++-----
>  ArmPkg/Library/ArmLib/AArch64/AArch64Support.S                 |  5 +++++
>  ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.S                     |  5 +++++
>  ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.asm                   |  6 +++++
>  5 files changed, 41 insertions(+), 8 deletions(-)
>
> diff --git a/ArmPkg/Include/Library/ArmLib.h b/ArmPkg/Include/Library/ArmLib.h
> index 1689f0072db6..4608b0cccccc 100644
> --- a/ArmPkg/Include/Library/ArmLib.h
> +++ b/ArmPkg/Include/Library/ArmLib.h
> @@ -183,13 +183,19 @@ ArmInvalidateDataCacheEntryByMVA (
>
>  VOID
>  EFIAPI
> -ArmCleanDataCacheEntryToPoUByMVA(
> +ArmCleanDataCacheEntryToPoUByMVA (
>    IN  UINTN   Address
>    );
>
>  VOID
>  EFIAPI
> -ArmCleanDataCacheEntryByMVA(
> +ArmInvalidateInstructionCacheEntryToPoUByMVA (
> +  IN  UINTN   Address
> +  );
> +
> +VOID
> +EFIAPI
> +ArmCleanDataCacheEntryByMVA (
>  IN  UINTN   Address
>  );
>
> diff --git a/ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.c 
> b/ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.c
> index 1045f9068f4d..f7667b8552d2 100644
> --- a/ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.c
> +++ b/ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.c
> @@ -17,11 +17,13 @@
>  #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();
> @@ -64,8 +66,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 +93,8 @@ WriteBackInvalidateDataCacheRange (
>    IN      UINTN                     Length
>    )
>  {
> -  CacheRangeOperation(Address, Length, 
> ArmCleanInvalidateDataCacheEntryByMVA);
> +  CacheRangeOperation(Address, Length, ArmCleanInvalidateDataCacheEntryByMVA,
> +    ArmDataCacheLineLength ());
>    return Address;
>  }
>
> @@ -105,7 +114,8 @@ WriteBackDataCacheRange (
>    IN      UINTN                     Length
>    )
>  {
> -  CacheRangeOperation(Address, Length, ArmCleanDataCacheEntryByMVA);
> +  CacheRangeOperation(Address, Length, ArmCleanDataCacheEntryByMVA,
> +    ArmDataCacheLineLength ());
>    return Address;
>  }
>
> @@ -116,6 +126,7 @@ InvalidateDataCacheRange (
>    IN      UINTN                     Length
>    )
>  {
> -  CacheRangeOperation(Address, Length, ArmInvalidateDataCacheEntryByMVA);
> +  CacheRangeOperation(Address, Length, ArmInvalidateDataCacheEntryByMVA,
> +    ArmDataCacheLineLength ());
>    return Address;
>  }
> diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S 
> b/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S
> index 43f7a795acec..9441f47e30ba 100644
> --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S
> +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S
> @@ -23,6 +23,7 @@ GCC_ASM_EXPORT (ArmInvalidateInstructionCache)
>  GCC_ASM_EXPORT (ArmInvalidateDataCacheEntryByMVA)
>  GCC_ASM_EXPORT (ArmCleanDataCacheEntryByMVA)
>  GCC_ASM_EXPORT (ArmCleanDataCacheEntryToPoUByMVA)
> +GCC_ASM_EXPORT (ArmInvalidateInstructionCacheEntryToPoUByMVA)
>  GCC_ASM_EXPORT (ArmCleanInvalidateDataCacheEntryByMVA)
>  GCC_ASM_EXPORT (ArmInvalidateDataCacheEntryBySetWay)
>  GCC_ASM_EXPORT (ArmCleanDataCacheEntryBySetWay)
> @@ -80,6 +81,10 @@ ASM_PFX(ArmCleanDataCacheEntryToPoUByMVA):
>    dc      cvau, x0    // Clean single data cache line to PoU
>    ret
>
> +ASM_PFX(ArmInvalidateInstructionCacheEntryToPoUByMVA):
> +  ic      ivau, x0    // Invalidate single instruction cache line to PoU
> +  ret
> +
>
>  ASM_PFX(ArmCleanInvalidateDataCacheEntryByMVA):
>    dc      civac, x0   // Clean and invalidate single data cache line
> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.S 
> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.S
> index 50c760f335de..c765032c9e4d 100644
> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.S
> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.S
> @@ -18,6 +18,7 @@
>
>  GCC_ASM_EXPORT (ArmInvalidateInstructionCache)
>  GCC_ASM_EXPORT (ArmInvalidateDataCacheEntryByMVA)
> +GCC_ASM_EXPORT (ArmInvalidateInstructionCacheEntryToPoUByMVA)
>  GCC_ASM_EXPORT (ArmCleanDataCacheEntryByMVA)
>  GCC_ASM_EXPORT (ArmCleanDataCacheEntryToPoUByMVA)
>  GCC_ASM_EXPORT (ArmCleanInvalidateDataCacheEntryByMVA)
> @@ -74,6 +75,10 @@ ASM_PFX(ArmCleanDataCacheEntryToPoUByMVA):
>    mcr     p15, 0, r0, c7, c11, 1  @clean single data cache line to PoU
>    bx      lr
>
> +ASM_PFX(ArmInvalidateInstructionCacheEntryToPoUByMVA):
> +  mcr     p15, 0, r0, c7, c5, 1  @Invalidate single instruction cache line 
> to PoU
> +  mcr     p15, 0, r0, c7, c5, 7  @Invalidate branch predictor
> +  bx      lr
>
>  ASM_PFX(ArmCleanInvalidateDataCacheEntryByMVA):
>    mcr     p15, 0, r0, c7, c14, 1  @clean and invalidate single data cache 
> line
> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.asm 
> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.asm
> index a460bd2da7a9..2363ee457632 100644
> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.asm
> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Support.asm
> @@ -34,6 +34,12 @@ CTRL_I_BIT      EQU     (1 << 12)
>    bx      lr
>
>
> + RVCT_ASM_EXPORT ArmInvalidateInstructionCacheEntryToPoUByMVA
> +  mcr     p15, 0, r0, c7, c5, 1   ; invalidate single instruction cache line 
> to PoU
> +  mcr     p15, 0, r0, c7, c5, 7   ; invalidate branch predictor
> +  bx      lr
> +
> +
>   RVCT_ASM_EXPORT ArmCleanDataCacheEntryToPoUByMVA
>    mcr     p15, 0, r0, c7, c11, 1  ; clean single data cache line to PoU
>    bx      lr
> --
> 2.7.4
>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to