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

Reply via email to