| /** @file | |
| Provides services to enable and disable periodic SMI handlers. | |
| Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #ifndef __PERIODIC_SMI_LIB_H__ | |
| #define __PERIODIC_SMI_LIB_H__ | |
| #define PERIODIC_SMI_LIBRARY_ANY_CPU 0xffffffff | |
| /** | |
| This function returns a pointer to a table of supported periodic | |
| SMI tick periods in 100 ns units sorted from largest to smallest. | |
| The table contains a array of UINT64 values terminated by a tick | |
| period value of 0. The returned table must be treated as read-only | |
| data and must not be freed. | |
| @return A pointer to a table of UINT64 tick period values in | |
| 100ns units sorted from largest to smallest terminated | |
| by a tick period of 0. | |
| **/ | |
| UINT64 * | |
| EFIAPI | |
| PeriodicSmiSupportedTickPeriod ( | |
| VOID | |
| ); | |
| /** | |
| This function returns the time in 100ns units since the periodic SMI | |
| handler function was called. If the periodic SMI handler was resumed | |
| through PeriodicSmiYield(), then the time returned is the time in | |
| 100ns units since PeriodicSmiYield() returned. | |
| @return The actual time in 100ns units that the periodic SMI handler | |
| has been executing. If this function is not called from within | |
| an enabled periodic SMI handler, then 0 is returned. | |
| **/ | |
| UINT64 | |
| EFIAPI | |
| PeriodicSmiExecutionTime ( | |
| VOID | |
| ); | |
| /** | |
| This function returns control back to the SMM Foundation. When the next | |
| periodic SMI for the currently executing handler is triggered, the periodic | |
| SMI handler will restarted from its registered DispatchFunction entry point. | |
| If this function is not called from within an enabled periodic SMI handler, | |
| then control is returned to the calling function. | |
| **/ | |
| VOID | |
| EFIAPI | |
| PeriodicSmiExit ( | |
| VOID | |
| ); | |
| /** | |
| This function yields control back to the SMM Foundation. When the next | |
| periodic SMI for the currently executing handler is triggered, the periodic | |
| SMI handler will be resumed and this function will return. Use of this | |
| function requires a seperate stack for the periodic SMI handler. A non zero | |
| stack size must be specified in PeriodicSmiEnable() for this function to be | |
| used. | |
| If the stack size passed into PeriodicSmiEnable() was zero, the 0 is returned. | |
| If this function is not called from within an enabled periodic SMI handler, | |
| then 0 is returned. | |
| @return The actual time in 100ns units elasped since this function was | |
| called. A value of 0 indicates an unknown amount of time. | |
| **/ | |
| UINT64 | |
| EFIAPI | |
| PeriodicSmiYield ( | |
| VOID | |
| ); | |
| /** | |
| This function is a prototype for a periodic SMI handler function | |
| that may be enabled with PeriodicSmiEnable() and disabled with | |
| PeriodicSmiDisable(). | |
| @param[in] Context Content registered with PeriodicSmiEnable(). | |
| @param[in] ElapsedTime The actual time in 100ns units elasped since | |
| this function was called. A value of 0 indicates | |
| an unknown amount of time. | |
| **/ | |
| typedef | |
| VOID | |
| (EFIAPI *PERIODIC_SMI_LIBRARY_HANDLER) ( | |
| IN CONST VOID *Context OPTIONAL, | |
| IN UINT64 ElapsedTime | |
| ); | |
| /** | |
| This function enables a periodic SMI handler. | |
| @param[in, out] DispatchHandle A pointer to the handle associated with the | |
| enabled periodic SMI handler. This is an | |
| optional parameter that may be NULL. If it is | |
| NULL, then the handle will not be returned, | |
| which means that the periodic SMI handler can | |
| never be disabled. | |
| @param[in] DispatchFunction A pointer to a periodic SMI handler function. | |
| @param[in] Context Optional content to pass into DispatchFunction. | |
| @param[in] TickPeriod The requested tick period in 100ns units that | |
| control should be givien to the periodic SMI | |
| handler. Must be one of the supported values | |
| returned by PeriodicSmiSupportedPickPeriod(). | |
| @param[in] Cpu Specifies the CPU that is required to execute | |
| the periodic SMI handler. If Cpu is | |
| PERIODIC_SMI_LIBRARY_ANY_CPU, then the periodic | |
| SMI handler will always be executed on the SMST | |
| CurrentlyExecutingCpu, which may vary across | |
| periodic SMIs. If Cpu is between 0 and the SMST | |
| NumberOfCpus, then the periodic SMI will always | |
| be executed on the requested CPU. | |
| @param[in] StackSize The size, in bytes, of the stack to allocate for | |
| use by the periodic SMI handler. If 0, then the | |
| default stack will be used. | |
| @retval EFI_INVALID_PARAMETER DispatchFunction is NULL. | |
| @retval EFI_UNSUPPORTED TickPeriod is not a supported tick period. The | |
| supported tick periods can be retrieved using | |
| PeriodicSmiSupportedTickPeriod(). | |
| @retval EFI_INVALID_PARAMETER Cpu is not PERIODIC_SMI_LIBRARY_ANY_CPU or in | |
| the range 0 to SMST NumberOfCpus. | |
| @retval EFI_OUT_OF_RESOURCES There are not enough resources to enable the | |
| periodic SMI handler. | |
| @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate the | |
| stack speficied by StackSize. | |
| @retval EFI_SUCCESS The periodic SMI handler was enabled. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeriodicSmiEnable ( | |
| IN OUT EFI_HANDLE *DispatchHandle, OPTIONAL | |
| IN PERIODIC_SMI_LIBRARY_HANDLER DispatchFunction, | |
| IN CONST VOID *Context, OPTIONAL | |
| IN UINT64 TickPeriod, | |
| IN UINTN Cpu, | |
| IN UINTN StackSize | |
| ); | |
| /** | |
| This function disables a periodic SMI handler that has been previously | |
| enabled with PeriodicSmiEnable(). | |
| @param[in] DispatchHandle A handle associated with a previously enabled periodic | |
| SMI handler. This is an optional parameter that may | |
| be NULL. If it is NULL, then the active periodic SMI | |
| handlers is disabled. | |
| @retval FALSE DispatchHandle is NULL and there is no active periodic SMI handler. | |
| @retval FALSE The periodic SMI handler specified by DispatchHandle has | |
| not been enabled with PeriodicSmiEnable(). | |
| @retval TRUE The periodic SMI handler specified by DispatchHandle has | |
| been disabled. If DispatchHandle is NULL, then the active | |
| periodic SMI handler has been disabled. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| PeriodicSmiDisable ( | |
| IN EFI_HANDLE DispatchHandle OPTIONAL | |
| ); | |
| #endif |