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