Good to know. Thanks!

-----Original Message-----
From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] 
Sent: Monday, June 29, 2015 10:06 PM
To: Yao, Jiewen
Cc: edk2-devel@lists.sourceforge.net; Gao, Liming; Laszlo Ersek; Justen, Jordan 
L; Kinney, Michael D; Zeng, Star; Zimmer, Vincent; Fleming, Matt
Subject: Re: BUG in properties table feature implementation

On 29 June 2015 at 15:58, Yao, Jiewen <jiewen....@intel.com> wrote:
> Yes. It seems we need some special handling for AArch64.
> If 64KiB is minimal paging unit, I think we need check 64KiB PE section 
> alignment for AArch64.
>
> I confess that I only validated IA32 and X64, and I did not take AArch64 into 
> account.
>
> BTW: There is no 64KiB alignment requirement for AArch32, right? I cannot 
> find the word. So I just want to double confirm.
>

No there is not. Only 64-bit ARM can execute with 64 KB page size.

-- 
Ard.


> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> Sent: Monday, June 29, 2015 9:42 PM
> To: Yao, Jiewen
> Cc: edk2-devel@lists.sourceforge.net; Gao, Liming; Laszlo Ersek; Justen, 
> Jordan L; Kinney, Michael D; Zeng, Star; Zimmer, Vincent; Fleming, Matt
> Subject: Re: BUG in properties table feature implementation
>
> On 29 June 2015 at 14:54, Yao, Jiewen <jiewen....@intel.com> wrote:
>> Thanks for the sharing. Yes. I agree with you that this breaks backward 
>> compatibility.
>> Right, I do not think we can boot Win7 or old Win8 with this feature enabled.
>>
>> Both UEFI OS and Firmware need support this UEFI2.5 Properties Table 
>> feature. I believe it is known by UEFI forum, when it is added to UEFI spec, 
>> and it is published.
>>
>
> Yes, but I don't think it is documented anywhere that the OS needs to map all 
> runtime regions adjacently even if it does not actually care about the 
> EFI_MEMORY_RO attributes. Essentially, the OS always need to map adjacently 
> to be compatible with UEFI 2.5, and the current AArch64 Linux kernel crashes 
> badly on any UEFI 2,5 implementation that has this feature enabled.
>
>> UEFI 2.5 properties table is optional feature. It can be enabled or disabled.
>> The benefit of this feature is that: a UEFI2.5 OS can do memory protection 
>> based on UEFI memory map.
>> But the old UEFI OS cannot get any benefit.
>>
>> So a platform can made judgment based on its need, as well as the UEFI 2.5 
>> OS availability.
>>
>
> Unfortunately, this makes it an opt-in setting, and system will ship with it 
> disabled by default, in order to prevent boot failures on older OSes. That is 
> not typically how you want to deploy a security feature.
>
> There is another issue I would like your opinion about:
> for AArch64, MdeModulePkg/Core/Dxe/Mem/Imem.h defines the following
>
> #define EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT  (SIZE_64KB)
>
> and in CoreTerminateMemoryMap(), a final check is done that no Runtime 
> regions are aligned incorrectly.
> Yet, with the Properties Table feature enabled, memory regions are split 
> without taking this into account. Strangely enough, CoreTerminateMemoryMap () 
> does not complain about this.
>
> This is documented in the UEFI spec 2.3.6:
> """
> All 4KiB memory pages allocated for use by runtime services (of types 
> EfiRuntimeServicesCode, EfiRuntimeServicesData and
> EfiACPIMemoryNVS) must use identical ARM Memory Page Attributes (as described 
> in Table 8) within the same physical 64KiB page. Mixed attribute mappings 
> within a larger page are not allowed.
> """
>
> So I suppose the Properties table feature should use 64 KB not 4 KB when 
> executing on AArch64. However, the documentation for the Properties Table 
> feature mentions 4 KB explicitly, so that should go into the errata as well.
>
>
> Regards,
> Ard.
>
>
>> That is why we do not enable this PE/COFF 4K alignment in BaseTool as 
>> standard configuration.
>> So in other word, it is disabled by tool by default. A platform may also 
>> decide to not publish PropertiesTable by below PCD:
>>   ## Publish PropertiesTable or not.
>>   #
>>   # If this PCD is TRUE, DxeCore publishs PropertiesTable.
>>   # DxeCore evaluates if all runtime drivers has 4K aligned PE sections. If 
>> all
>>   # PE sections in runtime drivers are 4K aligned, DxeCore sets BIT0 in
>>   # PropertiesTable. Or DxeCore clears BIT0 in PropertiesTable.
>>   # If this PCD is FALSE, DxeCore does not publish PropertiesTable.
>>   #
>>   # If PropertiesTable has BIT0 set, DxeCore uses below policy in UEFI 
>> memory map:
>>   #   1) Use EfiRuntimeServicesCode for runtime driver PE image code section 
>> and
>>   #      use EfiRuntimeServicesData for runtime driver PE image header and 
>> other section.
>>   #   2) Set EfiRuntimeServicesCode to be EFI_MEMORY_RO.
>>   #   3) Set EfiRuntimeServicesData to be EFI_MEMORY_XP.
>>   #   4) Set EfiMemoryMappedIO and EfiMemoryMappedIOPortSpace to be 
>> EFI_MEMORY_XP.
>>   #
>>   # NOTE: Platform need gurantee this PCD is set correctly. Platform should 
>> set
>>   # this PCD to be TURE if and only if all runtime driver has seperated 
>> Code/Data
>>   # section. If PE code/data sections are merged, the result is 
>> unpredictable.
>>   #
>>   # @Prompt Publish UEFI PropertiesTable.
>>
>> gEfiMdeModulePkgTokenSpaceGuid.PropertiesTableEnable|TRUE|BOOLEAN|0x00
>> 00006e
>>
>> Thank you
>> Yao Jiewen
>>
>>
>> -----Original Message-----
>> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>> Sent: Monday, June 29, 2015 8:44 PM
>> To: Yao, Jiewen
>> Cc: edk2-devel@lists.sourceforge.net; Gao, Liming; Laszlo Ersek;
>> Justen, Jordan L; Kinney, Michael D; Zeng, Star
>> Subject: Re: BUG in properties table feature implementation
>>
>> On 29 June 2015 at 14:34, Yao, Jiewen <jiewen....@intel.com> wrote:
>>> Hi Ard
>>> Yes, your are right. We do observe similar odd behavior in old 
>>> Win7/Win8/Win8.1, and we have to disable it.
>>> Win8 and Win8.1 have OS patch to set adjacent virtual memory map, to 
>>> resolve this issue.
>>
>> I see this as a big problem with the feature, as it breaks backward
>> compatibility. IOW, you won't be able to boot Windows 7 on a UEFI 2.5
>> system unless you manually disable the feature (in the setup screen, I
>> suppose?)
>>
>>> We also tested Win10, and Suse 11 GM. They are good.
>>>
>>> Would you please share the information on which OS you are using?
>>>
>>
>> I am using the upstream Linux kernel for AArch64. I am not using a 
>> distribution.
>>
>>> All in all, if OS cannot guarantee the virtual memory map is adjacent, we 
>>> have to disable this feature.
>>>
>>
>> This is backwards: the feature should be implemented such that it cannot be 
>> trivially broken by a well-behaving OS. Note that nothing in the 
>> SetVirtualAddressMap () implementation suggests that the regions should be 
>> adjacent.
>>
>> Perhaps it would have been better to introduce a new memory region
>> type EfiRuntimeServicesPecoffData, so the OS at least knows which
>> regions it should keep adjacent, (i.e., Code and PecoffData regions
>> should be kept together)
>>
>> So does PE/COFF even allow the memory image to deviate from the file image? 
>> If so, the correct way is to update the PE/COFF loader and the relocation 
>> logic can deal with sections being laid out differently in memory than they 
>> are in the file.
>>
>> --
>> Ard.
>>
>>> -----Original Message-----
>>> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>>> Sent: Monday, June 29, 2015 6:46 PM
>>> To: edk2-devel@lists.sourceforge.net; Yao, Jiewen; Gao, Liming;
>>> Laszlo Ersek; Justen, Jordan L; Kinney, Michael D; Zeng, Star
>>> Subject: BUG in properties table feature implementation
>>>
>>> Hello all,
>>>
>>> I am running into another problem with the implementation of the UEFI
>>> 2.5 Properties Table feature. It splits PE/COFF images into separate but 
>>> adjacent memory regions, only to be able to assign different permissions to 
>>> .text and .data sections. This is working fine at boot time.
>>>
>>> However, at runtime, after calling virtual address map, this breaks
>>> down completely. Since the virtual mapping supplied to
>>> SetVirtualAddressMap() does not have to guarantee adjacency between code 
>>> and data regions (of which the OS does not know whether they belong 
>>> together or not), reapplying the relocations corrupts the memory image and 
>>> breaks the runtime services.
>>>
>>> For example, this region
>>>
>>>   0x00005eeb1000-0x00005eeb6fff [Runtime Code]
>>>   0x00005eeb7000-0x00005eec0fff [Runtime Data]
>>>
>>> is mapped on AARCH64 as
>>>
>>>   EFI remap 0x000000005eeb1000 => 00000000440a1000
>>>   EFI remap 0x000000005eeb7000 => 00000000440b7000
>>>
>>> which retains the relative alignment, but adds a 64 KB offset to the second 
>>> regions so that the regions can still be mapped with different permissions 
>>> when the OS is executing with a 64 KB page size.
>>>
>>> As far as I can tell, this is in accordance with the spec, and was working 
>>> fine until I tried to enable the properties table feature.
>>> With that enabled, the two above regions could actually describe one single 
>>> PE/COFF image in memory, and the 64 KB offset results in the relocations to 
>>> be applied incorrectly.
>>>
>>> I looked at PeCoffLoaderRelocateImageForRuntime () but to me, it is
>>> not very obvious how to solve this. Obviously, our PE/COFF
>>> implementation is not complete since it assumes file offset == memory
>>> offset for sections, but this does not hold anymore for UEFI 2.5
>>>
>>> I would also like to point out again that this is another result of the 
>>> fact that this series was pushed through with any review or testing outside 
>>> of the Intel firmware team. For features of this magnitude and complexity, 
>>> more scrutiny and testing is obviously required.
>>>
>>> Kind regards,
>>> Ard.
------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to