On 07/07/16 10:29, Fan, Jeff wrote:
> Laszlo,
> 
> Actually, CpuMpPei has no knowledge to know which memory range < 1MB is 
> available or not. That's why we cannot assume one hardcode address < 1MB for 
> borrowing.

I agree that this makes sense.

> 
> Platform has such knowledge and need one mechanism to tell CpuMpPei.

I agree 100%.

> We choose Memory Resource HOB here.

I believe this is not a perfect choice.

The information that the memory resource HOB conveys can be unwittingly
mis-used by other PEIMs. The information from the platform is good, but
it is not targeted / restricted well enough.

As I wrote in my other email, the restriction should be

  available for temporary use, but only if the original contents are
  restored at End-of-PEI.

CpuMpPei certainly complies with this restriction, but other PEIMs won't
realize it just from looking at a memory resource HOB.

So, as a workaround, I have to install a memory allocation HOB as well,
in OVMF's Platform PEIM. CpuMpPei will ignore the memalloc HOB (and take
care to restore the borrowed area at End-of-PEI). And any other PEIMs
should steer clear of the area because of the memalloc HOB.

Thanks
Laszlo

> 
> Thanks!
> Jeff
> 
> -----Original Message-----
> From: Laszlo Ersek [mailto:[email protected]] 
> Sent: Thursday, July 07, 2016 3:04 PM
> To: Fan, Jeff; Kinney, Michael D; Justen, Jordan L
> Cc: Paolo Bonzini; edk2-devel-01
> Subject: Re: [edk2] multiprocessing in PEI?
> 
> On 07/07/16 04:52, Fan, Jeff wrote:
>> Laszlo,
>>
>> On PEI phase, whatever  it is normal boot or S3 boot, PEI memory allocation 
>> services should not allocate memory < 1 MB address.
>>
>> If any other PEIM module wants to allocate memory < 1 MB address, it has to 
>> scan Memory resource HOB to find the available memory range and build memory 
>> allocation HOB like what CpuMpPei did.
>>
>> If this method is OK, CpuMpPei or other module are required to check 
>> existing both memory resource HOB and memory allocation HOB.
>>
>> If we just borrow one piece of range < 1 MB address around each of 
>> INIT-SIPI-SIPI to AP, we still need to get the available memory address.
>>
>> So, platform still needs to build memory resource HOB < 1MB on S3 boot like 
>> normal boot.  I think this update on platform  should be simpler than new 
>> pair of PCDs introducing. 
>>
>> What do you think of it?
> 
> * First, at this point I'm now thinking that "borrowing" and "allocating" are 
> actually separate things:
> 
> (a) For allocating memory under 1MB, scanning both the memory resource
>     HOBs and the memory allocation HOBs would be necessary, yes.
> 
> (b) However, in case the memory under 1MB is only borrowed (and the
>     backup buffer is allocated with the PEI serivces), the HOB scanning
>     should not be necessary at all (for any kinds of HOBs). CpuMpPei
>     is intimately tied to Intel real mode anyway (hence the < 1MB
>     requirement in the first place), so why can't CpuMpPei just borrow
>     a few pages at a fixed low address (under 640KB)? That memory is
>     required to exist on platforms where CpuMpPei is supposed to run,
>     isn't it?
> 
> * Second, the reason I'm reluctant to produce the same set of memory resource 
> and alloc HOBs  on the S3 resume path as on the normal boot path is the 
> following:
> 
> In my opinion, that would be misleading. Other PEIMs that execute (a) -- that 
> is, allocation and not borrowing -- might think that any memory that is 
> covered by a resource descriptor HOB, but not covered by any allocation HOBs, 
> is "free memory". While in fact that memory could well be used by the OS.
> 
> In other words, the reason why we don't produce any of these HOBs is exactly 
> to communicate that there is zero free memory *for allocation*, outside of 
> the PEI memory services. Any PEIM that wants to allocate (as opposed to 
> borrow) *should* fail, unless it uses the PEI memory services. And if a PEIM 
> wants to *borrow* (as opposed to allocate), then it shouldn't need to scan 
> HOBs.
> 
> * If there is a requirement in the PI spec that the HOBs be produced on the 
> S3 path as well, then I guess we'll have to comply with that. With my current 
> understanding though, I feel that producing the same set of HOBs would give 
> other PEIMs an incorrect view of memory ownership. The result of
> 
>   all system memory HOBs minus all allocation HOBs
> 
> would appear as
> 
>   memory that is free for further allocation
> 
> which would be false.
> 
> * So my proposal would be to allow the platform to advertize a range for 
> CpuMpPei to borrow from, with two new PCDs.
> 
> If you are strongly opposed to that, then I guess I can write a patch for 
> OvmfPkg that, on the S3 resume path, produces one (1) system memory HOB as an 
> *exception*, specifically to allow CpuMpPei's scanning to succeed (with an 
> appropriate code comment of course). I could also cover the entire area in 
> question with a memory allocation HOB as well, hoping that it would keep away 
> other PEIMs that look for "free memory", like in (a). Something like:
> 
>   //
>   // Allow CpuMpPei to borrow memory from this range for the AP startup
>   // code, but prevent other PEIMs from thinking the range is "free
>   // memory".
>   //
>   AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);
>   BuildMemoryAllocationHob (0, BASE_512KB + BASE_128KB,
>     EfiBootServicesData);
> 
> Actually, let me try that, and see where I land.
> 
> Thanks,
> Laszlo
> 
> 
>> -----Original Message-----
>> From: Laszlo Ersek [mailto:[email protected]]
>> Sent: Thursday, July 07, 2016 2:52 AM
>> To: Fan, Jeff; Kinney, Michael D; Justen, Jordan L
>> Cc: Paolo Bonzini; edk2-devel-01
>> Subject: Re: [edk2] multiprocessing in PEI?
>>
>> On 07/06/16 19:08, Laszlo Ersek wrote:
>>> Hi Jeff,
>>>
>>> On 07/05/16 15:50, Fan, Jeff wrote:
>>>> When CPU MP PPI installed, CPU MP PPI Services will be fully usable.
>>>
>>> I included CpuMpPei in OVMF, and it works fine on the normal boot path.
>>> (I haven't done anything special with it thus far, just built it into 
>>> the firmware, and it starts up fine.)
>>>
>>> However, on the S3 resume path, it runs into an assertion failure: 
>>> the
>>> GetWakeupBuffer() function fails. That is actually expected, because 
>>> at that point the runtime OS being resumed owns all memory under 1MB.
>>>
>>> On the S3 resume path, OVMF does install a tiny bit of permanent PEI
>>> RAM: 32 KB in size (PcdS3AcpiReservedMemorySize), starting at 8288 KB 
>>> (PcdS3AcpiReservedMemoryBase). On the normal boot path, we reserve 
>>> this area as AcpiNVS type memory, so that the runtime OS stays out of it.
>>>
>>> Is CpuMpPei meant to be used on the S3 resume path in general?
>>
>> It looks like CpuMpPei expects memory resource descriptor HOBs to exist on 
>> the S3 resume path as well. Then it seems to lay the wakeup buffer over 
>> OS-owned memory under 1MB. But, it saves the original memory contents into a 
>> backup buffer allocated from permanent PEI RAM. And, at end-of-PEI, the 
>> memory contents are restored.
>>
>> OVMF does not produce memory / IO / MMIO resource descriptors on the S3 
>> resume path. The assumption is that no PEIM will directly look for any such 
>> HOBs on the S3 path, only use the permament PEI RAM for memory allocation. 
>> Does this conflict with the PI spec?
>>
>> I wonder if GetWakeupBuffer()'s scanning of EFI_RESOURCE_SYSTEM_MEMORY 
>> descriptor HOBs is a good idea. When it finds a location that is suitable as 
>> a wakeup buffer, it "claims" that area by building a memory allocation HOB 
>> that covers the area. I think that's fine; however, the scanning itself does 
>> not consider any other memory allocation HOBs that may have been carved out 
>> of system memory by other PEIMs, earlier.
>>
>> I wonder if platforms would be better served by a (base, size) pair of PCDs. 
>> The platform could set these PCDs, and make sure that both the OS and other 
>> firmware modules (PEIMs and DXE drivers) stay out of this area. (For 
>> example, if S3 is not supported or enabled on the platform, then the 
>> platform could allocate this area as Boot Services Data.
>> Otherwise, it would be AcpiNVS.) CpuMpPei could then remove the 
>> resource HOB scanning, and it would only need to validate if (a) the 
>> size PCD was big enough to contain the wakeup buffer, and (b) the base 
>> PCD was low enough to keep the wakeup buffer under 1MB, (c) any 
>> necessary alignments. Basically, ask the platform to preallocate the 
>> wakeup buffer. (The minimal suitable size can be found statically, by 
>> trial and
>> error.) The backup buffer (in permanent PEI RAM) could also be dropped, 
>> decreasing footprint.
>>
>> What do you think?
>>
>> Thanks
>> Laszlo
>>
> 

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

Reply via email to