]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Core/Dxe/FwVol/Ffs.c
MdeModulePkg: Apply uncrustify changes
[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
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
28a00297 6\r
504214c4 7**/\r
28a00297 8\r
9c4ac31c 9#include "DxeMain.h"\r
ec90508b 10#include "FwVolDriver.h"\r
28a00297 11\r
162ed594 12/**\r
13 Get the FFS file state by checking the highest bit set in the header's state field.\r
14\r
022c6d45 15 @param ErasePolarity Erase polarity attribute of the firmware volume\r
16 @param FfsHeader Points to the FFS file header\r
162ed594 17\r
18 @return FFS File state\r
19\r
20**/\r
28a00297 21EFI_FFS_FILE_STATE\r
22GetFileState (\r
23 IN UINT8 ErasePolarity,\r
24 IN EFI_FFS_FILE_HEADER *FfsHeader\r
25 )\r
28a00297 26{\r
1436aea4
MK
27 EFI_FFS_FILE_STATE FileState;\r
28 UINT8 HighestBit;\r
28a00297 29\r
30 FileState = FfsHeader->State;\r
31\r
32 if (ErasePolarity != 0) {\r
1436aea4 33 FileState = (EFI_FFS_FILE_STATE) ~FileState;\r
28a00297 34 }\r
35\r
36 HighestBit = 0x80;\r
37 while (HighestBit != 0 && ((HighestBit & FileState) == 0)) {\r
38 HighestBit >>= 1;\r
39 }\r
40\r
1436aea4 41 return (EFI_FFS_FILE_STATE)HighestBit;\r
28a00297 42}\r
43\r
162ed594 44/**\r
45 Check if a block of buffer is erased.\r
46\r
022c6d45 47 @param ErasePolarity Erase polarity attribute of the firmware volume\r
48 @param InBuffer The buffer to be checked\r
49 @param BufferSize Size of the buffer in bytes\r
162ed594 50\r
022c6d45 51 @retval TRUE The block of buffer is erased\r
162ed594 52 @retval FALSE The block of buffer is not erased\r
53\r
54**/\r
28a00297 55BOOLEAN\r
56IsBufferErased (\r
1436aea4
MK
57 IN UINT8 ErasePolarity,\r
58 IN VOID *InBuffer,\r
59 IN UINTN BufferSize\r
28a00297 60 )\r
28a00297 61{\r
1436aea4
MK
62 UINTN Count;\r
63 UINT8 EraseByte;\r
64 UINT8 *Buffer;\r
28a00297 65\r
1436aea4 66 if (ErasePolarity == 1) {\r
28a00297 67 EraseByte = 0xFF;\r
68 } else {\r
69 EraseByte = 0;\r
70 }\r
71\r
72 Buffer = InBuffer;\r
73 for (Count = 0; Count < BufferSize; Count++) {\r
74 if (Buffer[Count] != EraseByte) {\r
75 return FALSE;\r
76 }\r
77 }\r
78\r
79 return TRUE;\r
80}\r
81\r
162ed594 82/**\r
83 Verify checksum of the firmware volume header.\r
84\r
022c6d45 85 @param FvHeader Points to the firmware volume header to be checked\r
162ed594 86\r
022c6d45 87 @retval TRUE Checksum verification passed\r
162ed594 88 @retval FALSE Checksum verification failed\r
89\r
90**/\r
28a00297 91BOOLEAN\r
92VerifyFvHeaderChecksum (\r
1436aea4 93 IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader\r
28a00297 94 )\r
28a00297 95{\r
28a00297 96 UINT16 Checksum;\r
28a00297 97\r
1436aea4 98 Checksum = CalculateSum16 ((UINT16 *)FvHeader, FvHeader->HeaderLength);\r
28a00297 99\r
100 if (Checksum == 0) {\r
101 return TRUE;\r
102 } else {\r
103 return FALSE;\r
104 }\r
105}\r
106\r
162ed594 107/**\r
108 Verify checksum of the FFS file header.\r
109\r
022c6d45 110 @param FfsHeader Points to the FFS file header to be checked\r
162ed594 111\r
022c6d45 112 @retval TRUE Checksum verification passed\r
162ed594 113 @retval FALSE Checksum verification failed\r
114\r
115**/\r
28a00297 116BOOLEAN\r
117VerifyHeaderChecksum (\r
118 IN EFI_FFS_FILE_HEADER *FfsHeader\r
119 )\r
28a00297 120{\r
1436aea4 121 UINT8 HeaderChecksum;\r
28a00297 122\r
6c85d162 123 if (IS_FFS_FILE2 (FfsHeader)) {\r
1436aea4 124 HeaderChecksum = CalculateSum8 ((UINT8 *)FfsHeader, sizeof (EFI_FFS_FILE_HEADER2));\r
6c85d162 125 } else {\r
1436aea4 126 HeaderChecksum = CalculateSum8 ((UINT8 *)FfsHeader, sizeof (EFI_FFS_FILE_HEADER));\r
6c85d162 127 }\r
1436aea4
MK
128\r
129 HeaderChecksum = (UINT8)(HeaderChecksum - FfsHeader->State - FfsHeader->IntegrityCheck.Checksum.File);\r
28a00297 130\r
131 if (HeaderChecksum == 0) {\r
132 return TRUE;\r
133 } else {\r
134 return FALSE;\r
135 }\r
136}\r
137\r
162ed594 138/**\r
139 Check if it's a valid FFS file header.\r
140\r
022c6d45 141 @param ErasePolarity Erase polarity attribute of the firmware volume\r
142 @param FfsHeader Points to the FFS file header to be checked\r
143 @param FileState FFS file state to be returned\r
162ed594 144\r
022c6d45 145 @retval TRUE Valid FFS file header\r
162ed594 146 @retval FALSE Invalid FFS file header\r
147\r
148**/\r
28a00297 149BOOLEAN\r
150IsValidFfsHeader (\r
151 IN UINT8 ErasePolarity,\r
152 IN EFI_FFS_FILE_HEADER *FfsHeader,\r
153 OUT EFI_FFS_FILE_STATE *FileState\r
154 )\r
28a00297 155{\r
156 *FileState = GetFileState (ErasePolarity, FfsHeader);\r
157\r
158 switch (*FileState) {\r
1436aea4
MK
159 case EFI_FILE_HEADER_VALID:\r
160 case EFI_FILE_DATA_VALID:\r
161 case EFI_FILE_MARKED_FOR_UPDATE:\r
162 case EFI_FILE_DELETED:\r
163 //\r
164 // Here we need to verify header checksum\r
165 //\r
166 return VerifyHeaderChecksum (FfsHeader);\r
167\r
168 case EFI_FILE_HEADER_CONSTRUCTION:\r
169 case EFI_FILE_HEADER_INVALID:\r
170 default:\r
171 return FALSE;\r
28a00297 172 }\r
173}\r
174\r
162ed594 175/**\r
176 Check if it's a valid FFS file.\r
177 Here we are sure that it has a valid FFS file header since we must call IsValidFfsHeader() first.\r
178\r
022c6d45 179 @param ErasePolarity Erase polarity attribute of the firmware volume\r
180 @param FfsHeader Points to the FFS file to be checked\r
162ed594 181\r
022c6d45 182 @retval TRUE Valid FFS file\r
162ed594 183 @retval FALSE Invalid FFS file\r
184\r
185**/\r
28a00297 186BOOLEAN\r
187IsValidFfsFile (\r
188 IN UINT8 ErasePolarity,\r
189 IN EFI_FFS_FILE_HEADER *FfsHeader\r
190 )\r
28a00297 191{\r
192 EFI_FFS_FILE_STATE FileState;\r
89cd8129 193 UINT8 DataCheckSum;\r
28a00297 194\r
195 FileState = GetFileState (ErasePolarity, FfsHeader);\r
196 switch (FileState) {\r
1436aea4
MK
197 case EFI_FILE_DELETED:\r
198 case EFI_FILE_DATA_VALID:\r
199 case EFI_FILE_MARKED_FOR_UPDATE:\r
200 DataCheckSum = FFS_FIXED_CHECKSUM;\r
201 if ((FfsHeader->Attributes & FFS_ATTRIB_CHECKSUM) == FFS_ATTRIB_CHECKSUM) {\r
202 if (IS_FFS_FILE2 (FfsHeader)) {\r
203 DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *)FfsHeader + sizeof (EFI_FFS_FILE_HEADER2), FFS_FILE2_SIZE (FfsHeader) - sizeof (EFI_FFS_FILE_HEADER2));\r
204 } else {\r
205 DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *)FfsHeader + sizeof (EFI_FFS_FILE_HEADER), FFS_FILE_SIZE (FfsHeader) - sizeof (EFI_FFS_FILE_HEADER));\r
206 }\r
207 }\r
28a00297 208\r
1436aea4
MK
209 if (FfsHeader->IntegrityCheck.Checksum.File == DataCheckSum) {\r
210 return TRUE;\r
6c85d162 211 }\r
28a00297 212\r
1436aea4
MK
213 default:\r
214 return FALSE;\r
28a00297 215 }\r
216}\r