audk/UefiCpuPkg/Library/MpInitLib
Hao A Wu 18fcb37598 UefiCpuPkg/MpInitLib: Fix possible uninitialized 'InitFlag' field
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2474

Previous commit d786a17232:
UefiCpuPkg/MpInitLib: Reduce the size when loading microcode patches

Removed the below assignments for the 'InitFlag' field of CPU_MP_DATA
structure in function MpInitLibInitialize() when APs are waken up to do
some initialize sync:

CpuMpData->InitFlag  = ApInitReconfig;
...
CpuMpData->InitFlag = ApInitDone;

The above commit mistakenly assumed the 'InitFlag' field will have a value
of 'ApInitDone' when the APs have been successfully waken up before. And
since there is no explicit comparision for the 'InitFlag' field with the
'ApInitReconfig' value. The commit removed those assignments.

However, under some cases (e.g. when variable OldCpuMpData is not NULL,
which means function CollectProcessorCount() will not be called), removing
the above assignments will left the 'InitFlag' field being uninitialized
with a value of 0, which is a invalid value for the type of 'InitFlag'
(AP_INIT_STATE).

It may potentially cause the WakeUpAP() function to run some unnecessary
codes when the APs have been successfully waken up before:

  if (CpuMpData->WakeUpByInitSipiSipi ||
      CpuMpData->InitFlag   != ApInitDone) {
    ResetVectorRequired = TRUE;
    AllocateResetVector (CpuMpData);
    FillExchangeInfoData (CpuMpData);
    SaveLocalApicTimerSetting (CpuMpData);
  }

This commit will address the above-mentioned issue.

Test done:
* OS boot on a real platform with multi processors

Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Signed-off-by: Hao A Wu <hao.a.wu@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
2020-01-19 04:10:43 +00:00
..
Ia32 UefiCpuPkg/MpInitLib: increase NumApsExecuting only for ApInitConfig 2019-06-10 10:53:42 +08:00
X64 UefiCpuPkg/MpInitLib: Enable 5-level paging for AP when BSP's enabled 2019-08-09 08:52:08 +08:00
DxeMpInitLib.inf UefiCpuPkg: Shadow microcode patch according to FIT microcode entry. 2020-01-10 06:20:42 +00:00
DxeMpInitLib.uni UefiCpuPkg: Replace BSD License with BSD+Patent License 2019-04-09 10:58:28 -07:00
DxeMpLib.c UefiCpuPkg/MpInitLib: Add MpInitLibStartupAllCPUs API. 2019-07-29 09:25:20 +08:00
Microcode.c UefiCpuPkg: Shadow microcode patch according to FIT microcode entry. 2020-01-10 06:20:42 +00:00
MpLib.c UefiCpuPkg/MpInitLib: Fix possible uninitialized 'InitFlag' field 2020-01-19 04:10:43 +00:00
MpLib.h UefiCpuPkg: Shadow microcode patch according to FIT microcode entry. 2020-01-10 06:20:42 +00:00
PeiMpInitLib.inf UefiCpuPkg: Shadow microcode patch according to FIT microcode entry. 2020-01-10 06:20:42 +00:00
PeiMpInitLib.uni UefiCpuPkg: Replace BSD License with BSD+Patent License 2019-04-09 10:58:28 -07:00
PeiMpLib.c UefiCpuPkg/MpInitLib: Produce EDKII microcode patch HOB 2020-01-02 03:10:36 +00:00