Yes, thanks to point out this.

Now I am thinking the problem becomes much broader.
For example, do we need support a platform only set 2G page table in PEI phase? 
Or 1G?
Or do we need support a platform only set 0~1G and 3G~4G page table?
Or even more fragmented?

I do not think a generic core module can handle the case that a platform only 
set 0~1G and 3G~4G page table.
There must be some rule pre-defined in specification, instead of using PCD. (Or 
we need a PCD to define the range?)

PI specification might be a good place to clarify that rule. Please allow me to 
ask.

Thank you
Yao Jiewen


From: edk2-devel [mailto:[email protected]] On Behalf Of Laszlo 
Ersek
Sent: Tuesday, February 23, 2016 9:41 PM
To: Ard Biesheuvel
Cc: Ni, Ruiyu; Tian, Feng; [email protected]; Justen, Jordan L; 
[email protected]; [email protected]; Yao, Jiewen; Gao, Liming; 
Fan, Jeff; Zeng, Star
Subject: Re: [edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only 
allocate below 4 GB if needed

On 02/23/16 14:27, Ard Biesheuvel wrote:
> On 23 February 2016 at 13:58, Laszlo Ersek wrote:
>> On 02/23/16 11:42, Yao, Jiewen wrote:
>>> Laszlo
>>>
>>> I do not understand why you only set 4G page table for X64 PEI.
>>
>
> Actually, that question is not even relevant. The reality is simply
> that the value of PcdDxeIplSwitchToLongMode is not sufficient to
> decide whether PEI will have access to all of memory, and we need some
> other way to convey the PEI memory limit. Note that, if OVMF
> implements it that way, there may be other platforms in the wild that
> do the same, so 'fixing' OVMF does not help us at all.

Thanks for pointing this out.

> So we are back to a PCD that sets a memory limit for PEI. I suppose
> having a simple feature PCD should be sufficient here? Any suggestions
> for names?

PcdFavor64BitPeiMemory?

Thanks
Laszlo


>
>
>
>
>> Two reasons.
>>
>> * First, OVMF's PEI has minimal memory needs. The permanent PEI RAM
>> we install it is normally capped at 64MB. If the guest has large RAM,
>> then we install more PEI RAM, but only so that the DXE IPL can build
>> page tables for the entirety of the guest RAM. (In other words, in
>> such cases the permanent PEI RAM size is dictated by / dominated by
>> the DXE IPL's page table allocation.)
>>
>> * Second, OVMF is special in that it doesn't need to configure DRAM
>> hardware before it becomes usable. Therefore only the reset vector
>> and the SEC phase run from flash. SEC decompresses both PEI and DXE
>> firmware volumes into normal RAM, and PEI runs from RAM.
>>
>> In order to make this possible, originally OVMF's earliest page
>> tables were pre-built by the build process -- those page tables were
>> statically embedded into the read-only flash image, and SEC would
>> only point CR3 at them. These page tables mapped RAM up to 4GB.
>>
>> Later this broke on some KVM versions: even if we pre-set the
>> Accessed and Dirty bits in the statically pre-built page table
>> entries, the processor wanted to rewrite those PTEs (in read-only
>> flash) when accessing the mapped pages themselves. Since the PTEs
>> existed in read-only memory, this broke. (I don't recall the exact
>> symptoms, but it didn't work.)
>>
>> So Jordan rewrote the creation of the earliest page tables, for the
>> X64 SEC/PEI case: it is now being done in the reset vector code. The
>> reset vector code and SEC continue to run from flash (located just below 
>> 4GB).
>> The reset vector creates the page tables (mapping memory up to 4GB)
>> dynamically, located in real RAM, at 8MB. (The size of the page
>> tables is 24KB.)
>>
>> The SEC phase is entered with paging enabled (using the tables
>> created above), and those same tables are used in PEI as well. (Until
>> the DXE IPL maps the full memory.)
>>
>>> But if X64 PEI only fills 4G page table by default, you can setup
>>> page fault handler to dynamic fix the address.
>>>
>>> That is the way how we handle full memory access in memory constrain
>>> environment, like SMM.
>>
>> I'm certain this is technically solvable, but let's make it clear
>> that the burden to make OVMF cope with such a change is not on us.
>>
>> OvmfPkg lives in the upstream edk2 repository. In any open source
>> project, in-tree client code that depends on central infrastructure
>> is not left behind when the infrastructure changes, and the burden of
>> adapting the client code to the infrastructure is also not on the
>> maintainers of the client code. Whoever is updating the
>> infrastructure is responsible for bringing forward all dependent
>> client code, with a bisectable series.
>>
>>> Also, this platform can choose not report above 4G memory as tested
>>> for DxeCore
>>
>> OVMF's PlatformPei already reports >=4GB memory as untested.
>>
>>> and report big enough ACPI/Reserved memory in MemoryTypeInformation
>>> table.
>>
>> How big is big enough?
>>
>>> Then DxeCore will allocate BIN below 4G and all ACPI/Reserved memory
>>> allocation will happen below 4G.
>>
>> Honestly, I find this way more complicated than a new PCD. A PCD is
>> explicit about its purpose.
>>
>> Whereas your suggestion, if I understand it correctly, would require
>> us to measure actual memory usage for the Memory Type Information
>> HOB, and keep it up-to-date as development progresses, new drivers
>> are pulled in, old drivers are modified, and so on.
>>
>> Also, the same OVMF binary is expected to run on QEMU when S3 support
>> is disabled (on the QEMU command line). In this case, some of the
>> foundational S3-related protocols are not installed, which prevents
>> the rest of the S3-related drivers from working. This is intentional,
>> and it impacts the amount of ACPI / Reserved memory needed.
>>
>>> We do not want to introduce a new PCD, because it is unnecessary
>>> burden to maintain a new one, especially we already have solution to
>>> handle most cases.
>>
>> The way I see it, support for a new platform family is being introduced.
>> A platform family that invalidates some of the key assumptions held
>> (and
>> hard-coded!) in a number of core modules. I don't think a
>> preexistent, well-working platform with a non-negligible user base
>> should be broken for the newcomer's sake.
>>
>> PCDs exist for platform configuration. That's what the name says:
>> Platform Configuration Database. If a new platform is being
>> accommodated in the core modules, I think it is quite natural to
>> reckon with some additional customization and maintenance.
>>
>> For example, I would think the following library instances present
>> some additional maintenance burden too:
>>
>> - MdePkg/Library/BaseCpuLib/AArch64
>> - MdePkg/Library/BaseLib/AArch64
>> - MdePkg/Library/BaseSynchronizationLib/AArch64
>>
>> I don't debate your claim that a new PCD presents new maintenance
>> burden
>> -- it does. I do question your claim that the burden is unnecessary.
>>
>> I've put insane amounts of work into OVMF's S3. If someone submits
>> bisectable, regression-conscious patches for OVMF that adapt OVMF to
>> the proposed repurposing of PcdDxeIplSwitchToLongMode, I will do my
>> best to test and review those patches. If no such patches will be
>> submitted, I will continue NACKing the repurposing of 
>> PcdDxeIplSwitchToLongMode.
>>
>> (Obviously, I'm also open to arguments that prove me wrong.)
>>
>> Thanks
>> Laszlo
>>
>>>
>>>
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>
>>>
>>> *From:*Laszlo Ersek [mailto:[email protected]]
>>> *Sent:* Tuesday, February 23, 2016 5:04 PM
>>> *To:* Yao, Jiewen; Ard Biesheuvel
>>> *Cc:* Ni, Ruiyu; [email protected]<mailto:[email protected]>; 
>>> Tian, Feng; Zeng, Star;
>>> [email protected]<mailto:[email protected]>; 
>>> [email protected]<mailto:[email protected]>; Fan, Jeff; Gao,
>>> Liming
>>> *Subject:* Re: [edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe:
>>> only allocate below 4 GB if needed
>>>
>>>
>>>
>>> On 02/23/16 05:31, Yao, Jiewen wrote:
>>>> I discussed with Module owner. Below is summary for MdeModulePkg:
>>>>
>>>> 1) PCD Name: We suggest to use PcdDxeIplSwitchToLongMode as
>>>> indicator that PEI is 32 bit and DXE is 64 bit for X86 platform. It
>>>> might be not clear stated in PCD description, but it is the intent
>>>> when this is introduced. We suggest to define this to be FALSE for
>>>> ARM, so that our core module can use it. (Confirmed with Liming
>>>> Gao)
>>>>
>>>> 2) AcpiTableDxe: As Star Zeng mentioned, we need make sure FACS is
>>>> allocate below 4G when PcdDxeIplSwitchToLongMode is set, because it
>>>> is used by S3Resume.
>>>
>>> This is not good enough. PEI might be restricted to the first 4GB of
>>> memory *even though* it is built for X64.
>>>
>>> Consider a platform with the following characteristics:
>>> - PEI is X64
>>> - DXE is X64
>>> - hence PcdDxeIplSwitchToLongMode is FALSE
>>> - PEI has page tables only for the first 4GB of RAM
>>> - S3 is supported
>>>
>>> If AcpiTableDxe keyed off of PcdDxeIplSwitchToLongMode *solely*, in
>>> order to see whether the FACS needs to be allocated under 4GB, then
>>> said platform would break.
>>>
>>> The most frequently used build of OVMF is exactly like written above.
>>>
>>>>
>>>> 3) UefiBootManagerLib: As Ruiyu Ni mentioned, we need make allocate
>>>> L"PerfDataMemAddr" below 4G for when PcdDxeIplSwitchToLongMode is
>>>> set, because it is used by S3Resume.
>>>
>>> My counter-argument is the same as above, I think.
>>>
>>>>
>>>>
>>>>
>>>> 4) BootGraphicsResourceTableDxe: There is no need to add 4G
>>>> limitation, we can remove that directly. (Confirmed with Chao
>>>> Zhang)
>>>>
>>>> 5) FirmwarePerformanceDataTableDxe: We can check
>>>> PcdDxeIplSwitchToLongMode to allocate Below4G memory for
>>>> mAcpiS3PerformanceTable which is used in S3.
>>>
>>> Same counter-argument again.
>>>
>>>> And we can remove 4G
>>>> limitation for mAcpiBootPerformanceTable directly. (Confirmed with
>>>> Chao
>>>> Zhang)
>>>>
>>>> 6) PiDxeS3BootScriptLib: We can check PcdDxeIplSwitchToLongMode for
>>>> S3TableBase and NewS3TableBase which is used in S3. (Confirmed with
>>>> Star
>>>> Zeng)
>>>
>>> Same counter-argument.
>>>
>>>>
>>>> 7) BootScriptExecutorDxe: We can check PcdDxeIplSwitchToLongMode
>>>> for FfsBuffer and BootScriptExecutorBuffer which is used in S3.
>>>> (Confirmed with Star Zeng)
>>>
>>> Same counter-argument.
>>>
>>>>
>>>> 8) CapsuleRuntimeDxe: Already check PcdDxeIplSwitchToLongMode.No
>>>> update needed. (Confirmed with Star Zeng)
>>>
>>> The only reason this doesn't break under OVMF is because OVMF
>>> doesn't implement capsule updates.
>>>
>>> In summary, PcdDxeIplSwitchToLongMode==TRUE implies, but is not
>>> equivalent to, the requirement to allocate under 4GB for S3
>>> purposes. A platform may have *both* S3 *and* a 64-bit PEI phase
>>> without access to
>>>> = 4GB memory.
>>>
>>> That's why I proposed a brand new PCD. PcdDxeIplSwitchToLongMode
>>> would imply that PCD, but the new PCD wouldn't necessarily imply
>>> PcdDxeIplSwitchToLongMode.
>>>
>>>> BTW: We are trying not use IntelFrameworkModulePkg. If there is
>>>> replacement in MdeModulePkg, we suggest use the one in
>>>> MdeModulePkg, for example, BDS or ACPI.
>>>
>>> Absolutely, but migrating a platform from IntelFrameworkModulePkg
>>> BDS to MdeModulePkg BDS is not trivial, due to lack of documentation
>>> and examples; plus some functionality that is publicly available
>>> from GenericBdsLib (and is used by PlatformBdsLib instances) needs
>>> to be exported from the new boot manager library.
>>>
>>> Thanks
>>> Laszlo
>>>
>>>>
>>>>
>>>>
>>>> Thank you
>>>>
>>>> Yao Jiewen
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> *From:*Ard Biesheuvel [mailto:[email protected]]
>>>> *Sent:* Monday, February 22, 2016 8:43 PM
>>>> *To:* Yao, Jiewen
>>>> *Cc:* Ni, Ruiyu; Laszlo Ersek; 
>>>> [email protected]<mailto:[email protected]>
>>>> ; Tian, Feng; Zeng, Star;
>>>> [email protected]<mailto:[email protected]> ;
>>> [email protected]<mailto:[email protected]> ; Fan,
>>>> Jeff; Gao, Liming
>>>> *Subject:* Re: [edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe:
>>>> only allocate below 4 GB if needed
>>>>
>>>>
>>>>
>>>> On 22 February 2016 at 13:40, Yao, Jiewen wrote:
>>>>> I did a search on current MdeModulePkg. I found there are more
>>>>> modules allocating Below4G memory.
>>>>>
>>>>> Besides BDS, we have BootGraphicsResourceTableDxe,
>>>>> BootScriptExecutorDxe, FirmwarePerformanceDataTableDxe, 
>>>>> PiDxeS3BootScriptLib, CapsuleRuntimeDxe.
>>>>>
>>>>>
>>>>>
>>>>> BootGraphicsResourceTableDxe – I am not clear.
>>>>>
>>>>> CapsuleRuntimeDxe – Below4G is designed for PEI capsule. Or we do
>>>>> not need such capability.
>>>>>
>>>>> BootScriptExecutorDxe, FirmwarePerformanceDataTableDxe,
>>>>> PiDxeS3BootScriptLib
>>>>> - data need to be access in PEI phase.
>>>>>
>>>>>
>>>>>
>>>>> I think we might need more clean up for 32bit PEI.
>>>>>
>>>>
>>>> Agreed.
>>>>
>>>>> I am still thinking if we can reuse old Pcd – we can clarify in
>>>>> PCD description – it is only for 32bit PEI and 64bit DXE.
>>>>>
>>>>> Or a new PCD, and name to Pcd32BitPei? Please allow me collect
>>>>> more feedback on that.
>>>>>
>>>>
>>>> OK
>>>>
>>>>> In order to separate 32bit PEI issue from ACPI issue, I think we
>>>>> can check in ACPI patch at first, if you want.
>>>>>
>>>>
>>>> Should I wait for the maintainers of MdeModulePkg to give their
>>>> Reviewed-by ?
>>>>
>>>
>>

_______________________________________________
edk2-devel mailing list
[email protected]<mailto:[email protected]>
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to