Hi Andrew.

Thanks for the clarification!

Rafael

Em qua, 8 de ago de 2018 às 16:14, Andrew Fish <[email protected]> escreveu:

>
> On Aug 8, 2018, at 10:31 AM, Rafael Machado <
> [email protected]> wrote:
>
> Hi everyone
>
> One question that was not answered and that could help us, is about
> skipping the MemoryTypeInfo variable usage.
> Is there any way to do this skip at a UEFI App ?
> Simple erasing the MemoryTypeInfo  var seems a little to violent from our
> perspective. What do you think?
>
> Seems the system we're having this problem has some inconsistency when
> filling the MemoryTypeInfo  var before exiting the previous boot, and
> seems to consider the BootServices memory type also to be stored at the
> var. Does anyone remember of this kind of issue on some system in the past?
>
>
> No we do that all the time to remove fragmentation from the memory map and
> it does not
>
> Thanks,
>
> Andrew Fish
>
> Thanks and Regards
> Rafael
>
> Em qua, 8 de ago de 2018 às 08:55, Rafael Machado <
> [email protected]> escreveu:
>
>> Hi Jiewen
>>
>> Thanks for highlighting this.
>> Just checked and we just add the Reserved/Acpi/Runtime types.
>>
>> Seems the guess that this would be related to the MemoryTypeInfo var is
>> not the correct way to follow.
>>
>> We'll keep working on it, maybe asking more questions to the community in
>> future.
>> Thank you all for the help and guidance!
>> In case someone has any comment or idea, please feel free to share.
>>
>> Rafael
>>
>>
>>
>> Em ter, 7 de ago de 2018 às 19:42, Yao, Jiewen <[email protected]>
>> escreveu:
>>
>>> Hi
>>>
>>> It is unclear to me that which type you have put to MemoryTypeInfo table.
>>>
>>>
>>>
>>> By design, we only need put Reserved/Acpi/Runtime, which should be quite
>>> small.
>>>
>>>
>>>
>>> Do you put any other type into MemoryTypeInfo table?
>>>
>>>
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>
>>>
>>> *From:* Rafael Machado [mailto:[email protected]]
>>> *Sent:* Wednesday, August 8, 2018 3:12 AM
>>> *To:* Laszlo Ersek <[email protected]>
>>> *Cc:* Andrew Fish <[email protected]>; Ni, Ruiyu <[email protected]>;
>>> [email protected]; Yao, Jiewen <[email protected]>
>>>
>>>
>>> *Subject:* Re: [edk2] Question about memory map entries
>>>
>>>
>>>
>>> Hi everyone
>>>
>>>
>>>
>>> Based on the information shared by the members, the understanding is
>>> that the current state of the system may impact fuutre boots.
>>>
>>> The problem is that in my case, due to specific requirements, before
>>> booting we need to stress the system's memory, allocating a big amount of
>>> memory and doing some memory validation algorithms.
>>>
>>> So the high number of allocations and frees is by choice and not by
>>> mistakes.
>>>
>>>
>>>
>>> Considering this. Is there any way to bypass the MemoryTypeInformation
>>> var store actions?
>>>
>>>
>>>
>>> Thanks and Regards
>>>
>>> Rafael
>>>
>>>
>>>
>>> Em qui, 2 de ago de 2018 às 17:39, Laszlo Ersek <[email protected]>
>>> escreveu:
>>>
>>> On 08/02/18 21:18, Rafael Machado wrote:
>>> > Just found something interesting.
>>> > Based on the logs from the serial port.
>>> >
>>> > This system works fine:
>>> >
>>> > "PeiInstallPeiMemory MemoryBegin 0x93D50000, MemoryLength 0xA2B0000
>>> > Temp Stack : BaseAddress=0x400000 Length=0x80000
>>> > Temp Heap  : BaseAddress=0x480000 Length=0x80000
>>> > Total temporary memory:    1048576 bytes.
>>> >   temporary memory stack ever used: 524288 bytes.
>>> >   temporary memory heap used:       63304 bytes.
>>> > Old Stack size 524288, New stack size 524288
>>> > Stack Hob: BaseAddress=0x93D50000 Length=0x80000
>>> > Heap Offset = 0x93950000 Stack Offset = 0x93950000
>>> > Loading PEIM at 0x0009DFF4000 EntryPoint=0x0009DFF4260 PeiCore.efi"
>>> > ...
>>> > "CoreInitializeMemoryServices:
>>> >   BaseAddress - 0x93DE1000 Length - 0x8135000 MinimalMemorySizeNeeded -
>>> > 0x5AC0000"
>>> >
>>> > This one is bricked:
>>> >
>>> > "PeiInstallPeiMemory MemoryBegin 0x9C9000, MemoryLength 0x9D637000
>>> > Temp Stack : BaseAddress=0x400000 Length=0x80000
>>> > Temp Heap  : BaseAddress=0x480000 Length=0x80000
>>> > Total temporary memory:    1048576 bytes.
>>> >   temporary memory stack ever used: 524288 bytes.
>>> >   temporary memory heap used:       63304 bytes.
>>> > Old Stack size 524288, New stack size 524288
>>> > Stack Hob: BaseAddress=0x9C9000 Length=0x80000
>>> > Heap Offset = 0x5C9000 Stack Offset = 0x5C9000
>>> > Loading PEIM at 0x0009DFF4000 EntryPoint=0x0009DFF4260 PeiCore.efi"
>>> > ...
>>> > "CoreInitializeMemoryServices:
>>> >   BaseAddress - 0x0 Length - 0x0 MinimalMemorySizeNeeded - 0x98E47000
>>> > "
>>> > ...
>>> > "ASSERT_EFI_ERROR (Status = Out of Resources)
>>> > ASSERT [DxeCore] ...\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c(299):
>>> > !EFI_ERROR (Status)
>>> > AllocatePoolPages: failed to allocate 1 pages
>>> > AllocatePool: failed to allocate 120 bytes"
>>>
>>> The location and the size of the permanent PEI RAM are extremely
>>> different between the two cases.
>>>
>>> - Functional system:
>>>
>>>   PeiInstallPeiMemory MemoryBegin 0x93D50000, MemoryLength 0xA2B0000
>>>
>>>   Base address is ~2365 MB, size is ~162 MB
>>>
>>> - Unbootable system:
>>>
>>>   PeiInstallPeiMemory MemoryBegin 0x9C9000, MemoryLength 0x9D637000
>>>
>>>   Base address is ~9 MB, size is ~2518 MB
>>>
>>> The numbers in the second (unbootable) case look very unusual to me. The
>>> permanent PEI RAM is usually tens or (maybe) hundreds of megabytes in
>>> size, and tends to start much higher (usually as high as possible under
>>> 4GB, on x86 anyway).
>>>
>>>
>>> Consult the following sections in the PI spec (v1.6), volume 3:
>>>
>>> - 4.3 Example HOB Producer Phase Memory Map and Usage
>>> - 5.3 PHIT HOB
>>>
>>> The CoreInitializeMemoryServices() function searches the HOB list for a
>>> tested system memory "Resource Descriptor HOB that contains PHIT range
>>> EfiFreeMemoryBottom..EfiFreeMemoryTop". (Quoted a comment from the code.)
>>>
>>> Basically, the function locates the system RAM HOB that contains the
>>> free permanent PEI RAM.
>>>
>>> If the search fails, then we trip an ASSERT(). This does not happen in
>>> your case, the search succeeds.
>>>
>>> If the search succeeds, then the DXE core will try to initialize itself
>>> in one of three locations in the RAM area defined by that HOB. In
>>> descending preference order: above the permanent PEI RAM, within the
>>> free permanent PEI RAM, and below the permanent PEI RAM.
>>>
>>> There is also a fallback (a fourth option) when even the third one from
>>> before proves too small -- the function will then search again for a
>>> memory descriptor HOB, top-down, avoiding the one HOB that it found
>>> earlier to contain the permanent PEI RAM (because, all three options for
>>> that have already failed, see above).
>>>
>>> As the result of this search, your broken system finishes with:
>>>
>>> BaseAddress - 0x0 Length - 0x0 MinimalMemorySizeNeeded - 0x98E47000
>>>
>>> "MinimalMemorySizeNeeded" includes the previous measurements from
>>> MemoryTypeInformation, and the concrete value is very strange -- it
>>> seems to imply that you need ~2446 MB for initializing the DXE core.
>>> It's not surprising that the function cannot fit that anywhere, in
>>> either of the four options described above.
>>>
>>> If your system has more (high) RAM to spare, try to install a resource
>>> descriptor HOB for it. Then the fourth option might succeed.
>>>
>>> Honestly though, those permanent PEI RAM values (base address at ~9 MB,
>>> size ~2518 MB) look super fishy to me in the first place. Something must
>>> be wrong in the PEI phase with the calculation of those parameters.
>>> Possibly, the memory resource descriptor HOBs could be wrong too.
>>>
>>>
>>> ... Considering commit 3a05b13106d1 ("MdeModulePkg DxeCore: Take the
>>> range in resource HOB for PHIT as higher priority", 2015-09-18), it
>>> writes,
>>>
>>> "Also let the minimal memory size needed include the total memory bin
>>> size needed to make sure memory bin could be allocated successfully."
>>>
>>> This is the reason "MinimalMemorySizeNeeded" includes
>>> MemoryTypeInformation. Normally, MemoryTypeInformation tracks long-term
>>> maximums that are necessary for booting an OS without memory map
>>> fragmentation (including S4 resume). However, if you have a UEFI
>>> application that allocates huge amounts of memory, and then *doesn't*
>>> boot an OS, then it could invalidate MemoryTypeInformation. Because, the
>>> maximums that MemoryTypeInformation represents, no longer reflect
>>> requirements for booting an OS. In that case, the
>>> "MinimalMemorySizeNeeded" assumption (from commit 3a05b13106d1), for
>>> initializing the DXE core, could be invalid too.
>>>
>>> Thanks
>>> Laszlo
>>>
>>>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to