UefiCpuPkg/DxeMpLib: Place APs to suitable state on Legacy OS boot

Currently, DxeMpLib only places APs into specified c-state in Exit Boot Service
callback function for UEFI OS boot. We need to put APs into specified c-state
for legacy OS boot also.

https://bugzilla.tianocore.org/show_bug.cgi?id=210

Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
index 03a8994..972c9ad 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf
@@ -58,6 +58,7 @@
 

 [Guids]

   gEfiEventExitBootServicesGuid                 ## CONSUMES  ## Event

+  gEfiEventLegacyBootGuid                       ## CONSUMES  ## Event

 

 [Pcd]

   gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber        ## CONSUMES

diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
index 8be0bb8..7f3900b 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
@@ -22,6 +22,7 @@
 CPU_MP_DATA      *mCpuMpData = NULL;

 EFI_EVENT        mCheckAllApsEvent = NULL;

 EFI_EVENT        mMpInitExitBootServicesEvent = NULL;

+EFI_EVENT        mLegacyBootEvent = NULL;

 volatile BOOLEAN mStopCheckAllApsStatus = TRUE;

 VOID             *mReservedApLoopFunc = NULL;

 

@@ -340,6 +341,7 @@
                   AP_CHECK_INTERVAL

                   );

   ASSERT_EFI_ERROR (Status);

+

   Status = gBS->CreateEvent (

                   EVT_SIGNAL_EXIT_BOOT_SERVICES,

                   TPL_CALLBACK,

@@ -348,6 +350,16 @@
                   &mMpInitExitBootServicesEvent

                   );

   ASSERT_EFI_ERROR (Status);

+

+  Status = gBS->CreateEventEx (

+                  EVT_NOTIFY_SIGNAL,

+                  TPL_CALLBACK,

+                  MpInitChangeApLoopCallback,

+                  NULL,

+                  &gEfiEventLegacyBootGuid,

+                  &mLegacyBootEvent

+                  );

+  ASSERT_EFI_ERROR (Status);

 }

 

 /**