1*f439973dSWarner Losh /** @file 2*f439973dSWarner Losh When installed, the MP Services Protocol produces a collection of services 3*f439973dSWarner Losh that are needed for MP management. 4*f439973dSWarner Losh 5*f439973dSWarner Losh The MP Services Protocol provides a generalized way of performing following tasks: 6*f439973dSWarner Losh - Retrieving information of multi-processor environment and MP-related status of 7*f439973dSWarner Losh specific processors. 8*f439973dSWarner Losh - Dispatching user-provided function to APs. 9*f439973dSWarner Losh - Maintain MP-related processor status. 10*f439973dSWarner Losh 11*f439973dSWarner Losh The MP Services Protocol must be produced on any system with more than one logical 12*f439973dSWarner Losh processor. 13*f439973dSWarner Losh 14*f439973dSWarner Losh The Protocol is available only during boot time. 15*f439973dSWarner Losh 16*f439973dSWarner Losh MP Services Protocol is hardware-independent. Most of the logic of this protocol 17*f439973dSWarner Losh is architecturally neutral. It abstracts the multi-processor environment and 18*f439973dSWarner Losh status of processors, and provides interfaces to retrieve information, maintain, 19*f439973dSWarner Losh and dispatch. 20*f439973dSWarner Losh 21*f439973dSWarner Losh MP Services Protocol may be consumed by ACPI module. The ACPI module may use this 22*f439973dSWarner Losh protocol to retrieve data that are needed for an MP platform and report them to OS. 23*f439973dSWarner Losh MP Services Protocol may also be used to program and configure processors, such 24*f439973dSWarner Losh as MTRR synchronization for memory space attributes setting in DXE Services. 25*f439973dSWarner Losh MP Services Protocol may be used by non-CPU DXE drivers to speed up platform boot 26*f439973dSWarner Losh by taking advantage of the processing capabilities of the APs, for example, using 27*f439973dSWarner Losh APs to help test system memory in parallel with other device initialization. 28*f439973dSWarner Losh Diagnostics applications may also use this protocol for multi-processor. 29*f439973dSWarner Losh 30*f439973dSWarner Losh Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR> 31*f439973dSWarner Losh SPDX-License-Identifier: BSD-2-Clause-Patent 32*f439973dSWarner Losh 33*f439973dSWarner Losh @par Revision Reference: 34*f439973dSWarner Losh This Protocol is defined in the UEFI Platform Initialization Specification 1.2, 35*f439973dSWarner Losh Volume 2:Driver Execution Environment Core Interface. 36*f439973dSWarner Losh 37*f439973dSWarner Losh **/ 38*f439973dSWarner Losh 39*f439973dSWarner Losh #ifndef _MP_SERVICE_PROTOCOL_H_ 40*f439973dSWarner Losh #define _MP_SERVICE_PROTOCOL_H_ 41*f439973dSWarner Losh 42*f439973dSWarner Losh /// 43*f439973dSWarner Losh /// Global ID for the EFI_MP_SERVICES_PROTOCOL. 44*f439973dSWarner Losh /// 45*f439973dSWarner Losh #define EFI_MP_SERVICES_PROTOCOL_GUID \ 46*f439973dSWarner Losh { \ 47*f439973dSWarner Losh 0x3fdda605, 0xa76e, 0x4f46, {0xad, 0x29, 0x12, 0xf4, 0x53, 0x1b, 0x3d, 0x08} \ 48*f439973dSWarner Losh } 49*f439973dSWarner Losh 50*f439973dSWarner Losh /// 51*f439973dSWarner Losh /// Value used in the NumberProcessors parameter of the GetProcessorInfo function 52*f439973dSWarner Losh /// 53*f439973dSWarner Losh #define CPU_V2_EXTENDED_TOPOLOGY BIT24 54*f439973dSWarner Losh 55*f439973dSWarner Losh /// 56*f439973dSWarner Losh /// Forward declaration for the EFI_MP_SERVICES_PROTOCOL. 57*f439973dSWarner Losh /// 58*f439973dSWarner Losh typedef struct _EFI_MP_SERVICES_PROTOCOL EFI_MP_SERVICES_PROTOCOL; 59*f439973dSWarner Losh 60*f439973dSWarner Losh /// 61*f439973dSWarner Losh /// Terminator for a list of failed CPUs returned by StartAllAPs(). 62*f439973dSWarner Losh /// 63*f439973dSWarner Losh #define END_OF_CPU_LIST 0xffffffff 64*f439973dSWarner Losh 65*f439973dSWarner Losh /// 66*f439973dSWarner Losh /// This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and 67*f439973dSWarner Losh /// indicates whether the processor is playing the role of BSP. If the bit is 1, 68*f439973dSWarner Losh /// then the processor is BSP. Otherwise, it is AP. 69*f439973dSWarner Losh /// 70*f439973dSWarner Losh #define PROCESSOR_AS_BSP_BIT 0x00000001 71*f439973dSWarner Losh 72*f439973dSWarner Losh /// 73*f439973dSWarner Losh /// This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and 74*f439973dSWarner Losh /// indicates whether the processor is enabled. If the bit is 1, then the 75*f439973dSWarner Losh /// processor is enabled. Otherwise, it is disabled. 76*f439973dSWarner Losh /// 77*f439973dSWarner Losh #define PROCESSOR_ENABLED_BIT 0x00000002 78*f439973dSWarner Losh 79*f439973dSWarner Losh /// 80*f439973dSWarner Losh /// This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and 81*f439973dSWarner Losh /// indicates whether the processor is healthy. If the bit is 1, then the 82*f439973dSWarner Losh /// processor is healthy. Otherwise, some fault has been detected for the processor. 83*f439973dSWarner Losh /// 84*f439973dSWarner Losh #define PROCESSOR_HEALTH_STATUS_BIT 0x00000004 85*f439973dSWarner Losh 86*f439973dSWarner Losh /// 87*f439973dSWarner Losh /// Structure that describes the pyhiscal location of a logical CPU. 88*f439973dSWarner Losh /// 89*f439973dSWarner Losh typedef struct { 90*f439973dSWarner Losh /// 91*f439973dSWarner Losh /// Zero-based physical package number that identifies the cartridge of the processor. 92*f439973dSWarner Losh /// 93*f439973dSWarner Losh UINT32 Package; 94*f439973dSWarner Losh /// 95*f439973dSWarner Losh /// Zero-based physical core number within package of the processor. 96*f439973dSWarner Losh /// 97*f439973dSWarner Losh UINT32 Core; 98*f439973dSWarner Losh /// 99*f439973dSWarner Losh /// Zero-based logical thread number within core of the processor. 100*f439973dSWarner Losh /// 101*f439973dSWarner Losh UINT32 Thread; 102*f439973dSWarner Losh } EFI_CPU_PHYSICAL_LOCATION; 103*f439973dSWarner Losh 104*f439973dSWarner Losh /// 105*f439973dSWarner Losh /// Structure that defines the 6-level physical location of the processor 106*f439973dSWarner Losh /// 107*f439973dSWarner Losh typedef struct { 108*f439973dSWarner Losh /// 109*f439973dSWarner Losh /// Package Zero-based physical package number that identifies the cartridge of the processor. 110*f439973dSWarner Losh /// 111*f439973dSWarner Losh UINT32 Package; 112*f439973dSWarner Losh /// 113*f439973dSWarner Losh /// Module Zero-based physical module number within package of the processor. 114*f439973dSWarner Losh /// 115*f439973dSWarner Losh UINT32 Module; 116*f439973dSWarner Losh /// 117*f439973dSWarner Losh /// Tile Zero-based physical tile number within module of the processor. 118*f439973dSWarner Losh /// 119*f439973dSWarner Losh UINT32 Tile; 120*f439973dSWarner Losh /// 121*f439973dSWarner Losh /// Die Zero-based physical die number within tile of the processor. 122*f439973dSWarner Losh /// 123*f439973dSWarner Losh UINT32 Die; 124*f439973dSWarner Losh /// 125*f439973dSWarner Losh /// Core Zero-based physical core number within die of the processor. 126*f439973dSWarner Losh /// 127*f439973dSWarner Losh UINT32 Core; 128*f439973dSWarner Losh /// 129*f439973dSWarner Losh /// Thread Zero-based logical thread number within core of the processor. 130*f439973dSWarner Losh /// 131*f439973dSWarner Losh UINT32 Thread; 132*f439973dSWarner Losh } EFI_CPU_PHYSICAL_LOCATION2; 133*f439973dSWarner Losh 134*f439973dSWarner Losh typedef union { 135*f439973dSWarner Losh /// The 6-level physical location of the processor, including the 136*f439973dSWarner Losh /// physical package number that identifies the cartridge, the physical 137*f439973dSWarner Losh /// module number within package, the physical tile number within the module, 138*f439973dSWarner Losh /// the physical die number within the tile, the physical core number within 139*f439973dSWarner Losh /// package, and logical thread number within core. 140*f439973dSWarner Losh EFI_CPU_PHYSICAL_LOCATION2 Location2; 141*f439973dSWarner Losh } EXTENDED_PROCESSOR_INFORMATION; 142*f439973dSWarner Losh 143*f439973dSWarner Losh /// 144*f439973dSWarner Losh /// Structure that describes information about a logical CPU. 145*f439973dSWarner Losh /// 146*f439973dSWarner Losh typedef struct { 147*f439973dSWarner Losh /// 148*f439973dSWarner Losh /// The unique processor ID determined by system hardware. For IA32 and X64, 149*f439973dSWarner Losh /// the processor ID is the same as the Local APIC ID. Only the lower 8 bits 150*f439973dSWarner Losh /// are used, and higher bits are reserved. For IPF, the lower 16 bits contains 151*f439973dSWarner Losh /// id/eid, and higher bits are reserved. 152*f439973dSWarner Losh /// 153*f439973dSWarner Losh UINT64 ProcessorId; 154*f439973dSWarner Losh /// 155*f439973dSWarner Losh /// Flags indicating if the processor is BSP or AP, if the processor is enabled 156*f439973dSWarner Losh /// or disabled, and if the processor is healthy. Bits 3..31 are reserved and 157*f439973dSWarner Losh /// must be 0. 158*f439973dSWarner Losh /// 159*f439973dSWarner Losh /// <pre> 160*f439973dSWarner Losh /// BSP ENABLED HEALTH Description 161*f439973dSWarner Losh /// === ======= ====== =================================================== 162*f439973dSWarner Losh /// 0 0 0 Unhealthy Disabled AP. 163*f439973dSWarner Losh /// 0 0 1 Healthy Disabled AP. 164*f439973dSWarner Losh /// 0 1 0 Unhealthy Enabled AP. 165*f439973dSWarner Losh /// 0 1 1 Healthy Enabled AP. 166*f439973dSWarner Losh /// 1 0 0 Invalid. The BSP can never be in the disabled state. 167*f439973dSWarner Losh /// 1 0 1 Invalid. The BSP can never be in the disabled state. 168*f439973dSWarner Losh /// 1 1 0 Unhealthy Enabled BSP. 169*f439973dSWarner Losh /// 1 1 1 Healthy Enabled BSP. 170*f439973dSWarner Losh /// </pre> 171*f439973dSWarner Losh /// 172*f439973dSWarner Losh UINT32 StatusFlag; 173*f439973dSWarner Losh /// 174*f439973dSWarner Losh /// The physical location of the processor, including the physical package number 175*f439973dSWarner Losh /// that identifies the cartridge, the physical core number within package, and 176*f439973dSWarner Losh /// logical thread number within core. 177*f439973dSWarner Losh /// 178*f439973dSWarner Losh EFI_CPU_PHYSICAL_LOCATION Location; 179*f439973dSWarner Losh /// 180*f439973dSWarner Losh /// The extended information of the processor. This field is filled only when 181*f439973dSWarner Losh /// CPU_V2_EXTENDED_TOPOLOGY is set in parameter ProcessorNumber. 182*f439973dSWarner Losh EXTENDED_PROCESSOR_INFORMATION ExtendedInformation; 183*f439973dSWarner Losh } EFI_PROCESSOR_INFORMATION; 184*f439973dSWarner Losh 185*f439973dSWarner Losh /** 186*f439973dSWarner Losh This service retrieves the number of logical processor in the platform 187*f439973dSWarner Losh and the number of those logical processors that are enabled on this boot. 188*f439973dSWarner Losh This service may only be called from the BSP. 189*f439973dSWarner Losh 190*f439973dSWarner Losh This function is used to retrieve the following information: 191*f439973dSWarner Losh - The number of logical processors that are present in the system. 192*f439973dSWarner Losh - The number of enabled logical processors in the system at the instant 193*f439973dSWarner Losh this call is made. 194*f439973dSWarner Losh 195*f439973dSWarner Losh Because MP Service Protocol provides services to enable and disable processors 196*f439973dSWarner Losh dynamically, the number of enabled logical processors may vary during the 197*f439973dSWarner Losh course of a boot session. 198*f439973dSWarner Losh 199*f439973dSWarner Losh If this service is called from an AP, then EFI_DEVICE_ERROR is returned. 200*f439973dSWarner Losh If NumberOfProcessors or NumberOfEnabledProcessors is NULL, then 201*f439973dSWarner Losh EFI_INVALID_PARAMETER is returned. Otherwise, the total number of processors 202*f439973dSWarner Losh is returned in NumberOfProcessors, the number of currently enabled processor 203*f439973dSWarner Losh is returned in NumberOfEnabledProcessors, and EFI_SUCCESS is returned. 204*f439973dSWarner Losh 205*f439973dSWarner Losh @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL 206*f439973dSWarner Losh instance. 207*f439973dSWarner Losh @param[out] NumberOfProcessors Pointer to the total number of logical 208*f439973dSWarner Losh processors in the system, including the BSP 209*f439973dSWarner Losh and disabled APs. 210*f439973dSWarner Losh @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical 211*f439973dSWarner Losh processors that exist in system, including 212*f439973dSWarner Losh the BSP. 213*f439973dSWarner Losh 214*f439973dSWarner Losh @retval EFI_SUCCESS The number of logical processors and enabled 215*f439973dSWarner Losh logical processors was retrieved. 216*f439973dSWarner Losh @retval EFI_DEVICE_ERROR The calling processor is an AP. 217*f439973dSWarner Losh @retval EFI_INVALID_PARAMETER NumberOfProcessors is NULL. 218*f439973dSWarner Losh @retval EFI_INVALID_PARAMETER NumberOfEnabledProcessors is NULL. 219*f439973dSWarner Losh 220*f439973dSWarner Losh **/ 221*f439973dSWarner Losh typedef 222*f439973dSWarner Losh EFI_STATUS 223*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS)( 224*f439973dSWarner Losh IN EFI_MP_SERVICES_PROTOCOL *This, 225*f439973dSWarner Losh OUT UINTN *NumberOfProcessors, 226*f439973dSWarner Losh OUT UINTN *NumberOfEnabledProcessors 227*f439973dSWarner Losh ); 228*f439973dSWarner Losh 229*f439973dSWarner Losh /** 230*f439973dSWarner Losh Gets detailed MP-related information on the requested processor at the 231*f439973dSWarner Losh instant this call is made. This service may only be called from the BSP. 232*f439973dSWarner Losh 233*f439973dSWarner Losh This service retrieves detailed MP-related information about any processor 234*f439973dSWarner Losh on the platform. Note the following: 235*f439973dSWarner Losh - The processor information may change during the course of a boot session. 236*f439973dSWarner Losh - The information presented here is entirely MP related. 237*f439973dSWarner Losh 238*f439973dSWarner Losh Information regarding the number of caches and their sizes, frequency of operation, 239*f439973dSWarner Losh slot numbers is all considered platform-related information and is not provided 240*f439973dSWarner Losh by this service. 241*f439973dSWarner Losh 242*f439973dSWarner Losh @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL 243*f439973dSWarner Losh instance. 244*f439973dSWarner Losh @param[in] ProcessorNumber The handle number of processor. 245*f439973dSWarner Losh @param[out] ProcessorInfoBuffer A pointer to the buffer where information for 246*f439973dSWarner Losh the requested processor is deposited. 247*f439973dSWarner Losh 248*f439973dSWarner Losh @retval EFI_SUCCESS Processor information was returned. 249*f439973dSWarner Losh @retval EFI_DEVICE_ERROR The calling processor is an AP. 250*f439973dSWarner Losh @retval EFI_INVALID_PARAMETER ProcessorInfoBuffer is NULL. 251*f439973dSWarner Losh @retval EFI_NOT_FOUND The processor with the handle specified by 252*f439973dSWarner Losh ProcessorNumber does not exist in the platform. 253*f439973dSWarner Losh 254*f439973dSWarner Losh **/ 255*f439973dSWarner Losh typedef 256*f439973dSWarner Losh EFI_STATUS 257*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_GET_PROCESSOR_INFO)( 258*f439973dSWarner Losh IN EFI_MP_SERVICES_PROTOCOL *This, 259*f439973dSWarner Losh IN UINTN ProcessorNumber, 260*f439973dSWarner Losh OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer 261*f439973dSWarner Losh ); 262*f439973dSWarner Losh 263*f439973dSWarner Losh /** 264*f439973dSWarner Losh This service executes a caller provided function on all enabled APs. APs can 265*f439973dSWarner Losh run either simultaneously or one at a time in sequence. This service supports 266*f439973dSWarner Losh both blocking and non-blocking requests. The non-blocking requests use EFI 267*f439973dSWarner Losh events so the BSP can detect when the APs have finished. This service may only 268*f439973dSWarner Losh be called from the BSP. 269*f439973dSWarner Losh 270*f439973dSWarner Losh This function is used to dispatch all the enabled APs to the function specified 271*f439973dSWarner Losh by Procedure. If any enabled AP is busy, then EFI_NOT_READY is returned 272*f439973dSWarner Losh immediately and Procedure is not started on any AP. 273*f439973dSWarner Losh 274*f439973dSWarner Losh If SingleThread is TRUE, all the enabled APs execute the function specified by 275*f439973dSWarner Losh Procedure one by one, in ascending order of processor handle number. Otherwise, 276*f439973dSWarner Losh all the enabled APs execute the function specified by Procedure simultaneously. 277*f439973dSWarner Losh 278*f439973dSWarner Losh If WaitEvent is NULL, execution is in blocking mode. The BSP waits until all 279*f439973dSWarner Losh APs finish or TimeoutInMicroSecs expires. Otherwise, execution is in non-blocking 280*f439973dSWarner Losh mode, and the BSP returns from this service without waiting for APs. If a 281*f439973dSWarner Losh non-blocking mode is requested after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT 282*f439973dSWarner Losh is signaled, then EFI_UNSUPPORTED must be returned. 283*f439973dSWarner Losh 284*f439973dSWarner Losh If the timeout specified by TimeoutInMicroseconds expires before all APs return 285*f439973dSWarner Losh from Procedure, then Procedure on the failed APs is terminated. All enabled APs 286*f439973dSWarner Losh are always available for further calls to EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() 287*f439973dSWarner Losh and EFI_MP_SERVICES_PROTOCOL.StartupThisAP(). If FailedCpuList is not NULL, its 288*f439973dSWarner Losh content points to the list of processor handle numbers in which Procedure was 289*f439973dSWarner Losh terminated. 290*f439973dSWarner Losh 291*f439973dSWarner Losh Note: It is the responsibility of the consumer of the EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() 292*f439973dSWarner Losh to make sure that the nature of the code that is executed on the BSP and the 293*f439973dSWarner Losh dispatched APs is well controlled. The MP Services Protocol does not guarantee 294*f439973dSWarner Losh that the Procedure function is MP-safe. Hence, the tasks that can be run in 295*f439973dSWarner Losh parallel are limited to certain independent tasks and well-controlled exclusive 296*f439973dSWarner Losh code. EFI services and protocols may not be called by APs unless otherwise 297*f439973dSWarner Losh specified. 298*f439973dSWarner Losh 299*f439973dSWarner Losh In blocking execution mode, BSP waits until all APs finish or 300*f439973dSWarner Losh TimeoutInMicroSeconds expires. 301*f439973dSWarner Losh 302*f439973dSWarner Losh In non-blocking execution mode, BSP is freed to return to the caller and then 303*f439973dSWarner Losh proceed to the next task without having to wait for APs. The following 304*f439973dSWarner Losh sequence needs to occur in a non-blocking execution mode: 305*f439973dSWarner Losh 306*f439973dSWarner Losh -# The caller that intends to use this MP Services Protocol in non-blocking 307*f439973dSWarner Losh mode creates WaitEvent by calling the EFI CreateEvent() service. The caller 308*f439973dSWarner Losh invokes EFI_MP_SERVICES_PROTOCOL.StartupAllAPs(). If the parameter WaitEvent 309*f439973dSWarner Losh is not NULL, then StartupAllAPs() executes in non-blocking mode. It requests 310*f439973dSWarner Losh the function specified by Procedure to be started on all the enabled APs, 311*f439973dSWarner Losh and releases the BSP to continue with other tasks. 312*f439973dSWarner Losh -# The caller can use the CheckEvent() and WaitForEvent() services to check 313*f439973dSWarner Losh the state of the WaitEvent created in step 1. 314*f439973dSWarner Losh -# When the APs complete their task or TimeoutInMicroSecondss expires, the MP 315*f439973dSWarner Losh Service signals WaitEvent by calling the EFI SignalEvent() function. If 316*f439973dSWarner Losh FailedCpuList is not NULL, its content is available when WaitEvent is 317*f439973dSWarner Losh signaled. If all APs returned from Procedure prior to the timeout, then 318*f439973dSWarner Losh FailedCpuList is set to NULL. If not all APs return from Procedure before 319*f439973dSWarner Losh the timeout, then FailedCpuList is filled in with the list of the failed 320*f439973dSWarner Losh APs. The buffer is allocated by MP Service Protocol using AllocatePool(). 321*f439973dSWarner Losh It is the caller's responsibility to free the buffer with FreePool() service. 322*f439973dSWarner Losh -# This invocation of SignalEvent() function informs the caller that invoked 323*f439973dSWarner Losh EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() that either all the APs completed 324*f439973dSWarner Losh the specified task or a timeout occurred. The contents of FailedCpuList 325*f439973dSWarner Losh can be examined to determine which APs did not complete the specified task 326*f439973dSWarner Losh prior to the timeout. 327*f439973dSWarner Losh 328*f439973dSWarner Losh @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL 329*f439973dSWarner Losh instance. 330*f439973dSWarner Losh @param[in] Procedure A pointer to the function to be run on 331*f439973dSWarner Losh enabled APs of the system. See type 332*f439973dSWarner Losh EFI_AP_PROCEDURE. 333*f439973dSWarner Losh @param[in] SingleThread If TRUE, then all the enabled APs execute 334*f439973dSWarner Losh the function specified by Procedure one by 335*f439973dSWarner Losh one, in ascending order of processor handle 336*f439973dSWarner Losh number. If FALSE, then all the enabled APs 337*f439973dSWarner Losh execute the function specified by Procedure 338*f439973dSWarner Losh simultaneously. 339*f439973dSWarner Losh @param[in] WaitEvent The event created by the caller with CreateEvent() 340*f439973dSWarner Losh service. If it is NULL, then execute in 341*f439973dSWarner Losh blocking mode. BSP waits until all APs finish 342*f439973dSWarner Losh or TimeoutInMicroSeconds expires. If it's 343*f439973dSWarner Losh not NULL, then execute in non-blocking mode. 344*f439973dSWarner Losh BSP requests the function specified by 345*f439973dSWarner Losh Procedure to be started on all the enabled 346*f439973dSWarner Losh APs, and go on executing immediately. If 347*f439973dSWarner Losh all return from Procedure, or TimeoutInMicroSeconds 348*f439973dSWarner Losh expires, this event is signaled. The BSP 349*f439973dSWarner Losh can use the CheckEvent() or WaitForEvent() 350*f439973dSWarner Losh services to check the state of event. Type 351*f439973dSWarner Losh EFI_EVENT is defined in CreateEvent() in 352*f439973dSWarner Losh the Unified Extensible Firmware Interface 353*f439973dSWarner Losh Specification. 354*f439973dSWarner Losh @param[in] TimeoutInMicrosecsond Indicates the time limit in microseconds for 355*f439973dSWarner Losh APs to return from Procedure, either for 356*f439973dSWarner Losh blocking or non-blocking mode. Zero means 357*f439973dSWarner Losh infinity. If the timeout expires before 358*f439973dSWarner Losh all APs return from Procedure, then Procedure 359*f439973dSWarner Losh on the failed APs is terminated. All enabled 360*f439973dSWarner Losh APs are available for next function assigned 361*f439973dSWarner Losh by EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() 362*f439973dSWarner Losh or EFI_MP_SERVICES_PROTOCOL.StartupThisAP(). 363*f439973dSWarner Losh If the timeout expires in blocking mode, 364*f439973dSWarner Losh BSP returns EFI_TIMEOUT. If the timeout 365*f439973dSWarner Losh expires in non-blocking mode, WaitEvent 366*f439973dSWarner Losh is signaled with SignalEvent(). 367*f439973dSWarner Losh @param[in] ProcedureArgument The parameter passed into Procedure for 368*f439973dSWarner Losh all APs. 369*f439973dSWarner Losh @param[out] FailedCpuList If NULL, this parameter is ignored. Otherwise, 370*f439973dSWarner Losh if all APs finish successfully, then its 371*f439973dSWarner Losh content is set to NULL. If not all APs 372*f439973dSWarner Losh finish before timeout expires, then its 373*f439973dSWarner Losh content is set to address of the buffer 374*f439973dSWarner Losh holding handle numbers of the failed APs. 375*f439973dSWarner Losh The buffer is allocated by MP Service Protocol, 376*f439973dSWarner Losh and it's the caller's responsibility to 377*f439973dSWarner Losh free the buffer with FreePool() service. 378*f439973dSWarner Losh In blocking mode, it is ready for consumption 379*f439973dSWarner Losh when the call returns. In non-blocking mode, 380*f439973dSWarner Losh it is ready when WaitEvent is signaled. The 381*f439973dSWarner Losh list of failed CPU is terminated by 382*f439973dSWarner Losh END_OF_CPU_LIST. 383*f439973dSWarner Losh 384*f439973dSWarner Losh @retval EFI_SUCCESS In blocking mode, all APs have finished before 385*f439973dSWarner Losh the timeout expired. 386*f439973dSWarner Losh @retval EFI_SUCCESS In non-blocking mode, function has been dispatched 387*f439973dSWarner Losh to all enabled APs. 388*f439973dSWarner Losh @retval EFI_UNSUPPORTED A non-blocking mode request was made after the 389*f439973dSWarner Losh UEFI event EFI_EVENT_GROUP_READY_TO_BOOT was 390*f439973dSWarner Losh signaled. 391*f439973dSWarner Losh @retval EFI_DEVICE_ERROR Caller processor is AP. 392*f439973dSWarner Losh @retval EFI_NOT_STARTED No enabled APs exist in the system. 393*f439973dSWarner Losh @retval EFI_NOT_READY Any enabled APs are busy. 394*f439973dSWarner Losh @retval EFI_TIMEOUT In blocking mode, the timeout expired before 395*f439973dSWarner Losh all enabled APs have finished. 396*f439973dSWarner Losh @retval EFI_INVALID_PARAMETER Procedure is NULL. 397*f439973dSWarner Losh 398*f439973dSWarner Losh **/ 399*f439973dSWarner Losh typedef 400*f439973dSWarner Losh EFI_STATUS 401*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_STARTUP_ALL_APS)( 402*f439973dSWarner Losh IN EFI_MP_SERVICES_PROTOCOL *This, 403*f439973dSWarner Losh IN EFI_AP_PROCEDURE Procedure, 404*f439973dSWarner Losh IN BOOLEAN SingleThread, 405*f439973dSWarner Losh IN EFI_EVENT WaitEvent OPTIONAL, 406*f439973dSWarner Losh IN UINTN TimeoutInMicroSeconds, 407*f439973dSWarner Losh IN VOID *ProcedureArgument OPTIONAL, 408*f439973dSWarner Losh OUT UINTN **FailedCpuList OPTIONAL 409*f439973dSWarner Losh ); 410*f439973dSWarner Losh 411*f439973dSWarner Losh /** 412*f439973dSWarner Losh This service lets the caller get one enabled AP to execute a caller-provided 413*f439973dSWarner Losh function. The caller can request the BSP to either wait for the completion 414*f439973dSWarner Losh of the AP or just proceed with the next task by using the EFI event mechanism. 415*f439973dSWarner Losh See EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() for more details on non-blocking 416*f439973dSWarner Losh execution support. This service may only be called from the BSP. 417*f439973dSWarner Losh 418*f439973dSWarner Losh This function is used to dispatch one enabled AP to the function specified by 419*f439973dSWarner Losh Procedure passing in the argument specified by ProcedureArgument. If WaitEvent 420*f439973dSWarner Losh is NULL, execution is in blocking mode. The BSP waits until the AP finishes or 421*f439973dSWarner Losh TimeoutInMicroSecondss expires. Otherwise, execution is in non-blocking mode. 422*f439973dSWarner Losh BSP proceeds to the next task without waiting for the AP. If a non-blocking mode 423*f439973dSWarner Losh is requested after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, 424*f439973dSWarner Losh then EFI_UNSUPPORTED must be returned. 425*f439973dSWarner Losh 426*f439973dSWarner Losh If the timeout specified by TimeoutInMicroseconds expires before the AP returns 427*f439973dSWarner Losh from Procedure, then execution of Procedure by the AP is terminated. The AP is 428*f439973dSWarner Losh available for subsequent calls to EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() and 429*f439973dSWarner Losh EFI_MP_SERVICES_PROTOCOL.StartupThisAP(). 430*f439973dSWarner Losh 431*f439973dSWarner Losh @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL 432*f439973dSWarner Losh instance. 433*f439973dSWarner Losh @param[in] Procedure A pointer to the function to be run on the 434*f439973dSWarner Losh designated AP of the system. See type 435*f439973dSWarner Losh EFI_AP_PROCEDURE. 436*f439973dSWarner Losh @param[in] ProcessorNumber The handle number of the AP. The range is 437*f439973dSWarner Losh from 0 to the total number of logical 438*f439973dSWarner Losh processors minus 1. The total number of 439*f439973dSWarner Losh logical processors can be retrieved by 440*f439973dSWarner Losh EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors(). 441*f439973dSWarner Losh @param[in] WaitEvent The event created by the caller with CreateEvent() 442*f439973dSWarner Losh service. If it is NULL, then execute in 443*f439973dSWarner Losh blocking mode. BSP waits until this AP finish 444*f439973dSWarner Losh or TimeoutInMicroSeconds expires. If it's 445*f439973dSWarner Losh not NULL, then execute in non-blocking mode. 446*f439973dSWarner Losh BSP requests the function specified by 447*f439973dSWarner Losh Procedure to be started on this AP, 448*f439973dSWarner Losh and go on executing immediately. If this AP 449*f439973dSWarner Losh return from Procedure or TimeoutInMicroSeconds 450*f439973dSWarner Losh expires, this event is signaled. The BSP 451*f439973dSWarner Losh can use the CheckEvent() or WaitForEvent() 452*f439973dSWarner Losh services to check the state of event. Type 453*f439973dSWarner Losh EFI_EVENT is defined in CreateEvent() in 454*f439973dSWarner Losh the Unified Extensible Firmware Interface 455*f439973dSWarner Losh Specification. 456*f439973dSWarner Losh @param[in] TimeoutInMicrosecsond Indicates the time limit in microseconds for 457*f439973dSWarner Losh this AP to finish this Procedure, either for 458*f439973dSWarner Losh blocking or non-blocking mode. Zero means 459*f439973dSWarner Losh infinity. If the timeout expires before 460*f439973dSWarner Losh this AP returns from Procedure, then Procedure 461*f439973dSWarner Losh on the AP is terminated. The 462*f439973dSWarner Losh AP is available for next function assigned 463*f439973dSWarner Losh by EFI_MP_SERVICES_PROTOCOL.StartupAllAPs() 464*f439973dSWarner Losh or EFI_MP_SERVICES_PROTOCOL.StartupThisAP(). 465*f439973dSWarner Losh If the timeout expires in blocking mode, 466*f439973dSWarner Losh BSP returns EFI_TIMEOUT. If the timeout 467*f439973dSWarner Losh expires in non-blocking mode, WaitEvent 468*f439973dSWarner Losh is signaled with SignalEvent(). 469*f439973dSWarner Losh @param[in] ProcedureArgument The parameter passed into Procedure on the 470*f439973dSWarner Losh specified AP. 471*f439973dSWarner Losh @param[out] Finished If NULL, this parameter is ignored. In 472*f439973dSWarner Losh blocking mode, this parameter is ignored. 473*f439973dSWarner Losh In non-blocking mode, if AP returns from 474*f439973dSWarner Losh Procedure before the timeout expires, its 475*f439973dSWarner Losh content is set to TRUE. Otherwise, the 476*f439973dSWarner Losh value is set to FALSE. The caller can 477*f439973dSWarner Losh determine if the AP returned from Procedure 478*f439973dSWarner Losh by evaluating this value. 479*f439973dSWarner Losh 480*f439973dSWarner Losh @retval EFI_SUCCESS In blocking mode, specified AP finished before 481*f439973dSWarner Losh the timeout expires. 482*f439973dSWarner Losh @retval EFI_SUCCESS In non-blocking mode, the function has been 483*f439973dSWarner Losh dispatched to specified AP. 484*f439973dSWarner Losh @retval EFI_UNSUPPORTED A non-blocking mode request was made after the 485*f439973dSWarner Losh UEFI event EFI_EVENT_GROUP_READY_TO_BOOT was 486*f439973dSWarner Losh signaled. 487*f439973dSWarner Losh @retval EFI_DEVICE_ERROR The calling processor is an AP. 488*f439973dSWarner Losh @retval EFI_TIMEOUT In blocking mode, the timeout expired before 489*f439973dSWarner Losh the specified AP has finished. 490*f439973dSWarner Losh @retval EFI_NOT_READY The specified AP is busy. 491*f439973dSWarner Losh @retval EFI_NOT_FOUND The processor with the handle specified by 492*f439973dSWarner Losh ProcessorNumber does not exist. 493*f439973dSWarner Losh @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP or disabled AP. 494*f439973dSWarner Losh @retval EFI_INVALID_PARAMETER Procedure is NULL. 495*f439973dSWarner Losh 496*f439973dSWarner Losh **/ 497*f439973dSWarner Losh typedef 498*f439973dSWarner Losh EFI_STATUS 499*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_STARTUP_THIS_AP)( 500*f439973dSWarner Losh IN EFI_MP_SERVICES_PROTOCOL *This, 501*f439973dSWarner Losh IN EFI_AP_PROCEDURE Procedure, 502*f439973dSWarner Losh IN UINTN ProcessorNumber, 503*f439973dSWarner Losh IN EFI_EVENT WaitEvent OPTIONAL, 504*f439973dSWarner Losh IN UINTN TimeoutInMicroseconds, 505*f439973dSWarner Losh IN VOID *ProcedureArgument OPTIONAL, 506*f439973dSWarner Losh OUT BOOLEAN *Finished OPTIONAL 507*f439973dSWarner Losh ); 508*f439973dSWarner Losh 509*f439973dSWarner Losh /** 510*f439973dSWarner Losh This service switches the requested AP to be the BSP from that point onward. 511*f439973dSWarner Losh This service changes the BSP for all purposes. This call can only be performed 512*f439973dSWarner Losh by the current BSP. 513*f439973dSWarner Losh 514*f439973dSWarner Losh This service switches the requested AP to be the BSP from that point onward. 515*f439973dSWarner Losh This service changes the BSP for all purposes. The new BSP can take over the 516*f439973dSWarner Losh execution of the old BSP and continue seamlessly from where the old one left 517*f439973dSWarner Losh off. This service may not be supported after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT 518*f439973dSWarner Losh is signaled. 519*f439973dSWarner Losh 520*f439973dSWarner Losh If the BSP cannot be switched prior to the return from this service, then 521*f439973dSWarner Losh EFI_UNSUPPORTED must be returned. 522*f439973dSWarner Losh 523*f439973dSWarner Losh @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL instance. 524*f439973dSWarner Losh @param[in] ProcessorNumber The handle number of AP that is to become the new 525*f439973dSWarner Losh BSP. The range is from 0 to the total number of 526*f439973dSWarner Losh logical processors minus 1. The total number of 527*f439973dSWarner Losh logical processors can be retrieved by 528*f439973dSWarner Losh EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors(). 529*f439973dSWarner Losh @param[in] EnableOldBSP If TRUE, then the old BSP will be listed as an 530*f439973dSWarner Losh enabled AP. Otherwise, it will be disabled. 531*f439973dSWarner Losh 532*f439973dSWarner Losh @retval EFI_SUCCESS BSP successfully switched. 533*f439973dSWarner Losh @retval EFI_UNSUPPORTED Switching the BSP cannot be completed prior to 534*f439973dSWarner Losh this service returning. 535*f439973dSWarner Losh @retval EFI_UNSUPPORTED Switching the BSP is not supported. 536*f439973dSWarner Losh @retval EFI_DEVICE_ERROR The calling processor is an AP. 537*f439973dSWarner Losh @retval EFI_NOT_FOUND The processor with the handle specified by 538*f439973dSWarner Losh ProcessorNumber does not exist. 539*f439973dSWarner Losh @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the current BSP or 540*f439973dSWarner Losh a disabled AP. 541*f439973dSWarner Losh @retval EFI_NOT_READY The specified AP is busy. 542*f439973dSWarner Losh 543*f439973dSWarner Losh **/ 544*f439973dSWarner Losh typedef 545*f439973dSWarner Losh EFI_STATUS 546*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_SWITCH_BSP)( 547*f439973dSWarner Losh IN EFI_MP_SERVICES_PROTOCOL *This, 548*f439973dSWarner Losh IN UINTN ProcessorNumber, 549*f439973dSWarner Losh IN BOOLEAN EnableOldBSP 550*f439973dSWarner Losh ); 551*f439973dSWarner Losh 552*f439973dSWarner Losh /** 553*f439973dSWarner Losh This service lets the caller enable or disable an AP from this point onward. 554*f439973dSWarner Losh This service may only be called from the BSP. 555*f439973dSWarner Losh 556*f439973dSWarner Losh This service allows the caller enable or disable an AP from this point onward. 557*f439973dSWarner Losh The caller can optionally specify the health status of the AP by Health. If 558*f439973dSWarner Losh an AP is being disabled, then the state of the disabled AP is implementation 559*f439973dSWarner Losh dependent. If an AP is enabled, then the implementation must guarantee that a 560*f439973dSWarner Losh complete initialization sequence is performed on the AP, so the AP is in a state 561*f439973dSWarner Losh that is compatible with an MP operating system. This service may not be supported 562*f439973dSWarner Losh after the UEFI Event EFI_EVENT_GROUP_READY_TO_BOOT is signaled. 563*f439973dSWarner Losh 564*f439973dSWarner Losh If the enable or disable AP operation cannot be completed prior to the return 565*f439973dSWarner Losh from this service, then EFI_UNSUPPORTED must be returned. 566*f439973dSWarner Losh 567*f439973dSWarner Losh @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL instance. 568*f439973dSWarner Losh @param[in] ProcessorNumber The handle number of AP. 569*f439973dSWarner Losh The range is from 0 to the total number of 570*f439973dSWarner Losh logical processors minus 1. The total number of 571*f439973dSWarner Losh logical processors can be retrieved by 572*f439973dSWarner Losh EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors(). 573*f439973dSWarner Losh @param[in] EnableAP Specifies the new state for the processor for 574*f439973dSWarner Losh enabled, FALSE for disabled. 575*f439973dSWarner Losh @param[in] HealthFlag If not NULL, a pointer to a value that specifies 576*f439973dSWarner Losh the new health status of the AP. This flag 577*f439973dSWarner Losh corresponds to StatusFlag defined in 578*f439973dSWarner Losh EFI_MP_SERVICES_PROTOCOL.GetProcessorInfo(). Only 579*f439973dSWarner Losh the PROCESSOR_HEALTH_STATUS_BIT is used. All other 580*f439973dSWarner Losh bits are ignored. If it is NULL, this parameter 581*f439973dSWarner Losh is ignored. 582*f439973dSWarner Losh 583*f439973dSWarner Losh @retval EFI_SUCCESS The specified AP was enabled or disabled successfully. 584*f439973dSWarner Losh @retval EFI_UNSUPPORTED Enabling or disabling an AP cannot be completed 585*f439973dSWarner Losh prior to this service returning. 586*f439973dSWarner Losh @retval EFI_UNSUPPORTED Enabling or disabling an AP is not supported. 587*f439973dSWarner Losh @retval EFI_DEVICE_ERROR The calling processor is an AP. 588*f439973dSWarner Losh @retval EFI_NOT_FOUND Processor with the handle specified by ProcessorNumber 589*f439973dSWarner Losh does not exist. 590*f439973dSWarner Losh @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP. 591*f439973dSWarner Losh 592*f439973dSWarner Losh **/ 593*f439973dSWarner Losh typedef 594*f439973dSWarner Losh EFI_STATUS 595*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_ENABLEDISABLEAP)( 596*f439973dSWarner Losh IN EFI_MP_SERVICES_PROTOCOL *This, 597*f439973dSWarner Losh IN UINTN ProcessorNumber, 598*f439973dSWarner Losh IN BOOLEAN EnableAP, 599*f439973dSWarner Losh IN UINT32 *HealthFlag OPTIONAL 600*f439973dSWarner Losh ); 601*f439973dSWarner Losh 602*f439973dSWarner Losh /** 603*f439973dSWarner Losh This return the handle number for the calling processor. This service may be 604*f439973dSWarner Losh called from the BSP and APs. 605*f439973dSWarner Losh 606*f439973dSWarner Losh This service returns the processor handle number for the calling processor. 607*f439973dSWarner Losh The returned value is in the range from 0 to the total number of logical 608*f439973dSWarner Losh processors minus 1. The total number of logical processors can be retrieved 609*f439973dSWarner Losh with EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors(). This service may be 610*f439973dSWarner Losh called from the BSP and APs. If ProcessorNumber is NULL, then EFI_INVALID_PARAMETER 611*f439973dSWarner Losh is returned. Otherwise, the current processors handle number is returned in 612*f439973dSWarner Losh ProcessorNumber, and EFI_SUCCESS is returned. 613*f439973dSWarner Losh 614*f439973dSWarner Losh @param[in] This A pointer to the EFI_MP_SERVICES_PROTOCOL instance. 615*f439973dSWarner Losh @param[in] ProcessorNumber Pointer to the handle number of AP. 616*f439973dSWarner Losh The range is from 0 to the total number of 617*f439973dSWarner Losh logical processors minus 1. The total number of 618*f439973dSWarner Losh logical processors can be retrieved by 619*f439973dSWarner Losh EFI_MP_SERVICES_PROTOCOL.GetNumberOfProcessors(). 620*f439973dSWarner Losh 621*f439973dSWarner Losh @retval EFI_SUCCESS The current processor handle number was returned 622*f439973dSWarner Losh in ProcessorNumber. 623*f439973dSWarner Losh @retval EFI_INVALID_PARAMETER ProcessorNumber is NULL. 624*f439973dSWarner Losh 625*f439973dSWarner Losh **/ 626*f439973dSWarner Losh typedef 627*f439973dSWarner Losh EFI_STATUS 628*f439973dSWarner Losh (EFIAPI *EFI_MP_SERVICES_WHOAMI)( 629*f439973dSWarner Losh IN EFI_MP_SERVICES_PROTOCOL *This, 630*f439973dSWarner Losh OUT UINTN *ProcessorNumber 631*f439973dSWarner Losh ); 632*f439973dSWarner Losh 633*f439973dSWarner Losh /// 634*f439973dSWarner Losh /// When installed, the MP Services Protocol produces a collection of services 635*f439973dSWarner Losh /// that are needed for MP management. 636*f439973dSWarner Losh /// 637*f439973dSWarner Losh /// Before the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, the module 638*f439973dSWarner Losh /// that produces this protocol is required to place all APs into an idle state 639*f439973dSWarner Losh /// whenever the APs are disabled or the APs are not executing code as requested 640*f439973dSWarner Losh /// through the StartupAllAPs() or StartupThisAP() services. The idle state of 641*f439973dSWarner Losh /// an AP before the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled is 642*f439973dSWarner Losh /// implementation dependent. 643*f439973dSWarner Losh /// 644*f439973dSWarner Losh /// After the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, all the APs 645*f439973dSWarner Losh /// must be placed in the OS compatible CPU state as defined by the UEFI 646*f439973dSWarner Losh /// Specification. Implementations of this protocol may use the UEFI event 647*f439973dSWarner Losh /// EFI_EVENT_GROUP_READY_TO_BOOT to force APs into the OS compatible state as 648*f439973dSWarner Losh /// defined by the UEFI Specification. Modules that use this protocol must 649*f439973dSWarner Losh /// guarantee that all non-blocking mode requests on all APs have been completed 650*f439973dSWarner Losh /// before the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled. Since the 651*f439973dSWarner Losh /// order that event notification functions in the same event group are executed 652*f439973dSWarner Losh /// is not deterministic, an event of type EFI_EVENT_GROUP_READY_TO_BOOT cannot 653*f439973dSWarner Losh /// be used to guarantee that APs have completed their non-blocking mode requests. 654*f439973dSWarner Losh /// 655*f439973dSWarner Losh /// When the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, the StartAllAPs() 656*f439973dSWarner Losh /// and StartupThisAp() services must no longer support non-blocking mode requests. 657*f439973dSWarner Losh /// The support for SwitchBSP() and EnableDisableAP() may no longer be supported 658*f439973dSWarner Losh /// after this event is signaled. Since UEFI Applications and UEFI OS Loaders 659*f439973dSWarner Losh /// execute after the UEFI event EFI_EVENT_GROUP_READY_TO_BOOT is signaled, these 660*f439973dSWarner Losh /// UEFI images must be aware that the functionality of this protocol may be reduced. 661*f439973dSWarner Losh /// 662*f439973dSWarner Losh struct _EFI_MP_SERVICES_PROTOCOL { 663*f439973dSWarner Losh EFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS GetNumberOfProcessors; 664*f439973dSWarner Losh EFI_MP_SERVICES_GET_PROCESSOR_INFO GetProcessorInfo; 665*f439973dSWarner Losh EFI_MP_SERVICES_STARTUP_ALL_APS StartupAllAPs; 666*f439973dSWarner Losh EFI_MP_SERVICES_STARTUP_THIS_AP StartupThisAP; 667*f439973dSWarner Losh EFI_MP_SERVICES_SWITCH_BSP SwitchBSP; 668*f439973dSWarner Losh EFI_MP_SERVICES_ENABLEDISABLEAP EnableDisableAP; 669*f439973dSWarner Losh EFI_MP_SERVICES_WHOAMI WhoAmI; 670*f439973dSWarner Losh }; 671*f439973dSWarner Losh 672*f439973dSWarner Losh extern EFI_GUID gEfiMpServiceProtocolGuid; 673*f439973dSWarner Losh 674*f439973dSWarner Losh #endif 675