Home | History | Annotate | Download | only in PiSmmCpuDxeSmm
      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