On 29 June 2015 at 18:21, Carsey, Jaben <jaben.car...@intel.com> wrote:
>
>>-----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.
>

Thanks. Obvious next question: how are those OSes supposed to ensure
that adjacent regions are mapped adjacently in the virtual mapping
then? AFAICT the only way to do this 100% reliably is to sort the
memory map first, and then go and find adjacent meta-regions, and keep
those together.

-- 
Ard.


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

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