Add SMM Variable implementation.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11151 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
gdong1
2010-12-10 09:27:54 +00:00
parent d3b4af2bca
commit 8a2d49964e
24 changed files with 3914 additions and 1334 deletions

View File

@@ -157,4 +157,90 @@ struct _VARIABLE_INFO_ENTRY {
BOOLEAN Volatile; ///< TRUE if volatile, FALSE if non-volatile.
};
//
// This structure is used for SMM variable. the collected statistics data is saved in SMRAM. It can be got from
// SMI handler. The communication buffer should be:
// EFI_SMM_COMMUNICATE_HEADER + SMM_VARIABLE_COMMUNICATE_HEADER + payload.
//
typedef struct {
UINTN Function;
EFI_STATUS ReturnStatus;
UINT8 Data[1];
} SMM_VARIABLE_COMMUNICATE_HEADER;
//
// The payload for this function is SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE.
//
#define SMM_VARIABLE_FUNCTION_GET_VARIABLE 1
//
// The payload for this function is SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME.
//
#define SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME 2
//
// The payload for this function is SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE.
//
#define SMM_VARIABLE_FUNCTION_SET_VARIABLE 3
//
// The payload for this function is SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO.
//
#define SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO 4
//
// It is a notify event, no extra payload for this function.
//
#define SMM_VARIABLE_FUNCTION_READY_TO_BOOT 5
//
// It is a notify event, no extra payload for this function.
//
#define SMM_VARIABLE_FUNCTION_EXIT_BOOT_SERVICE 6
//
// The payload for this function is VARIABLE_INFO_ENTRY. The GUID in EFI_SMM_COMMUNICATE_HEADER
// is gEfiSmmVariableProtocolGuid.
//
#define SMM_VARIABLE_FUNCTION_GET_STATISTICS 7
///
/// Size of SMM communicate header, without including the payload.
///
#define SMM_COMMUNICATE_HEADER_SIZE (OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data))
///
/// Size of SMM variable communicate header, without including the payload.
///
#define SMM_VARIABLE_COMMUNICATE_HEADER_SIZE (OFFSET_OF (SMM_VARIABLE_COMMUNICATE_HEADER, Data))
///
/// This structure is used to communicate with SMI handler by SetVariable and GetVariable.
///
typedef struct {
EFI_GUID Guid;
UINTN DataSize;
UINTN NameSize;
UINT32 Attributes;
CHAR16 Name[1];
} SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE;
///
/// This structure is used to communicate with SMI handler by GetNextVariableName.
///
typedef struct {
EFI_GUID Guid;
UINTN NameSize;
CHAR16 Name[1];
} SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME;
///
/// This structure is used to communicate with SMI handler by QueryVariableInfo.
///
typedef struct {
UINT64 MaximumVariableStorageSize;
UINT64 RemainingVariableStorageSize;
UINT64 MaximumVariableSize;
UINT32 Attributes;
} SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO;
///
/// This structure is used to communicate with SMI handler to get variable statistics information.
///
typedef VARIABLE_INFO_ENTRY SMM_VARIABLE_COMMUNICATE_VARIABLE_INFO_ENTRY;
#endif // _EFI_VARIABLE_H_

View File

@@ -0,0 +1,38 @@
/** @file
SMM Fault Tolerant Write protocol is related to EDK II-specific implementation of FTW,
provides boot-time service for fault tolerant write capability for block devices in
EFI SMM environment. The protocol provides for non-volatile storage of the intermediate
data and private information a caller would need to recover from a critical fault,
such as a power failure.
Copyright (c) 2010, 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 that 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 __SMM_FAULT_TOLERANT_WRITE_H__
#define __SMM_FAULT_TOLERANT_WRITE_H__
#include <Protocol/FaultTolerantWrite.h>
#define EFI_SMM_FAULT_TOLERANT_WRITE_PROTOCOL_GUID \
{ \
0x3868fc3b, 0x7e45, 0x43a7, { 0x90, 0x6c, 0x4b, 0xa4, 0x7d, 0xe1, 0x75, 0x4d } \
}
//
// SMM Fault Tolerant Write protocol structure is the same as Fault Tolerant Write protocol.
// The SMM one is intend to run in SMM environment, which means it can be used by
// SMM drivers after ExitPmAuth.
//
typedef EFI_FAULT_TOLERANT_WRITE_PROTOCOL EFI_SMM_FAULT_TOLERANT_WRITE_PROTOCOL;
extern EFI_GUID gEfiSmmFaultTolerantWriteProtocolGuid;
#endif

View File

@@ -0,0 +1,36 @@
/** @file
SMM Firmware Volume Block protocol is related to EDK II-specific implementation of
FVB driver, provides control over block-oriented firmware devices and is intended
to use in the EFI SMM environment.
Copyright (c) 2010, 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 that 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 __SMM_FIRMWARE_VOLUME_BLOCK_H__
#define __SMM_FIRMWARE_VOLUME_BLOCK_H__
#include <Protocol/FirmwareVolumeBlock.h>
#define EFI_SMM_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID \
{ \
0xf52fc9ff, 0x8025, 0x4432, { 0xa5, 0x3b, 0xb4, 0x7b, 0x5e, 0x9, 0xdb, 0xf9 } \
}
//
// SMM Firmware Volume Block protocol structure is the same as Firmware Volume Block
// protocol. The SMM one is intend to run in SMM environment, which means it can be
// used by SMM drivers after ExitPmAuth.
//
typedef EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL EFI_SMM_FIRMWARE_VOLUME_BLOCK_PROTOCOL;
extern EFI_GUID gEfiSmmFirmwareVolumeBlockProtocolGuid;
#endif

View File

@@ -0,0 +1,40 @@
/** @file
The EFI_SMM_SWAP_ADDRESS_RANGE_PROTOCOL is related to EDK II-specific implementation
and used to abstract the swap operation of boot block and backup block of FV in EFI
SMM environment. This swap is especially needed when updating the boot block of FV.
If a power failure happens during the boot block update, the swapped backup block
(now the boot block) can boot the machine with the old boot block backed up in it.
The swap operation is platform dependent, so other protocols such as SMM FTW (Fault
Tolerant Write) should use this protocol instead of handling hardware directly.
Copyright (c) 2010, 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 that 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 __SMM_SWAP_ADDRESS_RANGE_H__
#define __SMM_SWAP_ADDRESS_RANGE_H__
#include <Protocol/SwapAddressRange.h>
#define EFI_SMM_SWAP_ADDRESS_RANGE_PROTOCOL_GUID \
{ \
0x67c4f112, 0x3385, 0x4e55, { 0x9c, 0x5b, 0xc0, 0x5b, 0x71, 0x7c, 0x42, 0x28 } \
}
//
// SMM Swap Address Range protocol structure is the same as Swap Address Range protocol.
// The SMM one is intend to run in SMM environment, which means it can be used by
// SMM drivers after ExitPmAuth.
//
typedef EFI_SWAP_ADDRESS_RANGE_PROTOCOL EFI_SMM_SWAP_ADDRESS_RANGE_PROTOCOL;
extern EFI_GUID gEfiSmmSwapAddressRangeProtocolGuid;
#endif

View File

@@ -0,0 +1,39 @@
/** @file
EFI SMM Variable Protocol is related to EDK II-specific implementation of variables
and intended for use as a means to store data in the EFI SMM environment.
Copyright (c) 2010, 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 __SMM_VARIABLE_H__
#define __SMM_VARIABLE_H__
#define EFI_SMM_VARIABLE_PROTOCOL_GUID \
{ \
0xed32d533, 0x99e6, 0x4209, { 0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7 } \
}
typedef struct _EFI_SMM_VARIABLE_PROTOCOL EFI_SMM_VARIABLE_PROTOCOL;
///
/// EFI SMM Variable Protocol is intended for use as a means
/// to store data in the EFI SMM environment.
///
struct _EFI_SMM_VARIABLE_PROTOCOL {
EFI_GET_VARIABLE SmmGetVariable;
EFI_GET_NEXT_VARIABLE_NAME SmmGetNextVariableName;
EFI_SET_VARIABLE SmmSetVariable;
EFI_QUERY_VARIABLE_INFO SmmQueryVariableInfo;
};
extern EFI_GUID gEfiSmmVariableProtocolGuid;
#endif