On 6 November 2015 at 17:13, Ard Biesheuvel <ard.biesheu...@linaro.org> wrote:
> On 6 November 2015 at 17:02, Leif Lindholm <leif.lindh...@linaro.org> wrote:
>> On Fri, Nov 06, 2015 at 03:03:53PM +0100, Ard Biesheuvel wrote:
>>> The stride used by the cache maintenance by MVA instructions should
>>> be retrieved from CTR_EL0.DminLine and CTR_EL0.IminLine, whose values
>>> reflect the actual geometry of the caches. Using CCSIDR for this purpose
>>> violates the architecture.
>>
>> Does it?
>> Sure, you'd need to iterate over all levels of I/D/U cache and pick
>> the smallest, but... If the current code doesn't, then it's broken (as
>> opposed to violating the architecture).
>>
>
> Yes, it does. The ARM ARM states quite clearly that the contents of
> CCSIDR should not be used to make any inferences about the actual
> cache geometry.
>

And yes, it is indeed broken as well since it only looks at the line
length of the L1.

>>> Also, move the line length accessors to common code, since there is no
>>> need to keep them separate between ARMv7 and AArch64.
>>
>> There is for Arm9 though - the CTR format changed for ARMv7.
>> So either we turn this back into an Arm9 purge as part of the cache
>> maintenance fixes (which I would like to avoid) or I think we need to
>> keep the per-arch line length accessors for now.
>>
>
> Actually, you can't build the ARM9 version anymore, since ArmLib now
> depends on <Chipset/ArmV7.h> whereas the ARM9 specific code includes
> <Chipset/ARM926EJ-S.h> as well, resulting in a conflict. I don't think
> this has been buildable since bd6b97994ab6 ("ArmPkg/ArmLib: Clean
> ArmV7Lib") dated somewhere back in 2011
>
>
>
>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
>>> Reviewed-by: Mark Rutland <mark.rutl...@arm.com>
>>> ---
>>>  ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c | 25 ------------------
>>>  ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.c     | 27 --------------------
>>>  ArmPkg/Library/ArmLib/Common/ArmLib.c      | 18 +++++++++++++
>>>  3 files changed, 18 insertions(+), 52 deletions(-)
>>>
>>> diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c 
>>> b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c
>>> index 4bea20356fa3..dec125f248cd 100644
>>> --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c
>>> +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c
>>> @@ -21,31 +21,6 @@
>>>  #include "AArch64Lib.h"
>>>  #include "ArmLibPrivate.h"
>>>
>>> -UINTN
>>> -EFIAPI
>>> -ArmDataCacheLineLength (
>>> -  VOID
>>> -  )
>>> -{
>>> -  UINT32 CCSIDR = ReadCCSIDR (0) & 7;
>>> -
>>> -  // * 4 converts to bytes
>>> -  return (1 << (CCSIDR + 2)) * 4;
>>> -}
>>> -
>>> -UINTN
>>> -EFIAPI
>>> -ArmInstructionCacheLineLength (
>>> -  VOID
>>> -  )
>>> -{
>>> -  UINT32 CCSIDR = ReadCCSIDR (1) & 7;
>>> -
>>> -  // * 4 converts to bytes
>>> -  return (1 << (CCSIDR + 2)) * 4;
>>> -}
>>> -
>>> -
>>>  VOID
>>>  AArch64DataCacheOperation (
>>>    IN  AARCH64_CACHE_OPERATION  DataCacheOperation
>>> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.c 
>>> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.c
>>> index 44edff869eae..b53f455bfad2 100644
>>> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.c
>>> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.c
>>> @@ -20,33 +20,6 @@
>>>  #include "ArmV7Lib.h"
>>>  #include "ArmLibPrivate.h"
>>>
>>> -UINTN
>>> -EFIAPI
>>> -ArmDataCacheLineLength (
>>> -  VOID
>>> -  )
>>> -{
>>> -  UINT32 CCSIDR = ReadCCSIDR (0) & 7;
>>> -
>>> -  // * 4 converts to bytes
>>> -  return (1 << (CCSIDR + 2)) * 4;
>>> -}
>>> -
>>> -UINTN
>>> -EFIAPI
>>> -ArmInstructionCacheLineLength (
>>> -  VOID
>>> -  )
>>> -{
>>> -  UINT32 CCSIDR = ReadCCSIDR (1) & 7;
>>> -
>>> -  // * 4 converts to bytes
>>> -  return (1 << (CCSIDR + 2)) * 4;
>>> -
>>> -//  return 64;
>>> -}
>>> -
>>> -
>>>  VOID
>>>  ArmV7DataCacheOperation (
>>>    IN  ARM_V7_CACHE_OPERATION  DataCacheOperation
>>> diff --git a/ArmPkg/Library/ArmLib/Common/ArmLib.c 
>>> b/ArmPkg/Library/ArmLib/Common/ArmLib.c
>>> index 4febc45220a3..ad0a265e9f59 100644
>>> --- a/ArmPkg/Library/ArmLib/Common/ArmLib.c
>>> +++ b/ArmPkg/Library/ArmLib/Common/ArmLib.c
>>> @@ -70,3 +70,21 @@ ArmUnsetCpuActlrBit (
>>>    Value &= ~Bits;
>>>    ArmWriteCpuActlr (Value);
>>>  }
>>> +
>>> +UINTN
>>> +EFIAPI
>>> +ArmDataCacheLineLength (
>>> +  VOID
>>> +  )
>>> +{
>>> +  return 4 << ((ArmCacheInfo () >> 16) & 0xf); // CTR_EL0.DminLine
>>> +}
>>> +
>>> +UINTN
>>> +EFIAPI
>>> +ArmInstructionCacheLineLength (
>>> +  VOID
>>> +  )
>>> +{
>>> +  return 4 << (ArmCacheInfo () & 0xf); // CTR_EL0.IminLine
>>> +}
>>> --
>>> 1.9.1
>>>
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to