| /** @file | |
| This file defines NvDataFv GUID and FTW working block structures. | |
| The NvDataFv GUID can be used as FileSystemGuid in EFI_FIRMWARE_VOLUME_HEADER if | |
| this FV image contains NV data, such as NV variable data. | |
| This file also defines WorkingBlockSignature GUID for FTW working block signature. | |
| Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef __SYSTEM_NV_DATA_GUID_H__ | |
| #define __SYSTEM_NV_DATA_GUID_H__ | |
| #define EFI_SYSTEM_NV_DATA_FV_GUID \ | |
| {0xfff12b8d, 0x7696, 0x4c8b, {0xa9, 0x85, 0x27, 0x47, 0x7, 0x5b, 0x4f, 0x50} } | |
| #define EDKII_WORKING_BLOCK_SIGNATURE_GUID \ | |
| {0x9e58292b, 0x7c68, 0x497d, {0xa0, 0xce, 0x65, 0x0, 0xfd, 0x9f, 0x1b, 0x95} } | |
| extern EFI_GUID gEfiSystemNvDataFvGuid; | |
| extern EFI_GUID gEdkiiWorkingBlockSignatureGuid; | |
| #define WORKING_BLOCK_VALID 0x1 | |
| #define WORKING_BLOCK_INVALID 0x2 | |
| /// | |
| /// The EDKII Fault tolerant working block header. | |
| /// The header is immediately followed by the write queue data. | |
| /// | |
| typedef struct { | |
| /// | |
| /// FTW working block signature. | |
| /// Its value has be updated from gEfiSystemNvDataFvGuid to gEdkiiWorkingBlockSignatureGuid, | |
| /// because its write queue data format has been updated to support the crossing archs. | |
| /// | |
| EFI_GUID Signature; | |
| /// | |
| /// 32bit CRC calculated for this header. | |
| /// | |
| UINT32 Crc; | |
| /// | |
| /// Working block valid bit. | |
| /// | |
| UINT8 WorkingBlockValid : 1; | |
| UINT8 WorkingBlockInvalid : 1; | |
| UINT8 Reserved : 6; | |
| UINT8 Reserved3[3]; | |
| /// | |
| /// Total size of the following write queue range. | |
| /// | |
| UINT64 WriteQueueSize; | |
| /// | |
| /// Write Queue data. | |
| /// | |
| /// EFI_FAULT_TOLERANT_WRITE_HEADER FtwHeader; | |
| /// EFI_FAULT_TOLERANT_WRITE_RECORD FtwRecord[FtwHeader.NumberOfWrites] | |
| /// EFI_FAULT_TOLERANT_WRITE_HEADER FtwHeader2; | |
| /// EFI_FAULT_TOLERANT_WRITE_RECORD FtwRecord2[FtwHeader2.NumberOfWrites] | |
| /// ... | |
| /// | |
| } EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER; | |
| #define FTW_VALID_STATE 0 | |
| #define FTW_INVALID_STATE 1 | |
| // | |
| // EFI Fault tolerant block update write queue entry. | |
| // | |
| typedef struct { | |
| UINT8 HeaderAllocated : 1; | |
| UINT8 WritesAllocated : 1; | |
| UINT8 Complete : 1; | |
| UINT8 Reserved : 5; | |
| EFI_GUID CallerId; | |
| UINT64 NumberOfWrites; | |
| UINT64 PrivateDataSize; | |
| } EFI_FAULT_TOLERANT_WRITE_HEADER; | |
| // | |
| // EFI Fault tolerant block update write queue record. | |
| // | |
| typedef struct { | |
| UINT8 BootBlockUpdate : 1; | |
| UINT8 SpareComplete : 1; | |
| UINT8 DestinationComplete : 1; | |
| UINT8 Reserved : 5; | |
| EFI_LBA Lba; | |
| UINT64 Offset; | |
| UINT64 Length; | |
| // | |
| // Relative offset to spare block. | |
| // | |
| INT64 RelativeOffset; | |
| // | |
| // UINT8 PrivateData[PrivateDataSize] | |
| // | |
| } EFI_FAULT_TOLERANT_WRITE_RECORD; | |
| #define FTW_RECORD_SIZE(PrivateDataSize) (sizeof (EFI_FAULT_TOLERANT_WRITE_RECORD) + (UINTN) PrivateDataSize) | |
| #define FTW_RECORD_TOTAL_SIZE(NumberOfWrites, PrivateDataSize) \ | |
| ((UINTN) (NumberOfWrites) * (sizeof (EFI_FAULT_TOLERANT_WRITE_RECORD) + (UINTN) PrivateDataSize)) | |
| #define FTW_WRITE_TOTAL_SIZE(NumberOfWrites, PrivateDataSize) \ | |
| ( \ | |
| sizeof (EFI_FAULT_TOLERANT_WRITE_HEADER) + (UINTN) (NumberOfWrites) * \ | |
| (sizeof (EFI_FAULT_TOLERANT_WRITE_RECORD) + (UINTN) PrivateDataSize) \ | |
| ) | |
| #endif |