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