Hi Ard, On Mon, Nov 09, 2015 at 02:18:58PM +0100, Ard Biesheuvel wrote: > Mark all cached memory mappings as shareable (or inner shareable on > AArch64) so that our view of memory is kept coherent by the hardware. > > This is primarily relevant under virtualization (where a guest may migrate > to another core) but in general, since UEFI on ARM is mostly used in a > context where the secure firmware and possibly a secure OS are already up > and running, it is best to refrain from using any non-shareable mappings.
Thanks, this is both an important correctness fix and nice code cleanup. I ran into an issue while testing this, which is why I haven't responded to this, but I've bisected it down to r18503/3a05b13, and am looking into what causes an issue with Linux booting. Regardless - this patch wasn't the cause of my issue, and it looks fine. Reviewed-by: Leif Lindholm <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <[email protected]> > --- > ArmPkg/Include/Chipset/AArch64Mmu.h | 5 +++++ > ArmPkg/Include/Chipset/ArmV7Mmu.h | 8 ++++---- > ArmPkg/Library/ArmLib/AArch64/AArch64Mmu.c | 21 ++++++++++---------- > 3 files changed, 19 insertions(+), 15 deletions(-) > > diff --git a/ArmPkg/Include/Chipset/AArch64Mmu.h > b/ArmPkg/Include/Chipset/AArch64Mmu.h > index 22e492d61dc0..3c3df6d9835c 100644 > --- a/ArmPkg/Include/Chipset/AArch64Mmu.h > +++ b/ArmPkg/Include/Chipset/AArch64Mmu.h > @@ -74,6 +74,11 @@ > #define TT_NS BIT5 > #define TT_AF BIT10 > > +#define TT_SH_NON_SHAREABLE (0x0 << 8) > +#define TT_SH_OUTER_SHAREABLE (0x2 << 8) > +#define TT_SH_INNER_SHAREABLE (0x3 << 8) > +#define TT_SH_MASK (0x3 << 8) > + > #define TT_PXN_MASK BIT53 > #define TT_UXN_MASK BIT54 // EL1&0 > #define TT_XN_MASK BIT54 // EL2 / EL3 > diff --git a/ArmPkg/Include/Chipset/ArmV7Mmu.h > b/ArmPkg/Include/Chipset/ArmV7Mmu.h > index 24ab1755faa7..aaa0977205fa 100644 > --- a/ArmPkg/Include/Chipset/ArmV7Mmu.h > +++ b/ArmPkg/Include/Chipset/ArmV7Mmu.h > @@ -175,14 +175,14 @@ > #define TT_DESCRIPTOR_SECTION_WRITE_BACK(NonSecure) > (TT_DESCRIPTOR_SECTION_TYPE_SECTION > | \ > ((NonSecure) ? > TT_DESCRIPTOR_SECTION_NS : 0) | \ > > TT_DESCRIPTOR_SECTION_NG_GLOBAL | \ > - > TT_DESCRIPTOR_SECTION_S_NOT_SHARED | \ > + > TT_DESCRIPTOR_SECTION_S_SHARED | \ > > TT_DESCRIPTOR_SECTION_DOMAIN(0) | \ > > TT_DESCRIPTOR_SECTION_AP_RW_RW | \ > > TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC) > #define TT_DESCRIPTOR_SECTION_WRITE_THROUGH(NonSecure) > (TT_DESCRIPTOR_SECTION_TYPE_SECTION > | \ > ((NonSecure) ? > TT_DESCRIPTOR_SECTION_NS : 0) | \ > > TT_DESCRIPTOR_SECTION_NG_GLOBAL | \ > - > TT_DESCRIPTOR_SECTION_S_NOT_SHARED | \ > + > TT_DESCRIPTOR_SECTION_S_SHARED | \ > > TT_DESCRIPTOR_SECTION_DOMAIN(0) | \ > > TT_DESCRIPTOR_SECTION_AP_RW_RW | \ > > TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC) > @@ -203,12 +203,12 @@ > > #define TT_DESCRIPTOR_PAGE_WRITE_BACK > (TT_DESCRIPTOR_PAGE_TYPE_PAGE > | \ > > TT_DESCRIPTOR_PAGE_NG_GLOBAL > | \ > - > TT_DESCRIPTOR_PAGE_S_NOT_SHARED > | \ > + > TT_DESCRIPTOR_PAGE_S_SHARED > | \ > > TT_DESCRIPTOR_PAGE_AP_RW_RW > | \ > > TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC) > #define TT_DESCRIPTOR_PAGE_WRITE_THROUGH > (TT_DESCRIPTOR_PAGE_TYPE_PAGE > | \ > > TT_DESCRIPTOR_PAGE_NG_GLOBAL > | \ > - > TT_DESCRIPTOR_PAGE_S_NOT_SHARED > | \ > + > TT_DESCRIPTOR_PAGE_S_SHARED > | \ > > TT_DESCRIPTOR_PAGE_AP_RW_RW > | \ > > TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC) > #define TT_DESCRIPTOR_PAGE_DEVICE > (TT_DESCRIPTOR_PAGE_TYPE_PAGE > | \ > diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Mmu.c > b/ArmPkg/Library/ArmLib/AArch64/AArch64Mmu.c > index e40c09ae9685..8829c6286b36 100644 > --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Mmu.c > +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Mmu.c > @@ -34,23 +34,22 @@ ArmMemoryAttributeToPageAttribute ( > { > switch (Attributes) { > case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK: > - return TT_ATTR_INDX_MEMORY_WRITE_BACK; > - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH: > - return TT_ATTR_INDX_MEMORY_WRITE_THROUGH; > - case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE: > - return TT_ATTR_INDX_DEVICE_MEMORY; > - case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED: > - return TT_ATTR_INDX_MEMORY_NON_CACHEABLE; > case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK: > - return TT_ATTR_INDX_MEMORY_WRITE_BACK; > + return TT_ATTR_INDX_MEMORY_WRITE_BACK | TT_SH_INNER_SHAREABLE; > + > + case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH: > case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH: > - return TT_ATTR_INDX_MEMORY_WRITE_THROUGH; > - case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE: > - return TT_ATTR_INDX_DEVICE_MEMORY; > + return TT_ATTR_INDX_MEMORY_WRITE_THROUGH | TT_SH_INNER_SHAREABLE; > + > + // Uncached and device mappings are treated as outer shareable by default, > + case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED: > case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED: > return TT_ATTR_INDX_MEMORY_NON_CACHEABLE; > + > default: > ASSERT(0); > + case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE: > + case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE: > return TT_ATTR_INDX_DEVICE_MEMORY; > } > } > -- > 1.9.1 > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

