2011-09-02 09:49:32 +02:00
|
|
|
/** @file
|
|
|
|
The internal header file includes the common header files, defines
|
|
|
|
internal structure and functions used by Variable modules.
|
|
|
|
|
2014-03-25 07:56:55 +01:00
|
|
|
Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
|
2011-09-02 09:49:32 +02:00
|
|
|
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 _VARIABLE_H_
|
|
|
|
#define _VARIABLE_H_
|
|
|
|
|
|
|
|
#include <PiDxe.h>
|
|
|
|
#include <Protocol/VariableWrite.h>
|
|
|
|
#include <Protocol/FaultTolerantWrite.h>
|
|
|
|
#include <Protocol/FirmwareVolumeBlock.h>
|
|
|
|
#include <Protocol/Variable.h>
|
2013-05-20 09:10:10 +02:00
|
|
|
#include <Protocol/VariableLock.h>
|
2011-09-02 09:49:32 +02:00
|
|
|
#include <Library/PcdLib.h>
|
2011-10-19 14:40:52 +02:00
|
|
|
#include <Library/HobLib.h>
|
2011-09-02 09:49:32 +02:00
|
|
|
#include <Library/UefiDriverEntryPoint.h>
|
|
|
|
#include <Library/DxeServicesTableLib.h>
|
|
|
|
#include <Library/UefiRuntimeLib.h>
|
|
|
|
#include <Library/DebugLib.h>
|
|
|
|
#include <Library/BaseMemoryLib.h>
|
|
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
|
|
#include <Library/UefiLib.h>
|
|
|
|
#include <Library/BaseLib.h>
|
|
|
|
#include <Library/SynchronizationLib.h>
|
|
|
|
#include <Library/MemoryAllocationLib.h>
|
|
|
|
#include <Library/BaseCryptLib.h>
|
|
|
|
#include <Library/PlatformSecureLib.h>
|
|
|
|
#include <Guid/GlobalVariable.h>
|
|
|
|
#include <Guid/EventGroup.h>
|
|
|
|
#include <Guid/AuthenticatedVariableFormat.h>
|
|
|
|
#include <Guid/ImageAuthentication.h>
|
2011-12-13 10:42:36 +01:00
|
|
|
#include <Guid/SystemNvDataGuid.h>
|
2013-07-03 11:09:42 +02:00
|
|
|
#include <Guid/FaultTolerantWrite.h>
|
2012-05-30 04:53:10 +02:00
|
|
|
#include <Guid/HardwareErrorVariable.h>
|
2011-09-02 09:49:32 +02:00
|
|
|
|
2012-11-21 09:06:02 +01:00
|
|
|
#define EFI_VARIABLE_ATTRIBUTES_MASK (EFI_VARIABLE_NON_VOLATILE | \
|
|
|
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | \
|
|
|
|
EFI_VARIABLE_RUNTIME_ACCESS | \
|
|
|
|
EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
|
|
|
|
EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
|
|
|
|
EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
|
|
|
|
EFI_VARIABLE_APPEND_WRITE)
|
2011-09-02 09:49:32 +02:00
|
|
|
|
2013-08-19 07:16:45 +02:00
|
|
|
#define VARIABLE_ATTRIBUTE_BS_RT (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
|
|
|
|
#define VARIABLE_ATTRIBUTE_NV_BS_RT (VARIABLE_ATTRIBUTE_BS_RT | EFI_VARIABLE_NON_VOLATILE)
|
|
|
|
#define VARIABLE_ATTRIBUTE_NV_BS_RT_AT (VARIABLE_ATTRIBUTE_NV_BS_RT | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
CHAR16 *Name;
|
|
|
|
UINT32 Attributes;
|
|
|
|
} GLOBAL_VARIABLE_ENTRY;
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
///
|
|
|
|
/// The size of a 3 character ISO639 language code.
|
|
|
|
///
|
|
|
|
#define ISO_639_2_ENTRY_SIZE 3
|
|
|
|
|
2011-10-19 14:40:52 +02:00
|
|
|
typedef enum {
|
|
|
|
VariableStoreTypeVolatile,
|
|
|
|
VariableStoreTypeHob,
|
|
|
|
VariableStoreTypeNv,
|
|
|
|
VariableStoreTypeMax
|
|
|
|
} VARIABLE_STORE_TYPE;
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
typedef struct {
|
|
|
|
VARIABLE_HEADER *CurrPtr;
|
2013-01-18 02:12:32 +01:00
|
|
|
//
|
|
|
|
// If both ADDED and IN_DELETED_TRANSITION variable are present,
|
|
|
|
// InDeletedTransitionPtr will point to the IN_DELETED_TRANSITION one.
|
|
|
|
// Otherwise, CurrPtr will point to the ADDED or IN_DELETED_TRANSITION one,
|
|
|
|
// and InDeletedTransitionPtr will be NULL at the same time.
|
|
|
|
//
|
|
|
|
VARIABLE_HEADER *InDeletedTransitionPtr;
|
2011-09-02 09:49:32 +02:00
|
|
|
VARIABLE_HEADER *EndPtr;
|
|
|
|
VARIABLE_HEADER *StartPtr;
|
|
|
|
BOOLEAN Volatile;
|
|
|
|
} VARIABLE_POINTER_TRACK;
|
|
|
|
|
|
|
|
typedef struct {
|
2011-10-19 14:40:52 +02:00
|
|
|
EFI_PHYSICAL_ADDRESS HobVariableBase;
|
2011-09-02 09:49:32 +02:00
|
|
|
EFI_PHYSICAL_ADDRESS VolatileVariableBase;
|
|
|
|
EFI_PHYSICAL_ADDRESS NonVolatileVariableBase;
|
|
|
|
EFI_LOCK VariableServicesLock;
|
|
|
|
UINT32 ReentrantState;
|
|
|
|
} VARIABLE_GLOBAL;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
VARIABLE_GLOBAL VariableGlobal;
|
|
|
|
UINTN VolatileLastVariableOffset;
|
|
|
|
UINTN NonVolatileLastVariableOffset;
|
|
|
|
UINTN CommonVariableTotalSize;
|
|
|
|
UINTN HwErrVariableTotalSize;
|
|
|
|
CHAR8 *PlatformLangCodes;
|
|
|
|
CHAR8 *LangCodes;
|
|
|
|
CHAR8 *PlatformLang;
|
|
|
|
CHAR8 Lang[ISO_639_2_ENTRY_SIZE + 1];
|
|
|
|
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbInstance;
|
|
|
|
} VARIABLE_MODULE_GLOBAL;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
EFI_GUID *Guid;
|
|
|
|
CHAR16 *Name;
|
2014-03-25 07:56:55 +01:00
|
|
|
UINTN VariableSize;
|
|
|
|
} VARIABLE_ENTRY_CONSISTENCY;
|
2011-09-02 09:49:32 +02:00
|
|
|
|
2013-05-20 09:10:10 +02:00
|
|
|
typedef struct {
|
|
|
|
EFI_GUID Guid;
|
|
|
|
CHAR16 *Name;
|
|
|
|
LIST_ENTRY Link;
|
|
|
|
} VARIABLE_ENTRY;
|
|
|
|
|
2013-01-04 13:21:59 +01:00
|
|
|
/**
|
|
|
|
Flush the HOB variable to flash.
|
|
|
|
|
|
|
|
@param[in] VariableName Name of variable has been updated or deleted.
|
|
|
|
@param[in] VendorGuid Guid of variable has been updated or deleted.
|
|
|
|
|
|
|
|
**/
|
|
|
|
VOID
|
|
|
|
FlushHobVariableToFlash (
|
|
|
|
IN CHAR16 *VariableName,
|
|
|
|
IN EFI_GUID *VendorGuid
|
|
|
|
);
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
/**
|
|
|
|
Writes a buffer to variable storage space, in the working block.
|
|
|
|
|
|
|
|
This function writes a buffer to variable storage space into a firmware
|
|
|
|
volume block device. The destination is specified by the parameter
|
|
|
|
VariableBase. Fault Tolerant Write protocol is used for writing.
|
|
|
|
|
|
|
|
@param VariableBase Base address of the variable to write.
|
2013-11-12 14:31:43 +01:00
|
|
|
@param VariableBuffer Point to the variable data buffer.
|
2011-09-02 09:49:32 +02:00
|
|
|
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
|
|
@retval EFI_NOT_FOUND Fail to locate Fault Tolerant Write protocol.
|
|
|
|
@retval EFI_ABORTED The function could not complete successfully.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
FtwVariableSpace (
|
|
|
|
IN EFI_PHYSICAL_ADDRESS VariableBase,
|
2013-11-12 14:31:43 +01:00
|
|
|
IN VARIABLE_STORE_HEADER *VariableBuffer
|
2011-09-02 09:49:32 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Finds variable in storage blocks of volatile and non-volatile storage areas.
|
|
|
|
|
|
|
|
This code finds variable in storage blocks of volatile and non-volatile storage areas.
|
|
|
|
If VariableName is an empty string, then we just return the first
|
|
|
|
qualified variable without comparing VariableName and VendorGuid.
|
2012-03-30 09:19:44 +02:00
|
|
|
If IgnoreRtCheck is TRUE, then we ignore the EFI_VARIABLE_RUNTIME_ACCESS attribute check
|
|
|
|
at runtime when searching existing variable, only VariableName and VendorGuid are compared.
|
|
|
|
Otherwise, variables without EFI_VARIABLE_RUNTIME_ACCESS are not visible at runtime.
|
2011-09-02 09:49:32 +02:00
|
|
|
|
2012-03-27 10:17:23 +02:00
|
|
|
@param[in] VariableName Name of the variable to be found.
|
|
|
|
@param[in] VendorGuid Vendor GUID to be found.
|
|
|
|
@param[out] PtrTrack VARIABLE_POINTER_TRACK structure for output,
|
2011-09-02 09:49:32 +02:00
|
|
|
including the range searched and the target position.
|
2012-03-27 10:17:23 +02:00
|
|
|
@param[in] Global Pointer to VARIABLE_GLOBAL structure, including
|
2011-09-02 09:49:32 +02:00
|
|
|
base of volatile variable storage area, base of
|
|
|
|
NV variable storage area, and a lock.
|
2012-03-30 09:19:44 +02:00
|
|
|
@param[in] IgnoreRtCheck Ignore EFI_VARIABLE_RUNTIME_ACCESS attribute
|
|
|
|
check at runtime when searching variable.
|
2011-09-02 09:49:32 +02:00
|
|
|
|
|
|
|
@retval EFI_INVALID_PARAMETER If VariableName is not an empty string, while
|
|
|
|
VendorGuid is NULL.
|
|
|
|
@retval EFI_SUCCESS Variable successfully found.
|
2012-03-27 10:17:23 +02:00
|
|
|
@retval EFI_NOT_FOUND Variable not found
|
2011-09-02 09:49:32 +02:00
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
FindVariable (
|
|
|
|
IN CHAR16 *VariableName,
|
|
|
|
IN EFI_GUID *VendorGuid,
|
|
|
|
OUT VARIABLE_POINTER_TRACK *PtrTrack,
|
2012-03-27 10:17:23 +02:00
|
|
|
IN VARIABLE_GLOBAL *Global,
|
2012-03-30 09:19:44 +02:00
|
|
|
IN BOOLEAN IgnoreRtCheck
|
2011-09-02 09:49:32 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
This code gets the pointer to the variable data.
|
|
|
|
|
|
|
|
@param Variable Pointer to the Variable Header.
|
|
|
|
|
|
|
|
@return Pointer to Variable Data.
|
|
|
|
|
|
|
|
**/
|
|
|
|
UINT8 *
|
|
|
|
GetVariableDataPtr (
|
|
|
|
IN VARIABLE_HEADER *Variable
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
This code gets the size of variable data.
|
|
|
|
|
|
|
|
@param Variable Pointer to the Variable Header.
|
|
|
|
|
|
|
|
@return Size of variable in bytes.
|
|
|
|
|
|
|
|
**/
|
|
|
|
UINTN
|
|
|
|
DataSizeOfVariable (
|
|
|
|
IN VARIABLE_HEADER *Variable
|
|
|
|
);
|
|
|
|
|
2014-03-27 11:54:23 +01:00
|
|
|
/**
|
|
|
|
This function is to check if the remaining variable space is enough to set
|
|
|
|
all Variables from argument list successfully. The purpose of the check
|
|
|
|
is to keep the consistency of the Variables to be in variable storage.
|
|
|
|
|
|
|
|
Note: Variables are assumed to be in same storage.
|
|
|
|
The set sequence of Variables will be same with the sequence of VariableEntry from argument list,
|
|
|
|
so follow the argument sequence to check the Variables.
|
|
|
|
|
|
|
|
@param[in] Attributes Variable attributes for Variable entries.
|
|
|
|
@param ... The variable argument list with type VARIABLE_ENTRY_CONSISTENCY *.
|
|
|
|
A NULL terminates the list. The VariableSize of
|
|
|
|
VARIABLE_ENTRY_CONSISTENCY is the variable data size as input.
|
|
|
|
It will be changed to variable total size as output.
|
|
|
|
|
|
|
|
@retval TRUE Have enough variable space to set the Variables successfully.
|
|
|
|
@retval FALSE No enough variable space to set the Variables successfully.
|
|
|
|
|
|
|
|
**/
|
|
|
|
BOOLEAN
|
|
|
|
EFIAPI
|
|
|
|
CheckRemainingSpaceForConsistency (
|
|
|
|
IN UINT32 Attributes,
|
|
|
|
...
|
|
|
|
);
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
/**
|
|
|
|
Update the variable region with Variable information. If EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS is set,
|
|
|
|
index of associated public key is needed.
|
|
|
|
|
|
|
|
@param[in] VariableName Name of variable.
|
|
|
|
@param[in] VendorGuid Guid of variable.
|
|
|
|
@param[in] Data Variable data.
|
|
|
|
@param[in] DataSize Size of data. 0 means delete.
|
|
|
|
@param[in] Attributes Attributes of the variable.
|
|
|
|
@param[in] KeyIndex Index of associated public key.
|
|
|
|
@param[in] MonotonicCount Value of associated monotonic count.
|
2013-01-18 02:12:32 +01:00
|
|
|
@param[in, out] Variable The variable information that is used to keep track of variable usage.
|
2011-09-02 09:49:32 +02:00
|
|
|
|
|
|
|
@param[in] TimeStamp Value of associated TimeStamp.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The update operation is success.
|
|
|
|
@retval EFI_OUT_OF_RESOURCES Variable region is full, cannot write other data into this region.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
UpdateVariable (
|
|
|
|
IN CHAR16 *VariableName,
|
|
|
|
IN EFI_GUID *VendorGuid,
|
|
|
|
IN VOID *Data,
|
|
|
|
IN UINTN DataSize,
|
|
|
|
IN UINT32 Attributes OPTIONAL,
|
|
|
|
IN UINT32 KeyIndex OPTIONAL,
|
|
|
|
IN UINT64 MonotonicCount OPTIONAL,
|
2013-01-18 02:12:32 +01:00
|
|
|
IN OUT VARIABLE_POINTER_TRACK *Variable,
|
2011-09-02 09:49:32 +02:00
|
|
|
IN EFI_TIME *TimeStamp OPTIONAL
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Return TRUE if ExitBootServices () has been called.
|
|
|
|
|
|
|
|
@retval TRUE If ExitBootServices () has been called.
|
|
|
|
**/
|
|
|
|
BOOLEAN
|
|
|
|
AtRuntime (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Initializes a basic mutual exclusion lock.
|
|
|
|
|
|
|
|
This function initializes a basic mutual exclusion lock to the released state
|
|
|
|
and returns the lock. Each lock provides mutual exclusion access at its task
|
|
|
|
priority level. Since there is no preemption or multiprocessor support in EFI,
|
|
|
|
acquiring the lock only consists of raising to the locks TPL.
|
|
|
|
If Lock is NULL, then ASSERT().
|
|
|
|
If Priority is not a valid TPL value, then ASSERT().
|
|
|
|
|
|
|
|
@param Lock A pointer to the lock data structure to initialize.
|
|
|
|
@param Priority EFI TPL is associated with the lock.
|
|
|
|
|
|
|
|
@return The lock.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_LOCK *
|
|
|
|
InitializeLock (
|
|
|
|
IN OUT EFI_LOCK *Lock,
|
|
|
|
IN EFI_TPL Priority
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Acquires lock only at boot time. Simply returns at runtime.
|
|
|
|
|
|
|
|
This is a temperary function that will be removed when
|
|
|
|
EfiAcquireLock() in UefiLib can handle the call in UEFI
|
|
|
|
Runtimer driver in RT phase.
|
|
|
|
It calls EfiAcquireLock() at boot time, and simply returns
|
|
|
|
at runtime.
|
|
|
|
|
|
|
|
@param Lock A pointer to the lock to acquire.
|
|
|
|
|
|
|
|
**/
|
|
|
|
VOID
|
|
|
|
AcquireLockOnlyAtBootTime (
|
|
|
|
IN EFI_LOCK *Lock
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Releases lock only at boot time. Simply returns at runtime.
|
|
|
|
|
|
|
|
This is a temperary function which will be removed when
|
|
|
|
EfiReleaseLock() in UefiLib can handle the call in UEFI
|
|
|
|
Runtimer driver in RT phase.
|
|
|
|
It calls EfiReleaseLock() at boot time and simply returns
|
|
|
|
at runtime.
|
|
|
|
|
|
|
|
@param Lock A pointer to the lock to release.
|
|
|
|
|
|
|
|
**/
|
|
|
|
VOID
|
|
|
|
ReleaseLockOnlyAtBootTime (
|
|
|
|
IN EFI_LOCK *Lock
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Retrive the FVB protocol interface by HANDLE.
|
|
|
|
|
|
|
|
@param[in] FvBlockHandle The handle of FVB protocol that provides services for
|
|
|
|
reading, writing, and erasing the target block.
|
|
|
|
@param[out] FvBlock The interface of FVB protocol
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The interface information for the specified protocol was returned.
|
|
|
|
@retval EFI_UNSUPPORTED The device does not support the FVB protocol.
|
|
|
|
@retval EFI_INVALID_PARAMETER FvBlockHandle is not a valid EFI_HANDLE or FvBlock is NULL.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
GetFvbByHandle (
|
|
|
|
IN EFI_HANDLE FvBlockHandle,
|
|
|
|
OUT EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL **FvBlock
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Retrive the Swap Address Range protocol interface.
|
|
|
|
|
|
|
|
@param[out] SarProtocol The interface of SAR protocol
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The SAR protocol instance was found and returned in SarProtocol.
|
|
|
|
@retval EFI_NOT_FOUND The SAR protocol instance was not found.
|
|
|
|
@retval EFI_INVALID_PARAMETER SarProtocol is NULL.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
GetSarProtocol (
|
|
|
|
OUT VOID **SarProtocol
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Function returns an array of handles that support the FVB protocol
|
|
|
|
in a buffer allocated from pool.
|
|
|
|
|
|
|
|
@param[out] NumberHandles The number of handles returned in Buffer.
|
|
|
|
@param[out] Buffer A pointer to the buffer to return the requested
|
|
|
|
array of handles that support FVB protocol.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The array of handles was returned in Buffer, and the number of
|
|
|
|
handles in Buffer was returned in NumberHandles.
|
|
|
|
@retval EFI_NOT_FOUND No FVB handle was found.
|
|
|
|
@retval EFI_OUT_OF_RESOURCES There is not enough pool memory to store the matching results.
|
|
|
|
@retval EFI_INVALID_PARAMETER NumberHandles is NULL or Buffer is NULL.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
GetFvbCountAndBuffer (
|
|
|
|
OUT UINTN *NumberHandles,
|
|
|
|
OUT EFI_HANDLE **Buffer
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Initializes variable store area for non-volatile and volatile variable.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS Function successfully executed.
|
|
|
|
@retval EFI_OUT_OF_RESOURCES Fail to allocate enough memory resource.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
VariableCommonInitialize (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
2013-01-09 06:09:39 +01:00
|
|
|
/**
|
|
|
|
|
|
|
|
Variable store garbage collection and reclaim operation.
|
|
|
|
|
|
|
|
If ReclaimPubKeyStore is FALSE, reclaim variable space by deleting the obsoleted varaibles.
|
|
|
|
If ReclaimPubKeyStore is TRUE, reclaim invalid key in public key database and update the PubKeyIndex
|
|
|
|
for all the count-based authenticate variable in NV storage.
|
|
|
|
|
2013-02-21 02:35:22 +01:00
|
|
|
@param[in] VariableBase Base address of variable store.
|
|
|
|
@param[out] LastVariableOffset Offset of last variable.
|
|
|
|
@param[in] IsVolatile The variable store is volatile or not;
|
|
|
|
if it is non-volatile, need FTW.
|
|
|
|
@param[in, out] UpdatingPtrTrack Pointer to updating variable pointer track structure.
|
2013-11-04 04:13:54 +01:00
|
|
|
@param[in] NewVariable Pointer to new variable.
|
|
|
|
@param[in] NewVariableSize New variable size.
|
2013-02-21 02:35:22 +01:00
|
|
|
@param[in] ReclaimPubKeyStore Reclaim for public key database or not.
|
2013-01-09 06:09:39 +01:00
|
|
|
|
|
|
|
@return EFI_SUCCESS Reclaim operation has finished successfully.
|
2013-11-04 04:13:54 +01:00
|
|
|
@return EFI_OUT_OF_RESOURCES No enough memory resources or variable space.
|
2013-02-21 02:35:22 +01:00
|
|
|
@return EFI_DEVICE_ERROR The public key database doesn't exist.
|
2013-01-09 06:09:39 +01:00
|
|
|
@return Others Unexpect error happened during reclaim operation.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
Reclaim (
|
2013-02-21 02:35:22 +01:00
|
|
|
IN EFI_PHYSICAL_ADDRESS VariableBase,
|
|
|
|
OUT UINTN *LastVariableOffset,
|
|
|
|
IN BOOLEAN IsVolatile,
|
|
|
|
IN OUT VARIABLE_POINTER_TRACK *UpdatingPtrTrack,
|
2013-11-04 04:13:54 +01:00
|
|
|
IN VARIABLE_HEADER *NewVariable,
|
|
|
|
IN UINTN NewVariableSize,
|
|
|
|
IN BOOLEAN ReclaimPubKeyStore
|
2013-01-09 06:09:39 +01:00
|
|
|
);
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
/**
|
|
|
|
This function reclaims variable storage if free size is below the threshold.
|
|
|
|
|
|
|
|
**/
|
|
|
|
VOID
|
|
|
|
ReclaimForOS(
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Initializes variable write service after FVB was ready.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS Function successfully executed.
|
|
|
|
@retval Others Fail to initialize the variable service.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
VariableWriteServiceInitialize (
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Retrive the SMM Fault Tolerent Write protocol interface.
|
|
|
|
|
|
|
|
@param[out] FtwProtocol The interface of SMM Ftw protocol
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The SMM SAR protocol instance was found and returned in SarProtocol.
|
|
|
|
@retval EFI_NOT_FOUND The SMM SAR protocol instance was not found.
|
|
|
|
@retval EFI_INVALID_PARAMETER SarProtocol is NULL.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
GetFtwProtocol (
|
|
|
|
OUT VOID **FtwProtocol
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Get the proper fvb handle and/or fvb protocol by the given Flash address.
|
|
|
|
|
|
|
|
@param[in] Address The Flash address.
|
|
|
|
@param[out] FvbHandle In output, if it is not NULL, it points to the proper FVB handle.
|
|
|
|
@param[out] FvbProtocol In output, if it is not NULL, it points to the proper FVB protocol.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
GetFvbInfoByAddress (
|
|
|
|
IN EFI_PHYSICAL_ADDRESS Address,
|
|
|
|
OUT EFI_HANDLE *FvbHandle OPTIONAL,
|
|
|
|
OUT EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL **FvbProtocol OPTIONAL
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
This code finds variable in storage blocks (Volatile or Non-Volatile).
|
|
|
|
|
2012-06-12 10:28:43 +02:00
|
|
|
Caution: This function may receive untrusted input.
|
|
|
|
This function may be invoked in SMM mode, and datasize and data are external input.
|
|
|
|
This function will do basic validation, before parse the data.
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
@param VariableName Name of Variable to be found.
|
|
|
|
@param VendorGuid Variable vendor GUID.
|
|
|
|
@param Attributes Attribute value of the variable found.
|
|
|
|
@param DataSize Size of Data found. If size is less than the
|
|
|
|
data, this value contains the required size.
|
|
|
|
@param Data Data pointer.
|
|
|
|
|
|
|
|
@return EFI_INVALID_PARAMETER Invalid parameter.
|
|
|
|
@return EFI_SUCCESS Find the specified variable.
|
|
|
|
@return EFI_NOT_FOUND Not found.
|
|
|
|
@return EFI_BUFFER_TO_SMALL DataSize is too small for the result.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
VariableServiceGetVariable (
|
|
|
|
IN CHAR16 *VariableName,
|
|
|
|
IN EFI_GUID *VendorGuid,
|
|
|
|
OUT UINT32 *Attributes OPTIONAL,
|
|
|
|
IN OUT UINTN *DataSize,
|
|
|
|
OUT VOID *Data
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
This code Finds the Next available variable.
|
|
|
|
|
2012-06-12 10:28:43 +02:00
|
|
|
Caution: This function may receive untrusted input.
|
|
|
|
This function may be invoked in SMM mode. This function will do basic validation, before parse the data.
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
@param VariableNameSize Size of the variable name.
|
|
|
|
@param VariableName Pointer to variable name.
|
|
|
|
@param VendorGuid Variable Vendor Guid.
|
|
|
|
|
|
|
|
@return EFI_INVALID_PARAMETER Invalid parameter.
|
|
|
|
@return EFI_SUCCESS Find the specified variable.
|
|
|
|
@return EFI_NOT_FOUND Not found.
|
|
|
|
@return EFI_BUFFER_TO_SMALL DataSize is too small for the result.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
VariableServiceGetNextVariableName (
|
|
|
|
IN OUT UINTN *VariableNameSize,
|
|
|
|
IN OUT CHAR16 *VariableName,
|
|
|
|
IN OUT EFI_GUID *VendorGuid
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
This code sets variable in storage blocks (Volatile or Non-Volatile).
|
|
|
|
|
2012-06-12 10:28:43 +02:00
|
|
|
Caution: This function may receive untrusted input.
|
|
|
|
This function may be invoked in SMM mode, and datasize and data are external input.
|
|
|
|
This function will do basic validation, before parse the data.
|
|
|
|
This function will parse the authentication carefully to avoid security issues, like
|
|
|
|
buffer overflow, integer overflow.
|
|
|
|
This function will check attribute carefully to avoid authentication bypass.
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
@param VariableName Name of Variable to be found.
|
|
|
|
@param VendorGuid Variable vendor GUID.
|
|
|
|
@param Attributes Attribute value of the variable found
|
|
|
|
@param DataSize Size of Data found. If size is less than the
|
|
|
|
data, this value contains the required size.
|
|
|
|
@param Data Data pointer.
|
|
|
|
|
|
|
|
@return EFI_INVALID_PARAMETER Invalid parameter.
|
|
|
|
@return EFI_SUCCESS Set successfully.
|
|
|
|
@return EFI_OUT_OF_RESOURCES Resource not enough to set variable.
|
|
|
|
@return EFI_NOT_FOUND Not found.
|
|
|
|
@return EFI_WRITE_PROTECTED Variable is read-only.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
VariableServiceSetVariable (
|
|
|
|
IN CHAR16 *VariableName,
|
|
|
|
IN EFI_GUID *VendorGuid,
|
|
|
|
IN UINT32 Attributes,
|
|
|
|
IN UINTN DataSize,
|
|
|
|
IN VOID *Data
|
|
|
|
);
|
|
|
|
|
2014-03-25 07:56:55 +01:00
|
|
|
/**
|
|
|
|
|
|
|
|
This code returns information about the EFI variables.
|
|
|
|
|
|
|
|
Caution: This function may receive untrusted input.
|
|
|
|
This function may be invoked in SMM mode. This function will do basic validation, before parse the data.
|
|
|
|
|
|
|
|
@param Attributes Attributes bitmask to specify the type of variables
|
|
|
|
on which to return information.
|
|
|
|
@param MaximumVariableStorageSize Pointer to the maximum size of the storage space available
|
|
|
|
for the EFI variables associated with the attributes specified.
|
|
|
|
@param RemainingVariableStorageSize Pointer to the remaining size of the storage space available
|
|
|
|
for EFI variables associated with the attributes specified.
|
|
|
|
@param MaximumVariableSize Pointer to the maximum size of an individual EFI variables
|
|
|
|
associated with the attributes specified.
|
|
|
|
|
|
|
|
@return EFI_SUCCESS Query successfully.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
VariableServiceQueryVariableInfoInternal (
|
|
|
|
IN UINT32 Attributes,
|
|
|
|
OUT UINT64 *MaximumVariableStorageSize,
|
|
|
|
OUT UINT64 *RemainingVariableStorageSize,
|
|
|
|
OUT UINT64 *MaximumVariableSize
|
|
|
|
);
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
/**
|
|
|
|
|
|
|
|
This code returns information about the EFI variables.
|
|
|
|
|
2012-06-12 10:28:43 +02:00
|
|
|
Caution: This function may receive untrusted input.
|
|
|
|
This function may be invoked in SMM mode. This function will do basic validation, before parse the data.
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
@param Attributes Attributes bitmask to specify the type of variables
|
|
|
|
on which to return information.
|
|
|
|
@param MaximumVariableStorageSize Pointer to the maximum size of the storage space available
|
|
|
|
for the EFI variables associated with the attributes specified.
|
|
|
|
@param RemainingVariableStorageSize Pointer to the remaining size of the storage space available
|
|
|
|
for EFI variables associated with the attributes specified.
|
|
|
|
@param MaximumVariableSize Pointer to the maximum size of an individual EFI variables
|
|
|
|
associated with the attributes specified.
|
|
|
|
|
|
|
|
@return EFI_INVALID_PARAMETER An invalid combination of attribute bits was supplied.
|
|
|
|
@return EFI_SUCCESS Query successfully.
|
|
|
|
@return EFI_UNSUPPORTED The attribute is not supported on this platform.
|
|
|
|
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
VariableServiceQueryVariableInfo (
|
|
|
|
IN UINT32 Attributes,
|
|
|
|
OUT UINT64 *MaximumVariableStorageSize,
|
|
|
|
OUT UINT64 *RemainingVariableStorageSize,
|
|
|
|
OUT UINT64 *MaximumVariableSize
|
|
|
|
);
|
2013-05-20 09:10:10 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
Mark a variable that will become read-only after leaving the DXE phase of execution.
|
|
|
|
|
|
|
|
@param[in] This The VARIABLE_LOCK_PROTOCOL instance.
|
|
|
|
@param[in] VariableName A pointer to the variable name that will be made read-only subsequently.
|
|
|
|
@param[in] VendorGuid A pointer to the vendor GUID that will be made read-only subsequently.
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS The variable specified by the VariableName and the VendorGuid was marked
|
|
|
|
as pending to be read-only.
|
|
|
|
@retval EFI_INVALID_PARAMETER VariableName or VendorGuid is NULL.
|
|
|
|
Or VariableName is an empty string.
|
|
|
|
@retval EFI_ACCESS_DENIED EFI_END_OF_DXE_EVENT_GROUP_GUID or EFI_EVENT_GROUP_READY_TO_BOOT has
|
|
|
|
already been signaled.
|
|
|
|
@retval EFI_OUT_OF_RESOURCES There is not enough resource to hold the lock request.
|
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
VariableLockRequestToLock (
|
|
|
|
IN CONST EDKII_VARIABLE_LOCK_PROTOCOL *This,
|
|
|
|
IN CHAR16 *VariableName,
|
|
|
|
IN EFI_GUID *VendorGuid
|
|
|
|
);
|
|
|
|
|
2011-09-02 09:49:32 +02:00
|
|
|
extern VARIABLE_MODULE_GLOBAL *mVariableModuleGlobal;
|
|
|
|
|
|
|
|
#endif
|