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