--- /dev/null
+/** @file\r
+ When installed, the MP Services Protocol produces a collection of services \r
+ that are needed for MP management.\r
+\r
+ The MP Services Protocol provides a generalized way of performing following tasks:\r
+ - Retrieving information of multi-processor environment and MP-related status of\r
+ specific processors.\r
+ - Dispatching user-provided function to APs.\r
+ - Maintain MP-related processor status.\r
+\r
+ The MP Services Protocol must be produced on any system with more than one logical\r
+ processor.\r
+\r
+ The Protocol is available only during boot time.\r
+\r
+ MP Services Protocol is hardware-independent. Most of the logic of this protocol\r
+ is architecturally neutral. It abstracts the multi-processor environment and \r
+ status of processors, and provides interfaces to retrieve information, maintain, \r
+ and dispatch.\r
+\r
+ MP Services Protocol may be consumed by ACPI module. The ACPI module may use this \r
+ protocol to retrieve data that are needed for an MP platform and report them to OS.\r
+ MP Services Protocol may also be used to program and configure processors, such \r
+ as MTRR synchronization for memory space attributes setting in DXE Services.\r
+ MP Services Protocol may be used by non-CPU DXE drivers to speed up platform boot \r
+ by taking advantage of the processing capabilities of the APs, for example, using \r
+ APs to help test system memory in parallel with other device initialization.\r
+ Diagnostics applications may also use this protocol for multi-processor.\r
+\r
+ Copyright (c) 2006 - 2009, Intel Corporation.<BR>\r
+ All rights reserved. This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at<BR>\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+ @par Revision Reference:\r
+ This Protocol is defined in the UEFI Platform Initialization Specification 1.2, \r
+ Volume 2:Driver Execution Environment Core Interface.\r
+ \r
+**/\r
+\r
+#ifndef _MP_SERVICE_PROTOCOL_H_\r
+#define _MP_SERVICE_PROTOCOL_H_\r
+\r
+///\r
+/// Global ID for the EFI_MP_SERVICES_PROTOCOL\r
+///\r
+#define EFI_MP_SERVICES_PROTOCOL_GUID \\r
+ { \\r
+ 0x3fdda605, 0xa76e, 0x4f46, {0xad, 0x29, 0x12, 0xf4, 0x53, 0x1b, 0x3d, 0x08} \\r
+ }\r
+\r
+///\r
+/// Forward declaration for the EFI_MP_SERVICES_PROTOCOL\r
+///\r
+typedef struct _EFI_MP_SERVICES_PROTOCOL EFI_MP_SERVICES_PROTOCOL;\r
+\r
+///\r
+/// Terminator for a list of failed CPUs returned by StartAllAPs().\r
+///\r
+#define END_OF_CPU_LIST 0xffffffff\r
+\r
+///\r
+/// This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and \r
+/// indicates whether the processor is playing the role of BSP. If the bit is 1,\r
+/// then the processor is BSP. Otherwise, it is AP.\r
+///\r
+#define PROCESSOR_AS_BSP_BIT 0x00000001\r
+\r
+///\r
+/// This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and \r
+/// indicates whether the processor is enabled. If the bit is 1, then the \r
+/// processor is enabled. Otherwise, it is disabled.\r
+///\r
+#define PROCESSOR_ENABLED_BIT 0x00000002\r
+\r
+///\r
+/// This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and \r
+/// indicates whether the processor is healthy. If the bit is 1, then the \r
+/// processor is healthy. Otherwise, some fault has been detected for the processor.\r
+///\r
+#define PROCESSOR_HEALTH_STATUS_BIT 0x00000004\r
+\r
+///\r
+/// Structure that describes the pyhiscal location of a logical CPU.\r
+///\r
+typedef struct {\r
+ ///\r
+ /// Zero-based physical package number that identifies the cartridge of the processor.\r
+ ///\r
+ UINT32 Package;\r
+ ///\r
+ /// Zero-based physical core number within package of the processor.\r
+ ///\r
+ UINT32 Core;\r
+ ///\r
+ /// Zero-based logical thread number within core of the processor.\r
+ ///\r
+ UINT32 Thread;\r
+} EFI_CPU_PHYSICAL_LOCATION;\r
+\r
+///\r
+/// Structure that describes information about a logical CPU.\r
+///\r
+typedef struct {\r
+ ///\r
+ /// The unique processor ID determined by system hardware. For IA32 and X64, \r
+ /// the processor ID is the same as the Local APIC ID. Only the lower 8 bits \r
+ /// are used, and higher bits are reserved. For IPF, the lower 16 bits contains\r
+ /// id/eid, and higher bits are reserved.\r
+ ///\r
+ UINT64 ProcessorId; \r
+ ///\r
+ /// Flags indicating if the processor is BSP or AP, if the processor is enabled \r
+ /// or disabled, and if the processor is healthy. Bits 3..31 are reserved and \r
+ /// must be 0. \r
+ /// \r
+ /// <pre>\r
+ /// BSP ENABLED HEALTH Description\r
+ /// === ======= ====== ===================================================\r
+ /// 0 0 0 Unhealthy Disabled AP.\r
+ /// 0 0 1 Healthy Disabled AP.\r
+ /// 0 1 0 Unhealthy Enabled AP.\r
+ /// 0 1 1 Healthy Enabled AP.\r
+ /// 1 0 0 Invalid. The BSP can never be in the disabled state.\r
+ /// 1 0 1 Invalid. The BSP can never be in the disabled state.\r
+ /// 1 1 0 Unhealthy Enabled BSP.\r
+ /// 1 1 1 Healthy Enabled BSP\r
+ /// </pre>\r
+ ///\r
+ UINT32 StatusFlag;\r
+ ///\r
+ /// The physical location of the processor, including the physical package number\r
+ /// that identifies the cartridge, the physical core number within package, and \r
+ /// logical threadnumber within core.\r
+ ///\r
+ EFI_CPU_PHYSICAL_LOCATION Location;\r
+} EFI_PROCESSOR_INFORMATION;\r
+\r
+/**\r
+ Functions of this type are passed into StartUpAllAPs() and StartThisAP() to\r
+ execute a procedure on enabled APs. The context the AP should use durng \r
+ execution is specified by ProcedureArgument.\r
+ \r
+ @param[in] ProcedureArgument Pointer to the procedure's argument.\r
+\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *EFI_AP_PROCEDURE)(\r
+ IN VOID *ProcedureArgument\r
+ );\r
+\r
+/**\r
+ This service retrieves the number of logical processor in the platform\r
+ and the number of those logical processors that are enabled on this boot.\r
+ This service may only be called from the BSP.\r
+\r
+ This function is used to retrieve the following information:\r
+ - The number of logical processors that are present in the system\r
+ - The number of enabled logical processors in the system at the instant \r
+ this call is made.\r
+\r
+ Since MP Service Protocol provides services to enable and disable processors \r
+ dynamically, the number of enabled logical processors may vary during the \r
+ course of a boot session.\r
+ \r
+ If this service is called from an AP, then EFI_DEVICE_ERROR is returned. \r
+ If NumberOfProcessors or NumberOfEnabledProcessors is NULL, then \r
+ EFI_INVALID_PARAMETER is returned. Otherwise, the total number of processors \r
+ is returned in NumberOfProcessors, the number of currently enabled processor \r
+ is returned in NumberOfEnabledProcessors, and EFI_SUCCESS is returned.\r
+\r
+ @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[out] NumberOfProcessors Pointer to the total number of logical\r
+ processors in the system, including the BSP\r
+ and disabled APs.\r
+ @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical\r
+ processors that exist in system, including\r
+ the BSP.\r
+\r
+ @retval EFI_SUCCESS The number of logical processors and enabled \r
+ logical processors was retrieved.\r
+ @retval EFI_DEVICE_ERROR The calling processor is an AP.\r
+ @retval EFI_INVALID_PARAMETER NumberOfProcessors is NULL\r
+ @retval EFI_INVALID_PARAMETER NumberOfEnabledProcessors is NULL\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS)(\r
+ IN EFI_MP_SERVICES_PROTOCOL *This,\r
+ OUT UINTN *NumberOfProcessors,\r
+ OUT UINTN *NumberOfEnabledProcessors\r
+ );\r
+\r
+/**\r
+ Gets detailed MP-related information on the requested processor at the\r
+ instant this call is made. This service may only be called from the BSP.\r
+\r
+ This service retrieves detailed MP-related information about any processor \r
+ on the platform. Note the following:\r
+ - The processor information may change during the course of a boot session.\r
+ - The information presented here is entirely MP related.\r
+ \r
+ Information regarding the number of caches and their sizes, frequency of operation,\r
+ slot numbers is all considered platform-related information and is not provided \r
+ by this service.\r
+\r
+ @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[in] ProcessorNumber The handle number of processor.\r
+ @param[out] ProcessorInfoBuffer A pointer to the buffer where information for\r
+ the requested processor is deposited.\r
+\r
+ @retval EFI_SUCCESS Processor information was returned.\r
+ @retval EFI_DEVICE_ERROR The calling processor is an AP.\r
+ @retval EFI_INVALID_PARAMETER ProcessorInfoBuffer is NULL.\r
+ @retval EFI_NOT_FOUND The processor with the handle specified by\r
+ ProcessorNumber does not exist in the platform.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_MP_SERVICES_GET_PROCESSOR_INFO)(\r
+ IN EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN UINTN ProcessorNumber,\r
+ OUT EFI_PROCESSOR_INFORMATION *ProcessorContextBuffer\r
+ );\r
+\r
+/**\r
+ This service executes a caller provided function on all enabled APs. APs can \r
+ run either simultaneously or one at a time in sequence. This service supports \r
+ both blocking and non-blocking requests. The non-blocking requests use EFI \r
+ events so the BSP can detect when the APs have finished. This service may only \r
+ be called from the BSP.\r
+\r
+ This function is used to dispatch all the enabled APs to the function specified \r
+ by Procedure. If any enabled AP is busy, then EFI_NOT_READY is returned \r
+ immediately and Procedure is not started on any AP.\r
+\r
+ If SingleThread is TRUE, all the enabled APs execute the function specified by \r
+ Procedure one by one, in ascending order of processor handle number. Otherwise, \r
+ all the enabled APs execute the function specified by Procedure simultaneously.\r
+\r
+ If WaitEvent is NULL, execution is in blocking mode. The BSP waits until all \r
+ APs finish or TimeoutInMicroSecs expires. Otherwise, execution is in non-blocking \r
+ mode, and the BSP returns from this service without waiting for APs. If a \r
+ non-blocking mode is requested after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT \r
+ is signaled, then EFI_UNSUPPORTED must be returned.\r
+\r
+ If the timeout specified by TimeoutInMicroseconds expires before all APs return \r
+ from Procedure, then Procedure on the failed APs is terminated. All enabled APs \r
+ are always available for further calls to EFI_MP_SERVICES_PROTOCOL.StartupAllAPs()\r
+ and EFI_MP_SERVICES_PROTOCOL.StartupThisAP(). If FailedCpuList is not NULL, its \r
+ content points to the list of processor handle numbers in which Procedure was \r
+ terminated.\r
+\r
+ Note: It is the responsibility of the consumer of the EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() \r
+ to make sure that the nature of the code that is executed on the BSP and the \r
+ dispatched APs is well controlled. The MP Services Protocol does not guarantee \r
+ that the Procedure function is MP-safe. Hence, the tasks that can be run in \r
+ parallel are limited to certain independent tasks and well-controlled exclusive \r
+ code. EFI services and protocols may not be called by APs unless otherwise \r
+ specified.\r
+\r
+ In blocking execution mode, BSP waits until all APs finish or \r
+ TimeoutInMicroSeconds expires.\r
+\r
+ In non-blocking execution mode, BSP is freed to return to the caller and then \r
+ proceed to the next task without having to wait for APs. The following \r
+ sequence needs to occur in a non-blocking execution mode:\r
+\r
+ -# The caller that intends to use this MP Services Protocol in non-blocking \r
+ mode creates WaitEvent by calling the EFI CreateEvent() service. The caller \r
+ invokes EFI_MP_SERVICES_PROTOCOL.StartupAllAPs(). If the parameter WaitEvent \r
+ is not NULL, then StartupAllAPs() executes in non-blocking mode. It requests \r
+ the function specified by Procedure to be started on all the enabled APs, \r
+ and releases the BSP to continue with other tasks.\r
+ -# The caller can use the CheckEvent() and WaitForEvent() services to check \r
+ the state of the WaitEvent created in step 1.\r
+ -# When the APs complete their task or TimeoutInMicroSecondss expires, the MP \r
+ Service signals WaitEvent by calling the EFI SignalEvent() function. If \r
+ FailedCpuList is not NULL, its content is available when WaitEvent is \r
+ signaled. If all APs returned from Procedure prior to the timeout, then \r
+ FailedCpuList is set to NULL. If not all APs return from Procedure before \r
+ the timeout, then FailedCpuList is filled in with the list of the failed \r
+ APs. The buffer is allocated by MP Service Protocol using AllocatePool(). \r
+ It is the caller\92s responsibility to free the buffer with FreePool() service.\r
+ -# This invocation of SignalEvent() function informs the caller that invoked\r
+ EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() that either all the APs completed\r
+ the specified task or a timeout occurred. The contents of FailedCpuList \r
+ can be examined to determine which APs did not complete the specified task \r
+ prior to the timeout.\r
+\r
+ @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[in] Procedure A pointer to the function to be run on \r
+ enabled APs of the system. See type\r
+ EFI_AP_PROCEDURE.\r
+ @param[in] SingleThread If TRUE, then all the enabled APs execute \r
+ the function specified by Procedure one by \r
+ one, in ascending order of processor handle \r
+ number. If FALSE, then all the enabled APs \r
+ execute the function specified by Procedure\r
+ simultaneously.\r
+ @param[in] WaitEvent The event created by the caller with CreateEvent()\r
+ service. If it is NULL, then execute in \r
+ blocking mode. BSP waits until all APs finish \r
+ or TimeoutInMicroSeconds expires. If it's \r
+ not NULL, then execute in non-blocking mode. \r
+ BSP requests the function specified by \r
+ Procedure to be started on all the enabled \r
+ APs, and go on executing immediately. If \r
+ all return from Procedure or TimeoutInMicroSeconds\r
+ expires, this event is signaled. The BSP \r
+ can use the CheckEvent() or WaitForEvent() \r
+ services to check the state of event. Type \r
+ EFI_EVENT is defined in CreateEvent() in \r
+ the Unified Extensible Firmware Interface \r
+ Specification. \r
+ @param[in] TimeoutInMicrosecsond Indicates the time limit in microseconds for \r
+ APs to return from Procedure, either for \r
+ blocking or non-blocking mode. Zero means \r
+ infinity. If the timeout expires before \r
+ all APs return from Procedure, then Procedure\r
+ on the failed APs is terminated. All enabled \r
+ APs are available for next function assigned \r
+ by EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() \r
+ or EFI_MP_SERVICES_PROTOCOL.StartupThisAP().\r
+ If the timeout expires in blocking mode, \r
+ BSP returns EFI_TIMEOUT. If the timeout \r
+ expires in non-blocking mode, WaitEvent \r
+ is signaled with SignalEvent().\r
+ @param[in] ProcedureArgument The parameter passed into Procedure for \r
+ all APs.\r
+ @param[out] FailedCpuList If NULL, this parameter is ignored. Otherwise, \r
+ if all APs finish successfully, then its \r
+ content is set to NULL. If not all APs \r
+ finish before timeout expires, then its \r
+ content is set to address of the buffer \r
+ holding handle numbers of the failed APs. \r
+ The buffer is allocated by MP Service Protocol, \r
+ and it's the caller's responsibility to \r
+ free the buffer with FreePool() service.\r
+ In blocking mode, it is ready for consumption \r
+ when the call returns. In non-blocking mode, \r
+ it is ready when WaitEvent is signaled. The \r
+ list of failed CPU is terminated by \r
+ END_OF_CPU_LIST.\r
+\r
+ @retval EFI_SUCCESS In blocking mode, all APs have finished before \r
+ the timeout expired.\r
+ @retval EFI_SUCCESS In non-blocking mode, function has been dispatched \r
+ to all enabled APs.\r
+ @retval EFI_UNSUPPORTED A non-blocking mode request was made after the \r
+ UEFI event EFI_EVENT_GROUP_READY_TO_BOOT was \r
+ signaled.\r
+ @retval EFI_DEVICE_ERROR Caller processor is AP.\r
+ @retval EFI_NOT_STARTED No enabled APs exist in the system.\r
+ @retval EFI_NOT_READY Any enabled APs are busy.\r
+ @retval EFI_TIMEOUT In blocking mode, the timeout expired before \r
+ all enabled APs have finished.\r
+ @retval EFI_INVALID_PARAMETER Procedure is NULL.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_MP_SERVICES_STARTUP_ALL_APS)(\r
+ IN EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN EFI_AP_PROCEDURE Procedure,\r
+ IN BOOLEAN SingleThread,\r
+ IN EFI_EVENT WaitEvent OPTIONAL,\r
+ IN UINTN TimeoutInMicroSeconds,\r
+ IN VOID *ProcedureArgument OPTIONAL,\r
+ OUT UINTN **FailedCpuList OPTIONAL\r
+ );\r
+\r
+/**\r
+ This service lets the caller get one enabled AP to execute a caller-provided \r
+ function. The caller can request the BSP to either wait for the completion \r
+ of the AP or just proceed with the next task by using the EFI event mechanism. \r
+ See EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() for more details on non-blocking \r
+ execution support. This service may only be called from the BSP.\r
+\r
+ This function is used to dispatch one enabled AP to the function specified by \r
+ Procedure passing in the argument specified by ProcedureArgument. If WaitEvent \r
+ is NULL, execution is in blocking mode. The BSP waits until the AP finishes or \r
+ TimeoutInMicroSecondss expires. Otherwise, execution is in non-blocking mode. \r
+ BSP proceeds to the next task without waiting for the AP. If a non-blocking mode \r
+ is requested after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, \r
+ then EFI_UNSUPPORTED must be returned.\r
+ \r
+ If the timeout specified by TimeoutInMicroseconds expires before the AP returns \r
+ from Procedure, then execution of Procedure by the AP is terminated. The AP is \r
+ available for subsequent calls to EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() and \r
+ EFI_MP_SERVICES_PROTOCOL.StartupThisAP().\r
+\r
+ @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL\r
+ instance.\r
+ @param[in] Procedure A pointer to the function to be run on \r
+ enabled APs of the system. See type\r
+ EFI_AP_PROCEDURE.\r
+ @param[in] ProcessorNumber The handle number of the AP. The range is \r
+ from 0 to the total number of logical\r
+ processors minus 1. The total number of \r
+ logical processors can be retrieved by\r
+ EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors().\r
+ @param[in] WaitEvent The event created by the caller with CreateEvent()\r
+ service. If it is NULL, then execute in \r
+ blocking mode. BSP waits until all APs finish \r
+ or TimeoutInMicroSeconds expires. If it's \r
+ not NULL, then execute in non-blocking mode. \r
+ BSP requests the function specified by \r
+ Procedure to be started on all the enabled \r
+ APs, and go on executing immediately. If \r
+ all return from Procedure or TimeoutInMicroSeconds\r
+ expires, this event is signaled. The BSP \r
+ can use the CheckEvent() or WaitForEvent() \r
+ services to check the state of event. Type \r
+ EFI_EVENT is defined in CreateEvent() in \r
+ the Unified Extensible Firmware Interface \r
+ Specification. \r
+ @param[in] TimeoutInMicrosecsond Indicates the time limit in microseconds for \r
+ APs to return from Procedure, either for \r
+ blocking or non-blocking mode. Zero means \r
+ infinity. If the timeout expires before \r
+ all APs return from Procedure, then Procedure\r
+ on the failed APs is terminated. All enabled \r
+ APs are available for next function assigned \r
+ by EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() \r
+ or EFI_MP_SERVICES_PROTOCOL.StartupThisAP().\r
+ If the timeout expires in blocking mode, \r
+ BSP returns EFI_TIMEOUT. If the timeout \r
+ expires in non-blocking mode, WaitEvent \r
+ is signaled with SignalEvent().\r
+ @param[in] ProcedureArgument The parameter passed into Procedure for \r
+ all APs.\r
+ @param[out] Finished If NULL, this parameter is ignored. In \r
+ blocking mode, this parameter is ignored.\r
+ In non-blocking mode, if AP returns from \r
+ Procedure before the timeout expires, its\r
+ content is set to TRUE. Otherwise, the \r
+ value is set to FALSE. The caller can\r
+ determine if the AP returned from Procedure \r
+ by evaluating this value.\r
+\r
+ @retval EFI_SUCCESS In blocking mode, specified AP finished before \r
+ the timeout expires.\r
+ @retval EFI_SUCCESS In non-blocking mode, the function has been \r
+ dispatched to specified AP.\r
+ @retval EFI_UNSUPPORTED A non-blocking mode request was made after the \r
+ UEFI event EFI_EVENT_GROUP_READY_TO_BOOT was \r
+ signaled.\r
+ @retval EFI_DEVICE_ERROR The calling processor is an AP.\r
+ @retval EFI_TIMEOUT In blocking mode, the timeout expired before \r
+ the specified AP has finished.\r
+ @retval EFI_NOT_READY The specified AP is busy.\r
+ @retval EFI_NOT_FOUND The processor with the handle specified by \r
+ ProcessorNumber does not exist.\r
+ @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP or disabled AP.\r
+ @retval EFI_INVALID_PARAMETER Procedure is NULL.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_MP_SERVICES_STARTUP_THIS_AP)(\r
+ IN EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN EFI_AP_PROCEDURE Procedure,\r
+ IN UINTN ProcessorNumber,\r
+ IN EFI_EVENT WaitEvent OPTIONAL,\r
+ IN UINTN TimeoutInMicroseconds,\r
+ IN VOID *ProcedureArgument OPTIONAL,\r
+ OUT BOOLEAN *Finished OPTIONAL\r
+ );\r
+\r
+/**\r
+ This service switches the requested AP to be the BSP from that point onward. \r
+ This service changes the BSP for all purposes. This call can only be performed \r
+ by the current BSP.\r
+\r
+ This service switches the requested AP to be the BSP from that point onward. \r
+ This service changes the BSP for all purposes. The new BSP can take over the \r
+ execution of the old BSP and continue seamlessly from where the old one left \r
+ off. This service may not be supported after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT \r
+ is signaled.\r
+\r
+ If the BSP cannot be switched prior to the return from this service, then \r
+ EFI_UNSUPPORTED must be returned.\r
+\r
+ @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.\r
+ @param[in] ProcessorNumber The handle number of AP that is to become the new \r
+ BSP. The range is from 0 to the total number of \r
+ logical processors minus 1. The total number of \r
+ logical processors can be retrieved by\r
+ EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors().\r
+ @param[in] EnableOldBSP If TRUE, then the old BSP will be listed as an \r
+ enabled AP. Otherwise, it will be disabled.\r
+\r
+ @retval EFI_SUCCESS BSP successfully switched.\r
+ @retval EFI_UNSUPPORTED Switching the BSP cannot be completed prior to \r
+ this service returning.\r
+ @retval EFI_UNSUPPORTED Switching the BSP is not supported.\r
+ @retval EFI_SUCCESS The calling processor is an AP.\r
+ @retval EFI_NOT_FOUND The processor with the handle specified by\r
+ ProcessorNumber does not exist.\r
+ @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the current BSP or \r
+ a disabled AP.\r
+ @retval EFI_NOT_READY The specified AP is busy.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_MP_SERVICES_SWITCH_BSP)(\r
+ IN EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN UINTN ProcessorNumber,\r
+ IN BOOLEAN EnableOldBSP\r
+ );\r
+\r
+/**\r
+ This service lets the caller enable or disable an AP from this point onward. \r
+ This service may only be called from the BSP.\r
+\r
+ This service allows the caller enable or disable an AP from this point onward. \r
+ The caller can optionally specify the health status of the AP by Health. If \r
+ an AP is being disabled, then the state of the disabled AP is implementation \r
+ dependent. If an AP is enabled, then the implementation must guarantee that a \r
+ complete initialization sequence is performed on the AP, so the AP is in a state \r
+ that is compatible with an MP operating system. This service may not be supported \r
+ after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT is signaled.\r
+\r
+ If the enable or disable AP operation cannot be completed prior to the return \r
+ from this service, then EFI_UNSUPPORTED must be returned.\r
+\r
+ @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.\r
+ @param[in] ProcessorNumber The handle number of AP that is to become the new \r
+ BSP. The range is from 0 to the total number of \r
+ logical processors minus 1. The total number of \r
+ logical processors can be retrieved by\r
+ EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors().\r
+ @param[in] EnableAP Specifies the new state for the processor for \r
+ enabled, FALSE for disabled.\r
+ @param[in] HealthFlag If not NULL, a pointer to a value that specifies \r
+ the new health status of the AP. This flag \r
+ corresponds to StatusFlag defined in \r
+ EFI_MP_SERVICES_PROTOCOL.GetProcessorInfo(). Only \r
+ the PROCESSOR_HEALTH_STATUS_BIT is used. All other \r
+ bits are ignored. If it is NULL, this parameter \r
+ is ignored.\r
+\r
+ @retval EFI_SUCCESS The specified AP successfully enabled or disabled.\r
+ @retval EFI_UNSUPPORTED Enabling or disabling an AP cannot be completed \r
+ prior to this service returning.\r
+ @retval EFI_UNSUPPORTED Enabling or disabling an AP is not supported.\r
+ @retval EFI_DEVICE_ERROR The calling processor is an AP.\r
+ @retval EFI_NOT_FOUND Processor with the handle specified by ProcessorNumber\r
+ does not exist.\r
+ @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_MP_SERVICES_ENABLEDISABLEAP)(\r
+ IN EFI_MP_SERVICES_PROTOCOL *This,\r
+ IN UINTN ProcessorNumber,\r
+ IN BOOLEAN NewAPState,\r
+ IN UINT32 *HealthFlag OPTIONAL\r
+ );\r
+\r
+/**\r
+ This return the handle number for the calling processor. This service may be \r
+ called from the BSP and APs.\r
+\r
+ This service returns the processor handle number for the calling processor. \r
+ The returned value is in the range from 0 to the total number of logical \r
+ processors minus 1. The total number of logical processors can be retrieved \r
+ with EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors(). This service may be \r
+ called from the BSP and APs. If ProcessorNumber is NULL, then EFI_INVALID_PARAMETER \r
+ is returned. Otherwise, the current processors handle number is returned in \r
+ ProcessorNumber, and EFI_SUCCESS is returned.\r
+\r
+ @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL instance.\r
+ @param[in] ProcessorNumber The handle number of AP that is to become the new \r
+ BSP. The range is from 0 to the total number of \r
+ logical processors minus 1. The total number of \r
+ logical processors can be retrieved by\r
+ EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors().\r
+\r
+ @retval EFI_SUCCESS The current processor handle number was returned \r
+ in ProcessorNumber.\r
+ @retval EFI_INVALID_PARAMETER ProcessorNumber is NULL\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_MP_SERVICES_WHOAMI)(\r
+ IN EFI_MP_SERVICES_PROTOCOL *This,\r
+ OUT UINTN *ProcessorNumber\r
+ );\r
+\r
+///\r
+/// When installed, the MP Services Protocol produces a collection of services \r
+/// that are needed for MP management.\r
+///\r
+/// Before the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, the module \r
+/// that produces this protocol is required to place all APs into an idle state \r
+/// whenever the APs are disabled or the APs are not executing code as requested \r
+/// through the StartupAllAPs() or StartupThisAP() services. The idle state of \r
+/// an AP before the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled is \r
+/// implementation dependent.\r
+///\r
+/// After the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, all the APs \r
+/// must be placed in the OS compatible CPU state as defined by the UEFI \r
+/// Specification. Implementations of this protocol may use the UEFI event \r
+/// EFI_EVENT_GROUP_READY_TO_BOOT to force APs into the OS compatible state as \r
+/// defined by the UEFI Specification. Modules that use this protocol must \r
+/// guarantee that all non-blocking mode requests on all APs have been completed \r
+/// before the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled. Since the \r
+/// order that event notification functions in the same event group are executed \r
+/// is not deterministic, an event of type EFI_EVENT_GROUP_READY_TO_BOOT can not \r
+/// be used to guarantee that APs have completed their non-blocking mode requests.\r
+///\r
+/// When the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, the StartAllAPs() \r
+/// and StartupThisAp() services must no longer support non-blocking mode requests. \r
+/// The support for SwitchBSP() and EnableDisableAP() may no longer be supported \r
+/// after this event is signaled. Since UEFI Applications and UEFI OS Loaders \r
+/// execute after the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, these \r
+/// UEFI images must be aware that the functionality of this protocol may be reduced.\r
+/// \r
+struct _EFI_MP_SERVICES_PROTOCOL {\r
+ EFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS GetNumberOfProcessors;\r
+ EFI_MP_SERVICES_GET_PROCESSOR_INFO GetProcessorInfo;\r
+ EFI_MP_SERVICES_STARTUP_ALL_APS StartupAllAPs;\r
+ EFI_MP_SERVICES_STARTUP_THIS_AP StartupThisAP;\r
+ EFI_MP_SERVICES_SWITCH_BSP SwitchBSP;\r
+ EFI_MP_SERVICES_ENABLEDISABLEAP EnableDisableAP;\r
+ EFI_MP_SERVICES_WHOAMI WhoAmI;\r
+};\r
+\r
+extern EFI_GUID gEfiMpServiceProtocolGuid;\r
+\r
+#endif\r