On 10/30/19 10:52, Ray Ni wrote:
> MpInitLib sets X2ApicEnable in two places.
> 1. CollectProcessorCount()
>    This function is called when MpInitLibInitialize() hasn't been
>    called before.
>    It sets X2ApicEnable and later in the same function it configures
>    all CPUs to operate in X2 APIC mode.
> 2. MpInitLibInitialize()
>    The X2ApicEnable setting happens when this function is called in
>    second time. But after that setting, no code consumes that flag.
> 
> With the above analysis and with the purpose of simplifying the code,
> the X2ApicEnable in #1 is changed to local variable and the #2 can be
> changed to remove the setting of X2ApicEnable.
> 
> Signed-off-by: Ray Ni <ray...@intel.com>
> Cc: Eric Dong <eric.d...@intel.com>
> Cc: Laszlo Ersek <ler...@redhat.com>
> ---
>  UefiCpuPkg/Library/MpInitLib/MpLib.c | 14 ++++++--------
>  UefiCpuPkg/Library/MpInitLib/MpLib.h |  1 -
>  2 files changed, 6 insertions(+), 9 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c 
> b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> index 8f62a8d965..49be5d5385 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
> @@ -459,12 +459,12 @@ CollectProcessorCount (
>  {
>    UINTN                  Index;
>    CPU_INFO_IN_HOB        *CpuInfoInHob;
> +  BOOLEAN                X2Apic;
>
>    //
>    // Send 1st broadcast IPI to APs to wakeup APs
>    //
> -  CpuMpData->InitFlag     = ApInitConfig;
> -  CpuMpData->X2ApicEnable = FALSE;
> +  CpuMpData->InitFlag = ApInitConfig;
>    WakeUpAP (CpuMpData, TRUE, 0, NULL, NULL, TRUE);
>    CpuMpData->InitFlag = ApInitDone;
>    ASSERT (CpuMpData->CpuCount <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber));
> @@ -481,22 +481,23 @@ CollectProcessorCount (
>    //  1. Number of CPU is greater than 255; or
>    //  2. There are any logical processors reporting an Initial APIC ID of 
> 255 or greater.
>    //
> +  X2Apic = FALSE;
>    if (CpuMpData->CpuCount > 255) {
>      //
>      // If there are more than 255 processor found, force to enable X2APIC
>      //
> -    CpuMpData->X2ApicEnable = TRUE;
> +    X2Apic = TRUE;
>    } else {
>      CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
>      for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
>        if (CpuInfoInHob[Index].InitialApicId >= 0xFF) {
> -        CpuMpData->X2ApicEnable = TRUE;
> +        X2Apic = TRUE;
>          break;
>        }
>      }
>    }
>
> -  if (CpuMpData->X2ApicEnable) {
> +  if (X2Apic) {
>      DEBUG ((DEBUG_INFO, "Force x2APIC mode!\n"));
>      //
>      // Wakeup all APs to enable x2APIC mode
> @@ -1780,9 +1781,6 @@ MpInitLibInitialize (
>      CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
>      for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
>        InitializeSpinLock(&CpuMpData->CpuData[Index].ApLock);
> -      if (CpuInfoInHob[Index].InitialApicId >= 255 || Index > 254) {
> -        CpuMpData->X2ApicEnable = TRUE;
> -      }
>        CpuMpData->CpuData[Index].CpuHealthy = (CpuInfoInHob[Index].Health == 
> 0)? TRUE:FALSE;
>        CpuMpData->CpuData[Index].ApFunction = 0;
>        CopyMem (&CpuMpData->CpuData[Index].VolatileRegisters, 
> &VolatileRegisters, sizeof (CPU_VOLATILE_REGISTERS));
> diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h 
> b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> index 107872b367..8fa07b12c5 100644
> --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
> +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
> @@ -227,7 +227,6 @@ struct _CPU_MP_DATA {
>    UINTN                          **FailedCpuList;
>
>    AP_INIT_STATE                  InitFlag;
> -  BOOLEAN                        X2ApicEnable;
>    BOOLEAN                        SwitchBspFlag;
>    UINTN                          NewBspNumber;
>    CPU_EXCHANGE_ROLE_INFO         BSPInfo;
> 

Assuming the previous patch does the right thing in the series (and I
think that's plausible), this patch looks correct as well.

For a second I got concerned as to whether the field removal from
CPU_MP_DATA would require updates to the offset constants in the
assembly code. However, assembly code seems to know offsets into
MP_CPU_EXCHANGE_INFO only, and doesn't care about CPU_MP_DATA. So the
patch is OK I think.

Reviewed-by: Laszlo Ersek <ler...@redhat.com>

Thanks
Laszlo


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#49742): https://edk2.groups.io/g/devel/message/49742
Mute This Topic: https://groups.io/mt/39769104/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to