On 18 November 2015 at 10:02, Laszlo Ersek <ler...@redhat.com> wrote:
> 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 <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));
>>
>>    *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.)
>

Yes, both AARCH64 and ARM still work fine under KVM on my Seattle Overdrive

> Reviewed-by: Laszlo Ersek <ler...@redhat.com>

Thanks
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to