1 /** @file
2   The variable data structures are related to EDK II-specific implementation of UEFI variables.
3   VariableFormat.h defines variable data headers and variable storage region headers.
4 
5 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7 
8 **/
9 
10 #ifndef __VARIABLE_FORMAT_H__
11 #define __VARIABLE_FORMAT_H__
12 
13 #define EFI_VARIABLE_GUID \
14   { 0xddcf3616, 0x3275, 0x4164, { 0x98, 0xb6, 0xfe, 0x85, 0x70, 0x7f, 0xfe, 0x7d } }
15 
16 #define EFI_AUTHENTICATED_VARIABLE_GUID \
17   { 0xaaf32c78, 0x947b, 0x439a, { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 } }
18 
19 extern EFI_GUID gEfiVariableGuid;
20 extern EFI_GUID gEfiAuthenticatedVariableGuid;
21 
22 ///
23 /// Alignment of variable name and data, according to the architecture:
24 /// * For IA-32 and Intel(R) 64 architectures: 1.
25 ///
26 #define ALIGNMENT         1
27 
28 //
29 // GET_PAD_SIZE calculates the miminal pad bytes needed to make the current pad size satisfy the alignment requirement.
30 //
31 #if (ALIGNMENT == 1)
32 #define GET_PAD_SIZE(a) (0)
33 #else
34 #define GET_PAD_SIZE(a) (((~a) + 1) & (ALIGNMENT - 1))
35 #endif
36 
37 ///
38 /// Alignment of Variable Data Header in Variable Store region.
39 ///
40 #define HEADER_ALIGNMENT  4
41 #define HEADER_ALIGN(Header)  (((UINTN) (Header) + HEADER_ALIGNMENT - 1) & (~(HEADER_ALIGNMENT - 1)))
42 
43 ///
44 /// Status of Variable Store Region.
45 ///
46 typedef enum {
47   EfiRaw,
48   EfiValid,
49   EfiInvalid,
50   EfiUnknown
51 } VARIABLE_STORE_STATUS;
52 
53 #pragma pack(1)
54 
55 #define VARIABLE_STORE_SIGNATURE  EFI_VARIABLE_GUID
56 #define AUTHENTICATED_VARIABLE_STORE_SIGNATURE  EFI_AUTHENTICATED_VARIABLE_GUID
57 
58 ///
59 /// Variable Store Header Format and State.
60 ///
61 #define VARIABLE_STORE_FORMATTED          0x5a
62 #define VARIABLE_STORE_HEALTHY            0xfe
63 
64 ///
65 /// Variable Store region header.
66 ///
67 typedef struct {
68   ///
69   /// Variable store region signature.
70   ///
71   EFI_GUID  Signature;
72   ///
73   /// Size of entire variable store,
74   /// including size of variable store header but not including the size of FvHeader.
75   ///
76   UINT32  Size;
77   ///
78   /// Variable region format state.
79   ///
80   UINT8   Format;
81   ///
82   /// Variable region healthy state.
83   ///
84   UINT8   State;
85   UINT16  Reserved;
86   UINT32  Reserved1;
87 } VARIABLE_STORE_HEADER;
88 
89 ///
90 /// Variable data start flag.
91 ///
92 #define VARIABLE_DATA                     0x55AA
93 
94 ///
95 /// Variable State flags.
96 ///
97 #define VAR_IN_DELETED_TRANSITION     0xfe  ///< Variable is in obsolete transition.
98 #define VAR_DELETED                   0xfd  ///< Variable is obsolete.
99 #define VAR_HEADER_VALID_ONLY         0x7f  ///< Variable header has been valid.
100 #define VAR_ADDED                     0x3f  ///< Variable has been completely added.
101 
102 ///
103 /// Variable Attribute combinations.
104 ///
105 #define VARIABLE_ATTRIBUTE_NV_BS        (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS)
106 #define VARIABLE_ATTRIBUTE_BS_RT        (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
107 #define VARIABLE_ATTRIBUTE_BS_RT_AT     (VARIABLE_ATTRIBUTE_BS_RT | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)
108 #define VARIABLE_ATTRIBUTE_NV_BS_RT     (VARIABLE_ATTRIBUTE_BS_RT | EFI_VARIABLE_NON_VOLATILE)
109 #define VARIABLE_ATTRIBUTE_NV_BS_RT_HR  (VARIABLE_ATTRIBUTE_NV_BS_RT | EFI_VARIABLE_HARDWARE_ERROR_RECORD)
110 #define VARIABLE_ATTRIBUTE_NV_BS_RT_AT  (VARIABLE_ATTRIBUTE_NV_BS_RT | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)
111 #define VARIABLE_ATTRIBUTE_AT           EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS
112 #define VARIABLE_ATTRIBUTE_NV_BS_RT_HR_AT    (VARIABLE_ATTRIBUTE_NV_BS_RT_HR | VARIABLE_ATTRIBUTE_AT)
113 ///
114 /// EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS is deprecated and should be considered as reserved
115 ///
116 #define VARIABLE_ATTRIBUTE_AT_AW        (EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS)
117 #define VARIABLE_ATTRIBUTE_NV_BS_RT_AW  (VARIABLE_ATTRIBUTE_NV_BS_RT | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS)
118 #define VARIABLE_ATTRIBUTE_NV_BS_RT_HR_AT_AW    (VARIABLE_ATTRIBUTE_NV_BS_RT_HR | VARIABLE_ATTRIBUTE_AT_AW)
119 
120 ///
121 /// Single Variable Data Header Structure.
122 ///
123 typedef struct {
124   ///
125   /// Variable Data Start Flag.
126   ///
127   UINT16      StartId;
128   ///
129   /// Variable State defined above.
130   ///
131   UINT8       State;
132   UINT8       Reserved;
133   ///
134   /// Attributes of variable defined in UEFI specification.
135   ///
136   UINT32      Attributes;
137   ///
138   /// Size of variable null-terminated Unicode string name.
139   ///
140   UINT32      NameSize;
141   ///
142   /// Size of the variable data without this header.
143   ///
144   UINT32      DataSize;
145   ///
146   /// A unique identifier for the vendor that produces and consumes this varaible.
147   ///
148   EFI_GUID    VendorGuid;
149 } VARIABLE_HEADER;
150 
151 ///
152 /// Single Authenticated Variable Data Header Structure.
153 ///
154 typedef struct {
155   ///
156   /// Variable Data Start Flag.
157   ///
158   UINT16      StartId;
159   ///
160   /// Variable State defined above.
161   ///
162   UINT8       State;
163   UINT8       Reserved;
164   ///
165   /// Attributes of variable defined in UEFI specification.
166   ///
167   UINT32      Attributes;
168   ///
169   /// Associated monotonic count value against replay attack.
170   ///
171   UINT64      MonotonicCount;
172   ///
173   /// Associated TimeStamp value against replay attack.
174   ///
175   EFI_TIME    TimeStamp;
176   ///
177   /// Index of associated public key in database.
178   ///
179   UINT32      PubKeyIndex;
180   ///
181   /// Size of variable null-terminated Unicode string name.
182   ///
183   UINT32      NameSize;
184   ///
185   /// Size of the variable data without this header.
186   ///
187   UINT32      DataSize;
188   ///
189   /// A unique identifier for the vendor that produces and consumes this varaible.
190   ///
191   EFI_GUID    VendorGuid;
192 } AUTHENTICATED_VARIABLE_HEADER;
193 
194 typedef struct {
195   EFI_GUID    *Guid;
196   CHAR16      *Name;
197   UINTN       VariableSize;
198 } VARIABLE_ENTRY_CONSISTENCY;
199 
200 #pragma pack()
201 
202 typedef struct _VARIABLE_INFO_ENTRY  VARIABLE_INFO_ENTRY;
203 
204 ///
205 /// This structure contains the variable list that is put in EFI system table.
206 /// The variable driver collects all variables that were used at boot service time and produces this list.
207 /// This is an optional feature to dump all used variables in shell environment.
208 ///
209 struct _VARIABLE_INFO_ENTRY {
210   VARIABLE_INFO_ENTRY *Next;       ///< Pointer to next entry.
211   EFI_GUID            VendorGuid;  ///< Guid of Variable.
212   CHAR16              *Name;       ///< Name of Variable.
213   UINT32              Attributes;  ///< Attributes of variable defined in UEFI specification.
214   UINT32              ReadCount;   ///< Number of times to read this variable.
215   UINT32              WriteCount;  ///< Number of times to write this variable.
216   UINT32              DeleteCount; ///< Number of times to delete this variable.
217   UINT32              CacheCount;  ///< Number of times that cache hits this variable.
218   BOOLEAN             Volatile;    ///< TRUE if volatile, FALSE if non-volatile.
219 };
220 
221 #endif // _EFI_VARIABLE_H_
222