]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Core/Dxe/FwVol/Ffs.c
Refine code to make it more safely.
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / FwVol / Ffs.c
CommitLineData
23c98c94 1/** @file\r
504214c4
LG
2 FFS file access utilities.\r
3\r
deff65a4 4Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
cd5ebaa0 5This program and the accompanying materials\r
23c98c94 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
28a00297 12\r
504214c4 13**/\r
28a00297 14\r
15\r
9c4ac31c 16#include "DxeMain.h"\r
ec90508b 17#include "FwVolDriver.h"\r
28a00297 18\r
28a00297 19\r
162ed594 20/**\r
21 Get the FFS file state by checking the highest bit set in the header's state field.\r
22\r
022c6d45 23 @param ErasePolarity Erase polarity attribute of the firmware volume\r
24 @param FfsHeader Points to the FFS file header\r
162ed594 25\r
26 @return FFS File state\r
27\r
28**/\r
28a00297 29EFI_FFS_FILE_STATE\r
30GetFileState (\r
31 IN UINT8 ErasePolarity,\r
32 IN EFI_FFS_FILE_HEADER *FfsHeader\r
33 )\r
28a00297 34{\r
35 EFI_FFS_FILE_STATE FileState;\r
36 UINT8 HighestBit;\r
37\r
38 FileState = FfsHeader->State;\r
39\r
40 if (ErasePolarity != 0) {\r
41 FileState = (EFI_FFS_FILE_STATE)~FileState;\r
42 }\r
43\r
44 HighestBit = 0x80;\r
45 while (HighestBit != 0 && ((HighestBit & FileState) == 0)) {\r
46 HighestBit >>= 1;\r
47 }\r
48\r
e94a9ff7 49 return (EFI_FFS_FILE_STATE) HighestBit;\r
28a00297 50}\r
51\r
52\r
162ed594 53\r
54/**\r
55 Check if a block of buffer is erased.\r
56\r
022c6d45 57 @param ErasePolarity Erase polarity attribute of the firmware volume\r
58 @param InBuffer The buffer to be checked\r
59 @param BufferSize Size of the buffer in bytes\r
162ed594 60\r
022c6d45 61 @retval TRUE The block of buffer is erased\r
162ed594 62 @retval FALSE The block of buffer is not erased\r
63\r
64**/\r
28a00297 65BOOLEAN\r
66IsBufferErased (\r
67 IN UINT8 ErasePolarity,\r
68 IN VOID *InBuffer,\r
69 IN UINTN BufferSize\r
70 )\r
28a00297 71{\r
72 UINTN Count;\r
73 UINT8 EraseByte;\r
74 UINT8 *Buffer;\r
75\r
76 if(ErasePolarity == 1) {\r
77 EraseByte = 0xFF;\r
78 } else {\r
79 EraseByte = 0;\r
80 }\r
81\r
82 Buffer = InBuffer;\r
83 for (Count = 0; Count < BufferSize; Count++) {\r
84 if (Buffer[Count] != EraseByte) {\r
85 return FALSE;\r
86 }\r
87 }\r
88\r
89 return TRUE;\r
90}\r
91\r
92\r
162ed594 93\r
94/**\r
95 Verify checksum of the firmware volume header.\r
96\r
022c6d45 97 @param FvHeader Points to the firmware volume header to be checked\r
162ed594 98\r
022c6d45 99 @retval TRUE Checksum verification passed\r
162ed594 100 @retval FALSE Checksum verification failed\r
101\r
102**/\r
28a00297 103BOOLEAN\r
104VerifyFvHeaderChecksum (\r
105 IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader\r
106 )\r
28a00297 107{\r
28a00297 108 UINT16 Checksum;\r
28a00297 109\r
deff65a4 110 Checksum = CalculateSum16 ((UINT16 *) FvHeader, FvHeader->HeaderLength);\r
28a00297 111\r
112 if (Checksum == 0) {\r
113 return TRUE;\r
114 } else {\r
115 return FALSE;\r
116 }\r
117}\r
118\r
162ed594 119\r
120/**\r
121 Verify checksum of the FFS file header.\r
122\r
022c6d45 123 @param FfsHeader Points to the FFS file header to be checked\r
162ed594 124\r
022c6d45 125 @retval TRUE Checksum verification passed\r
162ed594 126 @retval FALSE Checksum verification failed\r
127\r
128**/\r
28a00297 129BOOLEAN\r
130VerifyHeaderChecksum (\r
131 IN EFI_FFS_FILE_HEADER *FfsHeader\r
132 )\r
28a00297 133{\r
deff65a4 134 UINT8 HeaderChecksum;\r
28a00297 135\r
6c85d162
SZ
136 if (IS_FFS_FILE2 (FfsHeader)) {\r
137 HeaderChecksum = CalculateSum8 ((UINT8 *) FfsHeader, sizeof (EFI_FFS_FILE_HEADER2));\r
138 } else {\r
139 HeaderChecksum = CalculateSum8 ((UINT8 *) FfsHeader, sizeof (EFI_FFS_FILE_HEADER));\r
140 }\r
28a00297 141 HeaderChecksum = (UINT8) (HeaderChecksum - FfsHeader->State - FfsHeader->IntegrityCheck.Checksum.File);\r
142\r
143 if (HeaderChecksum == 0) {\r
144 return TRUE;\r
145 } else {\r
146 return FALSE;\r
147 }\r
148}\r
149\r
150\r
162ed594 151\r
152/**\r
153 Check if it's a valid FFS file header.\r
154\r
022c6d45 155 @param ErasePolarity Erase polarity attribute of the firmware volume\r
156 @param FfsHeader Points to the FFS file header to be checked\r
157 @param FileState FFS file state to be returned\r
162ed594 158\r
022c6d45 159 @retval TRUE Valid FFS file header\r
162ed594 160 @retval FALSE Invalid FFS file header\r
161\r
162**/\r
28a00297 163BOOLEAN\r
164IsValidFfsHeader (\r
165 IN UINT8 ErasePolarity,\r
166 IN EFI_FFS_FILE_HEADER *FfsHeader,\r
167 OUT EFI_FFS_FILE_STATE *FileState\r
168 )\r
28a00297 169{\r
170 *FileState = GetFileState (ErasePolarity, FfsHeader);\r
171\r
172 switch (*FileState) {\r
e94a9ff7 173 case EFI_FILE_HEADER_VALID:\r
174 case EFI_FILE_DATA_VALID:\r
175 case EFI_FILE_MARKED_FOR_UPDATE:\r
176 case EFI_FILE_DELETED:\r
177 //\r
178 // Here we need to verify header checksum\r
179 //\r
180 return VerifyHeaderChecksum (FfsHeader);\r
022c6d45 181\r
e94a9ff7 182 case EFI_FILE_HEADER_CONSTRUCTION:\r
183 case EFI_FILE_HEADER_INVALID:\r
184 default:\r
185 return FALSE;\r
28a00297 186 }\r
187}\r
188\r
189\r
162ed594 190/**\r
191 Check if it's a valid FFS file.\r
192 Here we are sure that it has a valid FFS file header since we must call IsValidFfsHeader() first.\r
193\r
022c6d45 194 @param ErasePolarity Erase polarity attribute of the firmware volume\r
195 @param FfsHeader Points to the FFS file to be checked\r
162ed594 196\r
022c6d45 197 @retval TRUE Valid FFS file\r
162ed594 198 @retval FALSE Invalid FFS file\r
199\r
200**/\r
28a00297 201BOOLEAN\r
202IsValidFfsFile (\r
203 IN UINT8 ErasePolarity,\r
204 IN EFI_FFS_FILE_HEADER *FfsHeader\r
205 )\r
28a00297 206{\r
207 EFI_FFS_FILE_STATE FileState;\r
89cd8129 208 UINT8 DataCheckSum;\r
28a00297 209\r
210 FileState = GetFileState (ErasePolarity, FfsHeader);\r
211 switch (FileState) {\r
212\r
e94a9ff7 213 case EFI_FILE_DELETED:\r
214 case EFI_FILE_DATA_VALID:\r
215 case EFI_FILE_MARKED_FOR_UPDATE:\r
89cd8129 216 DataCheckSum = FFS_FIXED_CHECKSUM;\r
89cd8129 217 if ((FfsHeader->Attributes & FFS_ATTRIB_CHECKSUM) == FFS_ATTRIB_CHECKSUM) {\r
6c85d162
SZ
218 if (IS_FFS_FILE2 (FfsHeader)) {\r
219 DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER2), FFS_FILE2_SIZE (FfsHeader) - sizeof(EFI_FFS_FILE_HEADER2));\r
220 } else {\r
221 DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER), FFS_FILE_SIZE (FfsHeader) - sizeof(EFI_FFS_FILE_HEADER));\r
222 }\r
89cd8129
LG
223 }\r
224 if (FfsHeader->IntegrityCheck.Checksum.File == DataCheckSum) {\r
225 return TRUE;\r
226 }\r
28a00297 227\r
e94a9ff7 228 default:\r
229 return FALSE;\r
28a00297 230 }\r
231}\r
232\r
162ed594 233\r