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]> > > 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

