]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update MpServicesOnFrameworkMpServicesThunk to consume Local APIC library.
authorrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 23 Aug 2010 06:53:10 +0000 (06:53 +0000)
committerrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 23 Aug 2010 06:53:10 +0000 (06:53 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10815 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/MpServicesOnFrameworkMpServicesThunk.c
EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/MpServicesOnFrameworkMpServicesThunk.h
EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/MpServicesOnFrameworkMpServicesThunk.inf

index c423ec91d6bc41e512b4b592f09e9e5a9a74c115..a2b3e1ab5f608c62495b8077244388e2f3e94dd1 100644 (file)
@@ -1119,70 +1119,6 @@ GetNextWaitingProcessorNumber (
   return EFI_NOT_FOUND;\r
 }\r
 \r
-/**\r
-  Programs Local APIC registers for virtual wire mode.\r
-\r
-  This function programs Local APIC registers for virtual wire mode.\r
-\r
-  @param  Bsp  Indicates whether the programmed processor is going to be BSP\r
-\r
-**/\r
-VOID\r
-ProgramVirtualWireMode (\r
-  BOOLEAN                       Bsp\r
-  )\r
-{\r
-  UINTN                 ApicBase;\r
-  UINT32                Value;\r
-\r
-  ApicBase = (UINTN)AsmMsrBitFieldRead64 (MSR_IA32_APIC_BASE, 12, 35) << 12;\r
-\r
-  //\r
-  // Program the Spurious Vector entry\r
-  // Set bit 8 (APIC Software Enable/Disable) to enable local APIC,\r
-  // and set Spurious Vector as 0x0F.\r
-  //\r
-  MmioBitFieldWrite32 (ApicBase + APIC_REGISTER_SPURIOUS_VECTOR_OFFSET, 0, 9, 0x10F);\r
-\r
-  //\r
-  // Program the LINT0 vector entry as ExtInt\r
-  // Set bits 8..10 to 7 as ExtInt Delivery Mode,\r
-  // and clear bits for Delivery Status, Interrupt Input Pin Polarity, Remote IRR,\r
-  // Trigger Mode, and Mask\r
-  //\r
-  if (!Bsp) {\r
-    DisableInterrupts ();\r
-  }\r
-  Value = MmioRead32 (ApicBase + APIC_REGISTER_LINT0_VECTOR_OFFSET);\r
-  Value = BitFieldWrite32 (Value, 8, 10, 7);\r
-  Value = BitFieldWrite32 (Value, 12, 16, 0);\r
-  if (!Bsp) {\r
-    //\r
-    // For APs, LINT0 is masked\r
-    //\r
-    Value = BitFieldWrite32 (Value, 16, 16, 1);\r
-  }\r
-  MmioWrite32 (ApicBase + APIC_REGISTER_LINT0_VECTOR_OFFSET, Value);\r
-\r
-  //\r
-  // Program the LINT1 vector entry as NMI\r
-  // Set bits 8..10 to 4 as NMI Delivery Mode,\r
-  // and clear bits for Delivery Status, Interrupt Input Pin Polarity, Remote IRR,\r
-  // Trigger Mode.\r
-  // For BSP clear Mask bit, and for AP set mask bit.\r
-  //\r
-  Value = MmioRead32 (ApicBase + APIC_REGISTER_LINT1_VECTOR_OFFSET);\r
-  Value = BitFieldWrite32 (Value, 8, 10, 4);\r
-  Value = BitFieldWrite32 (Value, 12, 16, 0);\r
-  if (!Bsp) {\r
-    //\r
-    // For APs, LINT1 is masked\r
-    //\r
-    Value = BitFieldWrite32 (Value, 16, 16, 1);\r
-  }\r
-  MmioWrite32 (ApicBase + APIC_REGISTER_LINT1_VECTOR_OFFSET, Value);\r
-}\r
-\r
 \r
 /**\r
   Wrapper function for all procedures assigned to AP.\r
@@ -1201,11 +1137,6 @@ ApProcWrapper (
   UINTN                 ProcessorNumber;\r
   CPU_DATA_BLOCK        *CpuData;\r
 \r
-  //\r
-  // Program virtual wire mode for AP, since it will be lost after AP wake up\r
-  //\r
-  ProgramVirtualWireMode (FALSE);\r
-\r
   //\r
   // Initialize Debug Agent to support source level debug on AP code.\r
   //\r
@@ -1248,71 +1179,6 @@ ApProcWrapper (
   ReleaseSpinLock (&CpuData->CpuDataLock);\r
 }\r
 \r
-/**\r
-  Sends INIT-SIPI-SIPI to AP.\r
-\r
-  This function sends INIT-SIPI-SIPI to AP, and assign procedure specified by ApFunction.\r
-\r
-  @param  ProcessorNumber The processor number of the specified AP.\r
-  @param  ApicID          The Local APIC ID of the specified AP.\r
-  @param  ApFunction      The procedure for AP to work on.\r
-\r
-**/\r
-VOID\r
-SendInitSipiSipi (\r
-  IN UINTN              ProcessorNumber,\r
-  IN UINT32             ApicID,\r
-  IN VOID               *ApFunction\r
-  )\r
-{\r
-  UINTN                 ApicBase;\r
-  UINT32                ICRLow;\r
-  UINT32                ICRHigh;\r
-\r
-  UINT32                VectorNumber;\r
-  UINT32                DeliveryMode;\r
-\r
-  ASSERT (ApicID < MAX_CPU_NUMBER);\r
-\r
-  mExchangeInfo->ApFunction = ApFunction;\r
-  mExchangeInfo->ProcessorNumber[ApicID] = (UINT32) ProcessorNumber;\r
-\r
-  ICRHigh = ApicID << 24;\r
-  ICRLow  = SPECIFY_CPU_MODE_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
-\r
-  VectorNumber = 0;\r
-  DeliveryMode = DELIVERY_MODE_INIT;\r
-  ICRLow      |= VectorNumber | (DeliveryMode << 8);\r
-\r
-  ApicBase = (UINTN)AsmMsrBitFieldRead64 (MSR_IA32_APIC_BASE, 12, 35) << 12;;\r
-\r
-  //\r
-  // Write Interrupt Command Registers to send INIT IPI.\r
-  //\r
-  MmioWrite32 (ApicBase + APIC_REGISTER_ICR_HIGH_OFFSET, ICRHigh);\r
-  MmioWrite32 (ApicBase + APIC_REGISTER_ICR_LOW_OFFSET, ICRLow);\r
-\r
-  MicroSecondDelay (10);\r
-\r
-  VectorNumber = (UINT32) RShiftU64 (mStartupVector, 12);\r
-  DeliveryMode = DELIVERY_MODE_SIPI;\r
-  ICRLow = SPECIFY_CPU_MODE_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
-\r
-  ICRLow |= VectorNumber | (DeliveryMode << 8);\r
-\r
-  //\r
-  // Write Interrupt Command Register to send first SIPI IPI.\r
-  //\r
-  MmioWrite32 (ApicBase + APIC_REGISTER_ICR_LOW_OFFSET, ICRLow);\r
-\r
-  MicroSecondDelay (200);\r
-\r
-  //\r
-  // Write Interrupt Command Register to send second SIPI IPI.\r
-  //\r
-  MmioWrite32 (ApicBase + APIC_REGISTER_ICR_LOW_OFFSET, ICRLow);\r
-}\r
-\r
 /**\r
   Function to wake up a specified AP and assign procedure to it.\r
 \r
@@ -1349,10 +1215,11 @@ WakeUpAp (
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  mExchangeInfo->ApFunction = (VOID *) (UINTN) ApProcWrapper;\r
+  mExchangeInfo->ProcessorNumber[ProcessorInfoBuffer.ProcessorId] = (UINT32) ProcessorNumber;\r
   SendInitSipiSipi (\r
-    ProcessorNumber,\r
     (UINT32) ProcessorInfoBuffer.ProcessorId,\r
-    (VOID *) (UINTN) ApProcWrapper\r
+    (UINT32) (UINTN) mStartupVector\r
     );\r
 }\r
 \r
@@ -1381,10 +1248,11 @@ ResetProcessorToIdleState (
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  mExchangeInfo->ApFunction = NULL;\r
+  mExchangeInfo->ProcessorNumber[ProcessorInfoBuffer.ProcessorId] = (UINT32) ProcessorNumber;\r
   SendInitSipiSipi (\r
-    ProcessorNumber,\r
     (UINT32) ProcessorInfoBuffer.ProcessorId,\r
-    NULL\r
+    (UINT32) (UINTN) mStartupVector\r
     );\r
 \r
   CpuData = &mMPSystemData.CpuData[ProcessorNumber];\r
index 28be5b17d38494657bff24608c541839c5ce9fb3..7f9d107dfad91e0ecb2ed5b9f7abda0a4cb9eda8 100644 (file)
@@ -32,6 +32,7 @@ Module Name:
 #include <Library/IoLib.h>\r
 #include <Library/TimerLib.h>\r
 #include <Library/DebugAgentLib.h>\r
+#include <Library/LocalApicLib.h>\r
 \r
 #define AP_STACK_SIZE                         0x8000\r
 #define MAX_CPU_NUMBER                        256\r
index f583621c89eea4a1007f455b10ee36f94c50f480..3fb08bcb4425cdbde60f05fa6aae9268bee0fe52 100644 (file)
@@ -45,6 +45,7 @@
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
   IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+  UefiCpuPkg/UefiCpuPkg.dec\r
 \r
 [LibraryClasses]\r
   TimerLib\r
@@ -59,6 +60,7 @@
   BaseLib\r
   SynchronizationLib\r
   DebugAgentLib\r
+  LocalApicLib\r
 \r
 [Protocols]\r
   gEfiMpServiceProtocolGuid                   ## PRODUCES\r