On 11/18/15 09:25, Ard Biesheuvel wrote: > The ARM architecture version 7 and later mandates that device mappings > have the XN (non-executable) bit set, to prevent speculative instruction > fetches from read-sensitive regions. This implies that we should not map > regions as device if we want to execute from them, so the NOR region that > contains our FD image should be mapped as normal memory instead. > > The MMU code deals correctly with overlapping ARM_MEMORY_REGION_DESCRIPTOR > entries, and later entries in the array take precedence over earlier ones. > So simply add an entry to the end of the array that overrides the mapping > attributes of the FD image, wherever it resides. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <[email protected]> > --- > ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c > b/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c > index d5d288fb1b48..530f7d608e0b 100644 > --- a/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c > +++ b/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c > @@ -22,7 +22,7 @@ > #include <ArmPlatform.h> > > // Number of Virtual Memory Map Descriptors > -#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 4 > +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 5 > > // DDR attributes > #define DDR_ATTRIBUTES_CACHED ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK > @@ -100,8 +100,14 @@ ArmPlatformGetVirtualMemoryMap ( > VirtualMemoryTable[2].Length = ArmGetPhysAddrTop () - > VirtualMemoryTable[2].PhysicalBase; > VirtualMemoryTable[2].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; > > + // Remap the FD region as normal executable memory > + VirtualMemoryTable[3].PhysicalBase = FixedPcdGet64 (PcdFdBaseAddress); > + VirtualMemoryTable[3].VirtualBase = VirtualMemoryTable[3].PhysicalBase; > + VirtualMemoryTable[3].Length = FixedPcdGet32 (PcdFdSize); > + VirtualMemoryTable[3].Attributes = CacheAttributes; > + > // End of Table > - ZeroMem (&VirtualMemoryTable[3], sizeof (ARM_MEMORY_REGION_DESCRIPTOR)); > + ZeroMem (&VirtualMemoryTable[4], sizeof (ARM_MEMORY_REGION_DESCRIPTOR)); > > *VirtualMemoryMap = VirtualMemoryTable; > } >
Thanks, this update is very welcome. Please don't forget to test it on phys hw / KVM. (If you haven't done so yet.) Reviewed-by: Laszlo Ersek <[email protected]> _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

