On 03/08/19 15:13, Yao, Jiewen wrote:
> I guess the historic reason is that AP and BSP share same GDT before. As 
> such, the GDT need to be below 4G, to let AP switch from real mode to 
> protected mode.
> We don't get issue, because Runtime memory is in BIN, and most platform 
> allocates BIN under 4G.
> 
> Some thought:
> 1) I am think we not sure if AP is using same GDT as BSP today. If yes, we 
> need GDT under 4G, by using MaxAddress. If no, there should be no restriction 
> for BSP GDT. The (UINT32) case should be removed for BSP. But we still AP GDT 
> below 4G, to support wake from INIT-SIPI-SIPI.
> 2) I am not sure why we need runtime memory. Do we need touch GDT at UEFI 
> runtime?

I could be confusing things *very badly*, but I vaguely remember that
APs could be woken up spuriously later, and they must be able to execute
code "enough" to go back to sleep.

The following commits look relevant:

- 7615702169b8 ("UefiCpuPkg/MpInitLib: Add AsmRelocateApLoop() assembly
code", 2016-08-17)

- 4d3314f69488 ("UefiCpuPkg/MpInitLib: Place APs in safe loop before
hand-off to OS", 2016-08-17)

- bf2786dc7900 ("UefiCpuPkg/DxeMpLib: Allocate new safe stack < 4GB",
2016-11-28)

Laszlo

> 
> 
> 
> Thank you
> Yao Jiewen
> 
> 
>> -----Original Message-----
>> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
>> Laszlo Ersek
>> Sent: Friday, March 8, 2019 12:00 AM
>> To: Andrew Fish <af...@apple.com>; edk2-devel <edk2-devel@lists.01.org>
>> Subject: Re: [edk2] UefiCpuPkg CpuDxe GDT init question?
>>
>> Hi Andrew,
>>
>> On 03/07/19 23:37, Andrew Fish via edk2-devel wrote:
>>> I'm trying to understand why gdtPtr.Base is casting to (UINT32)?
>>> 1) gdtPtr.Base is a a UINTN
>>> 2) It is legal for AllocateRuntimePool() to return an address > 4GB
>>>
>>> It seems like the code should just cast to (UINTN)?
>>>
>>>
>>>
>> https://github.com/tianocore/edk2/blob/master/UefiCpuPkg/CpuDxe/CpuG
>> dt.c#L151
>>
>> I think you are right.
>>
>> I'm missing the background on this too. I tried to see if any
>> justification was given in a git commit message, but according to "git
>> blame", this code dates back to the original addition of the driver,
>> namely commit a47463f28382 ("Add CPU DXE driver for IA32 & X64
>> processor
>> architectures.", 2009-05-27). The commit message is unhelpful (for 3119
>> lines added).
>>
>> Thanks
>> Laszlo
>>
>>>
>>>
>>>
>>> VOID
>>> InitGlobalDescriptorTable (
>>>   VOID
>>>   )
>>> {
>>>   GDT_ENTRIES *gdt;
>>>   IA32_DESCRIPTOR gdtPtr;
>>>
>>>   //
>>>   // Allocate Runtime Data for the GDT
>>>   //
>>>   gdt = AllocateRuntimePool (sizeof (GdtTemplate) + 8);
>>>   ASSERT (gdt != NULL);
>>>   gdt = ALIGN_POINTER (gdt, 8);
>>>
>>>   //
>>>   // Initialize all GDT entries
>>>   //
>>>   CopyMem (gdt, &GdtTemplate, sizeof (GdtTemplate));
>>>
>>>   //
>>>   // Write GDT register
>>>   //
>>>   gdtPtr.Base = (UINT32)(UINTN)(VOID*) gdt;
>>>   gdtPtr.Limit = (UINT16) (sizeof (GdtTemplate) - 1);
>>>   AsmWriteGdtr (&gdtPtr);
>>>
>>> Thanks,
>>>
>>> Andrew Fish
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.01.org
>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>
>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org
>> https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to