summaryrefslogtreecommitdiff
path: root/ArmVirtPkg
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2015-11-18 11:50:33 +0000
committerabiesheuvel <abiesheuvel@Edk2>2015-11-18 11:50:33 +0000
commitdca7f96fd246130cfa7ffa29aa81e0d956ed413b (patch)
tree457599160b961205a4b56100a56b50ecad5343e4 /ArmVirtPkg
parentdd7a987dac8526fbd9605e5ae3da6d396f5bf6f4 (diff)
downloadedk2-platforms-dca7f96fd246130cfa7ffa29aa81e0d956ed413b.tar.xz
ArmVirtPkg/ArmVirtPlatformLib: map executable NOR region as normal memory
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.biesheuvel@linaro.org> Reviewed-by: Laszlo Ersek <lersek@redhat.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18889 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'ArmVirtPkg')
-rw-r--r--ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c b/ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c
index d5d288fb1b..530f7d608e 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;
}