1 /** @file 2 Include file for SMM CPU Services protocol implementation. 3 4 Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR> 5 SPDX-License-Identifier: BSD-2-Clause-Patent 6 7 **/ 8 9 #ifndef _CPU_SERVICE_H_ 10 #define _CPU_SERVICE_H_ 11 12 typedef enum { 13 SmmCpuNone, 14 SmmCpuAdd, 15 SmmCpuRemove, 16 SmmCpuSwitchBsp 17 } SMM_CPU_OPERATION; 18 19 // 20 // SMM CPU Service Protocol function prototypes. 21 // 22 23 /** 24 Gets processor information on the requested processor at the instant this call is made. 25 26 @param[in] This A pointer to the EFI_SMM_CPU_SERVICE_PROTOCOL instance. 27 @param[in] ProcessorNumber The handle number of processor. 28 @param[out] ProcessorInfoBuffer A pointer to the buffer where information for 29 the requested processor is deposited. 30 31 @retval EFI_SUCCESS Processor information was returned. 32 @retval EFI_INVALID_PARAMETER ProcessorInfoBuffer is NULL. 33 @retval EFI_INVALID_PARAMETER ProcessorNumber is invalid. 34 @retval EFI_NOT_FOUND The processor with the handle specified by 35 ProcessorNumber does not exist in the platform. 36 37 **/ 38 EFI_STATUS 39 EFIAPI 40 SmmGetProcessorInfo ( 41 IN CONST EFI_SMM_CPU_SERVICE_PROTOCOL *This, 42 IN UINTN ProcessorNumber, 43 OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer 44 ); 45 46 /** 47 This service switches the requested AP to be the BSP since the next SMI. 48 49 @param[in] This A pointer to the EFI_SMM_CPU_SERVICE_PROTOCOL instance. 50 @param[in] ProcessorNumber The handle number of AP that is to become the new BSP. 51 52 @retval EFI_SUCCESS BSP will be switched in next SMI. 53 @retval EFI_UNSUPPORTED Switching the BSP or a processor to be hot-removed is not supported. 54 @retval EFI_NOT_FOUND The processor with the handle specified by ProcessorNumber does not exist. 55 @retval EFI_INVALID_PARAMETER ProcessorNumber is invalid. 56 **/ 57 EFI_STATUS 58 EFIAPI 59 SmmSwitchBsp ( 60 IN CONST EFI_SMM_CPU_SERVICE_PROTOCOL *This, 61 IN UINTN ProcessorNumber 62 ); 63 64 /** 65 Notify that a processor was hot-added. 66 67 @param[in] This A pointer to the EFI_SMM_CPU_SERVICE_PROTOCOL instance. 68 @param[in] ProcessorId Local APIC ID of the hot-added processor. 69 @param[out] ProcessorNumber The handle number of the hot-added processor. 70 71 @retval EFI_SUCCESS The hot-addition of the specified processors was successfully notified. 72 @retval EFI_UNSUPPORTED Hot addition of processor is not supported. 73 @retval EFI_NOT_FOUND The processor with the handle specified by ProcessorNumber does not exist. 74 @retval EFI_INVALID_PARAMETER ProcessorNumber is invalid. 75 @retval EFI_ALREADY_STARTED The processor is already online in the system. 76 **/ 77 EFI_STATUS 78 EFIAPI 79 SmmAddProcessor ( 80 IN CONST EFI_SMM_CPU_SERVICE_PROTOCOL *This, 81 IN UINT64 ProcessorId, 82 OUT UINTN *ProcessorNumber 83 ); 84 85 /** 86 Notify that a processor was hot-removed. 87 88 @param[in] This A pointer to the EFI_SMM_CPU_SERVICE_PROTOCOL instance. 89 @param[in] ProcessorNumber The handle number of the hot-added processor. 90 91 @retval EFI_SUCCESS The hot-removal of the specified processors was successfully notified. 92 @retval EFI_UNSUPPORTED Hot removal of processor is not supported. 93 @retval EFI_UNSUPPORTED Hot removal of BSP is not supported. 94 @retval EFI_UNSUPPORTED Hot removal of a processor with pending hot-plug operation is not supported. 95 @retval EFI_INVALID_PARAMETER ProcessorNumber is invalid. 96 **/ 97 EFI_STATUS 98 EFIAPI 99 SmmRemoveProcessor ( 100 IN CONST EFI_SMM_CPU_SERVICE_PROTOCOL *This, 101 IN UINTN ProcessorNumber 102 ); 103 104 /** 105 This return the handle number for the calling processor. 106 107 @param[in] This A pointer to the EFI_SMM_CPU_SERVICE_PROTOCOL instance. 108 @param[out] ProcessorNumber The handle number of currently executing processor. 109 110 @retval EFI_SUCCESS The current processor handle number was returned 111 in ProcessorNumber. 112 @retval EFI_INVALID_PARAMETER ProcessorNumber is NULL. 113 114 **/ 115 EFI_STATUS 116 EFIAPI 117 SmmWhoAmI ( 118 IN CONST EFI_SMM_CPU_SERVICE_PROTOCOL *This, 119 OUT UINTN *ProcessorNumber 120 ); 121 122 /** 123 Register exception handler. 124 125 @param This A pointer to the SMM_CPU_SERVICE_PROTOCOL instance. 126 @param ExceptionType Defines which interrupt or exception to hook. Type EFI_EXCEPTION_TYPE and 127 the valid values for this parameter are defined in EFI_DEBUG_SUPPORT_PROTOCOL 128 of the UEFI 2.0 specification. 129 @param InterruptHandler A pointer to a function of type EFI_CPU_INTERRUPT_HANDLER 130 that is called when a processor interrupt occurs. 131 If this parameter is NULL, then the handler will be uninstalled. 132 133 @retval EFI_SUCCESS The handler for the processor interrupt was successfully installed or uninstalled. 134 @retval EFI_ALREADY_STARTED InterruptHandler is not NULL, and a handler for InterruptType was previously installed. 135 @retval EFI_INVALID_PARAMETER InterruptHandler is NULL, and a handler for InterruptType was not previously installed. 136 @retval EFI_UNSUPPORTED The interrupt specified by InterruptType is not supported. 137 138 **/ 139 EFI_STATUS 140 EFIAPI 141 SmmRegisterExceptionHandler ( 142 IN EFI_SMM_CPU_SERVICE_PROTOCOL *This, 143 IN EFI_EXCEPTION_TYPE ExceptionType, 144 IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler 145 ); 146 147 // 148 // Internal function prototypes 149 // 150 151 /** 152 Update the SMM CPU list per the pending operation. 153 154 This function is called after return from SMI handlers. 155 **/ 156 VOID 157 SmmCpuUpdate ( 158 VOID 159 ); 160 161 /** 162 Initialize SMM CPU Services. 163 164 It installs EFI SMM CPU Services Protocol. 165 166 @param ImageHandle The firmware allocated handle for the EFI image. 167 168 @retval EFI_SUCCESS EFI SMM CPU Services Protocol was installed successfully. 169 **/ 170 EFI_STATUS 171 InitializeSmmCpuServices ( 172 IN EFI_HANDLE Handle 173 ); 174 175 #endif 176