On 19 November 2015 at 00:55, Heyi Guo <heyi....@linaro.org> wrote: > > > On 11/18/2015 04:25 PM, 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 <ard.biesheu...@linaro.org> >> --- >> 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)); > > > Just a minor suggestion: is it better to use > MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS - 1 instead of 4 to avoid changing two > pieces of code when changing descriptor number? >
The end of table entry should follow directly after the last valid one, while the maximum number of entries could be higher (e.g., I could have changed it to 8, since we will end up using a single page anyway). _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel