/** @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 |