On 15 December 2015 at 11:28, Leif Lindholm <[email protected]> wrote:
> On Tue, Dec 15, 2015 at 11:10:49AM +0100, Ard Biesheuvel wrote:
>> On 8 December 2015 at 16:11, Ard Biesheuvel <[email protected]> 
>> wrote:
>> > Commit SVN r18778 made all mappings of normal memory (inner) shareable,
>> > even on hardware that implements shareability as uncached accesses.
>> > The original concerns that prompted the change, regarding coherent DMA
>> > and virt guests migrating between CPUs, do not apply to such hardware,
>> > so revert to the original behavior in that case.
>> >
>> > Contributed-under: TianoCore Contribution Agreement 1.0
>> > Signed-off-by: Ard Biesheuvel <[email protected]>
>> > ---
>> > v2: use symbolic constants for the various shift and mask values
>> >     default to shareable on unexpected values, but ASSERT() as well
>> >
>>
>> Any more comment on this version? Thanks
>
> If Eugene is happy - for my part:
> Reviewed-by: Leif Lindholm <[email protected]>
>

Commited as SVN r19285. Thanks.


>> >  ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.h | 14 +++++++
>> >  ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c | 42 ++++++++++++++++++--
>> >  2 files changed, 53 insertions(+), 3 deletions(-)
>> >
>> > diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.h 
>> > b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.h
>> > index e138613ca548..cbd3d6f654a6 100644
>> > --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.h
>> > +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.h
>> > @@ -15,6 +15,20 @@
>> >  #ifndef __ARM_V7_LIB_H__
>> >  #define __ARM_V7_LIB_H__
>> >
>> > +#define ID_MMFR0_SHARELVL_SHIFT       12
>> > +#define ID_MMFR0_SHARELVL_MASK       0xf
>> > +#define ID_MMFR0_SHARELVL_ONE          0
>> > +#define ID_MMFR0_SHARELVL_TWO          1
>> > +
>> > +#define ID_MMFR0_INNERSHR_SHIFT       28
>> > +#define ID_MMFR0_INNERSHR_MASK       0xf
>> > +#define ID_MMFR0_OUTERSHR_SHIFT        8
>> > +#define ID_MMFR0_OUTERSHR_MASK       0xf
>> > +
>> > +#define ID_MMFR0_SHR_IMP_UNCACHED      0
>> > +#define ID_MMFR0_SHR_IMP_HW_COHERENT   1
>> > +#define ID_MMFR0_SHR_IGNORED         0xf
>> > +
>> >  typedef VOID (*ARM_V7_CACHE_OPERATION)(UINT32);
>> >
>> >  VOID
>> > diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c 
>> > b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c
>> > index 23d2e43beba0..fc8ea42843b3 100644
>> > --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c
>> > +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Mmu.c
>> > @@ -42,6 +42,42 @@ ConvertSectionAttributesToPageAttributes (
>> >  }
>> >
>> >  STATIC
>> > +BOOLEAN
>> > +PreferNonshareableMemory (
>> > +  VOID
>> > +  )
>> > +{
>> > +  UINTN   Mmfr;
>> > +  UINTN   Val;
>> > +
>> > +  if (FeaturePcdGet (PcdNormalMemoryNonshareableOverride)) {
>> > +    return TRUE;
>> > +  }
>> > +
>> > +  //
>> > +  // Check whether the innermost level of shareability (the level we will 
>> > use
>> > +  // by default to map normal memory) is implemented with hardware 
>> > coherency
>> > +  // support. Otherwise, revert to mapping as non-shareable.
>> > +  //
>> > +  Mmfr = ArmReadIdMmfr0 ();
>> > +  switch ((Mmfr >> ID_MMFR0_SHARELVL_SHIFT) & ID_MMFR0_SHARELVL_MASK) {
>> > +  case ID_MMFR0_SHARELVL_ONE:
>> > +    // one level of shareability
>> > +    Val = (Mmfr >> ID_MMFR0_OUTERSHR_SHIFT) & ID_MMFR0_OUTERSHR_MASK;
>> > +    break;
>> > +  case ID_MMFR0_SHARELVL_TWO:
>> > +    // two levels of shareability
>> > +    Val = (Mmfr >> ID_MMFR0_INNERSHR_SHIFT) & ID_MMFR0_INNERSHR_MASK;
>> > +    break;
>> > +  default:
>> > +    // unexpected value -> shareable is the safe option
>> > +    ASSERT (FALSE);
>> > +    return FALSE;
>> > +  }
>> > +  return Val != ID_MMFR0_SHR_IMP_HW_COHERENT;
>> > +}
>> > +
>> > +STATIC
>> >  VOID
>> >  PopulateLevel2PageTable (
>> >    IN UINT32                         *SectionEntry,
>> > @@ -80,7 +116,7 @@ PopulateLevel2PageTable (
>> >        break;
>> >    }
>> >
>> > -  if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
>> > +  if (PreferNonshareableMemory ()) {
>> >      PageAttributes &= ~TT_DESCRIPTOR_PAGE_S_SHARED;
>> >    }
>> >
>> > @@ -189,7 +225,7 @@ FillTranslationTable (
>> >        break;
>> >    }
>> >
>> > -  if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
>> > +  if (PreferNonshareableMemory ()) {
>> >      Attributes &= ~TT_DESCRIPTOR_SECTION_S_SHARED;
>> >    }
>> >
>> > @@ -281,7 +317,7 @@ ArmConfigureMmu (
>> >    }
>> >
>> >    if (TTBRAttributes & TTBR_SHAREABLE) {
>> > -    if (FeaturePcdGet(PcdNormalMemoryNonshareableOverride)) {
>> > +    if (PreferNonshareableMemory ()) {
>> >        TTBRAttributes ^= TTBR_SHAREABLE;
>> >      } else {
>> >        //
>> > --
>> > 1.9.1
>> >
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to