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

Reply via email to