-/**\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 Broadcast If TRUE, broadcase IPI to all APs; otherwise, send to specified AP.\r
- @param ApicID The Local APIC ID of the specified AP. If Broadcast is TRUE, it is ignored.\r
- @param ApFunction The procedure for AP to work on.\r
-\r
-**/\r
-VOID\r
-SendInitSipiSipi (\r
- IN BOOLEAN Broadcast,\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
- mExchangeInfo->ApFunction = ApFunction;\r
- mExchangeInfo->StackStart = mStackStartAddress;\r
-\r
- if (Broadcast) {\r
- ICRHigh = 0;\r
- ICRLow = BROADCAST_MODE_ALL_EXCLUDING_SELF_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
- } else {\r
- ICRHigh = ApicID << 24;\r
- ICRLow = SPECIFY_CPU_MODE_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
- }\r
-\r
- VectorNumber = 0;\r
- DeliveryMode = DELIVERY_MODE_INIT;\r
- ICRLow |= VectorNumber | (DeliveryMode << 8);\r
-\r
- ApicBase = 0xfee00000;\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
- if (Broadcast) {\r
- ICRLow = BROADCAST_MODE_ALL_EXCLUDING_SELF_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
- } else {\r
- ICRLow = SPECIFY_CPU_MODE_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
- }\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