Date
1 - 4 of 4
[PATCH v1] UefiCpuPkg: Cpu feature data stored in memory may be migrated
Jason Lou
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3634
The memory allocated through "PeiAllocatePool" is located in HOB, and in DXE phase, the HOB will be migrated to a different location. After the migration, the data stored in the HOB stays the same, but the address of pointer to the memory(such as the pointers in ACPI_CPU_DATA structure) changes, which may cause "PiSmmCpuDxeSmm" driver can't find the memory(the pointers in ACPI_CPU_DATA structure) that allocated in "PeiRegisterCpuFeaturesLib", so use "PeiAllocatePages" to allocate memory instead. Signed-off-by: Jason Lou <yun.lou@...> Cc: Ray Ni <ray.ni@...> Cc: Eric Dong <eric.dong@...> Cc: Laszlo Ersek <lersek@...> Cc: Rahul Kumar <rahul1.kumar@...> --- UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c | 6 +++-= -- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitializ= e.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c index 6e2ab79518..e9eba64914 100644 --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c @@ -153,7 +153,7 @@ CpuInitDataInitialize ( CpuFeaturesData->AcpiCpuData=3D AcpiCpuData;=0D =0D CpuStatus =3D &AcpiCpuData->CpuFeatureInitData.CpuStatus;=0D - Location =3D AllocateZeroPool (sizeof (EFI_CPU_PHYSICAL_LOCATION) * Numb= erOfCpus);=0D + Location =3D AllocatePages (EFI_SIZE_TO_PAGES (sizeof (EFI_CPU_PHYSICAL_= LOCATION) * NumberOfCpus));=0D ASSERT (Location !=3D NULL);=0D AcpiCpuData->CpuFeatureInitData.ApLocation =3D (EFI_PHYSICAL_ADDRESS)(UI= NTN)Location;=0D =0D @@ -205,11 +205,11 @@ CpuInitDataInitialize ( //=0D // Collect valid core count in each package because not all cores are va= lid.=0D //=0D - ThreadCountPerPackage =3D AllocateZeroPool (sizeof (UINT32) * CpuStatus-= PackageCount);=0D+ ThreadCountPerPackage =3D AllocatePages (EFI_SIZE_TO_PAGES (sizeof (UINT= 32) * CpuStatus->PackageCount));=0D ASSERT (ThreadCountPerPackage !=3D NULL);=0D CpuStatus->ThreadCountPerPackage =3D (EFI_PHYSICAL_ADDRESS)(UINTN)Thread= CountPerPackage;=0D =0D - ThreadCountPerCore =3D AllocateZeroPool (sizeof (UINT8) * CpuStatus->Pac= kageCount * CpuStatus->MaxCoreCount);=0D + ThreadCountPerCore =3D AllocatePages (EFI_SIZE_TO_PAGES (sizeof (UINT8) = * CpuStatus->PackageCount * CpuStatus->MaxCoreCount));=0D ASSERT (ThreadCountPerCore !=3D NULL);=0D CpuStatus->ThreadCountPerCore =3D (EFI_PHYSICAL_ADDRESS)(UINTN)ThreadCou= ntPerCore;=0D =0D --=20 2.28.0.windows.1
|
|
Ni, Ray
Thanks for providing a very clear commit message.
toggle quoted messageShow quoted text
Reviewed-by: Ray Ni <ray.ni@...>
-----Original Message-----
|
|
Dong, Eric
Hi,
toggle quoted messageShow quoted text
Can you help to explain more why PeiAllocatePages does not have the problem while PeiAllocatePool has? Thanks, Eric
-----Original Message-----
From: Lou, Yun <yun.lou@...> Sent: Wednesday, September 29, 2021 7:53 PM To: devel@edk2.groups.io Cc: Lou, Yun <yun.lou@...>; Ni, Ray <ray.ni@...>; Dong, Eric <eric.dong@...>; Laszlo Ersek <lersek@...>; Kumar, Rahul1 <rahul1.kumar@...> Subject: [PATCH v1] UefiCpuPkg: Cpu feature data stored in memory may be migrated REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3634 The memory allocated through "PeiAllocatePool" is located in HOB, and in DXE phase, the HOB will be migrated to a different location. After the migration, the data stored in the HOB stays the same, but the address of pointer to the memory(such as the pointers in ACPI_CPU_DATA structure) changes, which may cause "PiSmmCpuDxeSmm" driver can't find the memory(the pointers in ACPI_CPU_DATA structure) that allocated in "PeiRegisterCpuFeaturesLib", so use "PeiAllocatePages" to allocate memory instead. Signed-off-by: Jason Lou <yun.lou@...> Cc: Ray Ni <ray.ni@...> Cc: Eric Dong <eric.dong@...> Cc: Laszlo Ersek <lersek@...> Cc: Rahul Kumar <rahul1.kumar@...> --- UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c index 6e2ab79518..e9eba64914 100644 --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c @@ -153,7 +153,7 @@ CpuInitDataInitialize ( CpuFeaturesData->AcpiCpuData= AcpiCpuData; CpuStatus = &AcpiCpuData->CpuFeatureInitData.CpuStatus; - Location = AllocateZeroPool (sizeof (EFI_CPU_PHYSICAL_LOCATION) * NumberOfCpus); + Location = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (EFI_CPU_PHYSICAL_LOCATION) * NumberOfCpus)); ASSERT (Location != NULL); AcpiCpuData->CpuFeatureInitData.ApLocation = (EFI_PHYSICAL_ADDRESS)(UINTN)Location; @@ -205,11 +205,11 @@ CpuInitDataInitialize ( // // Collect valid core count in each package because not all cores are valid. // - ThreadCountPerPackage = AllocateZeroPool (sizeof (UINT32) * CpuStatus->PackageCount); + ThreadCountPerPackage = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (UINT32) * CpuStatus->PackageCount)); ASSERT (ThreadCountPerPackage != NULL); CpuStatus->ThreadCountPerPackage = (EFI_PHYSICAL_ADDRESS)(UINTN)ThreadCountPerPackage; - ThreadCountPerCore = AllocateZeroPool (sizeof (UINT8) * CpuStatus->PackageCount * CpuStatus->MaxCoreCount); + ThreadCountPerCore = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (UINT8) * CpuStatus->PackageCount * CpuStatus->MaxCoreCount)); ASSERT (ThreadCountPerCore != NULL); CpuStatus->ThreadCountPerCore = (EFI_PHYSICAL_ADDRESS)(UINTN)ThreadCountPerCore; -- 2.28.0.windows.1
|
|
Ni, Ray
Eric,
toggle quoted messageShow quoted text
it's related to how pool/page memory is allocated in PEI. The PEI pool is allocated in HOB. HOB data is migrated by DXE core to a new location. The migration guarantees the HOB data is kept but doesn't fix up the ACPI_CPU_DATA pointer that points to the HOB data. The PEI page is allocated between Phit->FreeMemoryTop and Phit->MemoryTop. The location is not changed in DXE. Thanks, Ray
-----Original Message-----
|
|