>-----Original Message-----
>From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>Sent: Monday, June 29, 2015 8:35 AM
>To: Yao, Jiewen
>Cc: Fleming, Matt; edk2-devel@lists.sourceforge.net
>Subject: Re: [edk2] BUG in properties table feature implementation
>
>On 29 June 2015 at 16:08, Yao, Jiewen <jiewen....@intel.com> wrote:
>> Good to know. Thanks!
>>
>
>Another question from my side: is it guaranteed the the memory map
>returned by GetMemoryMap() is sorted?
>Otherwise, it becomes non-trivial for the OS to ensure that all
>Runtime regions are mapped adjacently.
>

I have seen lots of odd maps with the memmap  shell command. I think that the 
answer is no as a result, but I'd like to know if someone knows for sure.

>
>> -----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

------------------------------------------------------------------------------
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