]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/Misc.c
Clean PI_SPECIFICATION_VERSION and EFI_SPECIFICATION_VERSION.
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / Misc.c
CommitLineData
b9ec9330
QH
1/*++\r
2\r
3Copyright (c) 2005, Intel Corporation\r
4All rights reserved. This program and the accompanying materials are licensed and made available\r
5under the terms and conditions of the BSD License which accompanies this\r
6distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12\r
13Module Name:\r
14\r
15 Misc.c\r
16\r
17Abstract:\r
18\r
19 Miscellaneous functions\r
20\r
21Revision History\r
22\r
23--*/\r
24\r
25#include "Fat.h"\r
26\r
27EFI_STATUS\r
28FatAccessVolumeDirty (\r
29 IN FAT_VOLUME *Volume,\r
30 IN IO_MODE IoMode,\r
31 IN VOID *DirtyValue\r
32 )\r
33/*++\r
34\r
35Routine Description:\r
36\r
37 Set the volume as dirty or not\r
38\r
39Arguments:\r
40\r
41 Volume - FAT file system volume.\r
42 IoMode - The access mode.\r
43 DirtyValue - Set the volume as dirty or not.\r
44\r
45Returns:\r
46\r
47 EFI_SUCCESS - Set the new FAT entry value sucessfully.\r
48 other - An error occurred when operation the FAT entries.\r
49\r
50--*/\r
51{\r
52 UINTN WriteCount;\r
53\r
54 WriteCount = Volume->FatEntrySize;\r
55 return FatDiskIo (Volume, IoMode, Volume->FatPos + WriteCount, WriteCount, DirtyValue);\r
56}\r
57\r
58EFI_STATUS\r
59FatDiskIo (\r
60 IN FAT_VOLUME *Volume,\r
61 IN IO_MODE IoMode,\r
62 IN UINT64 Offset,\r
63 IN UINTN BufferSize,\r
64 IN OUT VOID *Buffer\r
65 )\r
66/*++\r
67\r
68Routine Description:\r
69\r
70 General disk access function\r
71\r
72Arguments:\r
73\r
74 Volume - FAT file system volume.\r
75 IoMode - The access mode (disk read/write or cache access).\r
76 Offset - The starting byte offset to read from.\r
77 BufferSize - Size of Buffer.\r
78 Buffer - Buffer containing read data.\r
79\r
80Returns:\r
81\r
82 EFI_SUCCESS - The operation is performed successfully.\r
83 EFI_VOLUME_CORRUPTED - The accesss is\r
84 Others - The status of read/write the disk\r
85\r
86--*/\r
87{\r
88 EFI_STATUS Status;\r
89 EFI_DISK_IO_PROTOCOL *DiskIo;\r
90 EFI_DISK_READ IoFunction;\r
91\r
92 //\r
93 // Verify the IO is in devices range\r
94 //\r
95 Status = EFI_VOLUME_CORRUPTED;\r
96 if (Offset + BufferSize <= Volume->VolumeSize) {\r
97 if (CACHE_ENABLED (IoMode)) {\r
98 //\r
99 // Access cache\r
100 //\r
101 Status = FatAccessCache (Volume, CACHE_TYPE (IoMode), RAW_ACCESS (IoMode), Offset, BufferSize, Buffer);\r
102 } else {\r
103 //\r
104 // Access disk directly\r
105 //\r
106 DiskIo = Volume->DiskIo;\r
107 IoFunction = (IoMode == READ_DISK) ? DiskIo->ReadDisk : DiskIo->WriteDisk;\r
108 Status = IoFunction (DiskIo, Volume->MediaId, Offset, BufferSize, Buffer);\r
109 }\r
110 }\r
111\r
112 if (EFI_ERROR (Status)) {\r
113 Volume->DiskError = TRUE;\r
114 DEBUG ((EFI_D_INFO, "FatDiskIo: error %r\n", Status));\r
115 }\r
116\r
117 return Status;\r
118}\r
119\r
120VOID\r
121FatAcquireLock (\r
122 VOID\r
123 )\r
124/*++\r
125\r
126Routine Description:\r
127\r
128 Lock the volume.\r
129\r
130Arguments:\r
131\r
132 None.\r
133\r
134Returns:\r
135\r
136 None.\r
137\r
138--*/\r
139{\r
140 EfiAcquireLock (&FatFsLock);\r
141}\r
142\r
143BOOLEAN\r
144FatIsLocked (\r
145 VOID\r
146 )\r
147/*++\r
148\r
149Routine Description:\r
150\r
151 Get the locking status of the volume.\r
152\r
153Arguments:\r
154\r
155 None.\r
156\r
157Returns:\r
158\r
159 TRUE - The volume is locked.\r
160 FALSE - The volume is not locked.\r
161\r
162--*/\r
163{\r
164 return (BOOLEAN) (FatFsLock.Lock);\r
165}\r
166\r
167VOID\r
168FatReleaseLock (\r
169 VOID\r
170 )\r
171/*++\r
172\r
173Routine Description:\r
174\r
175 Unlock the volume.\r
176\r
177Arguments:\r
178\r
179 Null.\r
180\r
181Returns:\r
182\r
183 None.\r
184\r
185--*/\r
186{\r
187 EfiReleaseLock (&FatFsLock);\r
188}\r
189\r
190VOID\r
191FatFreeDirEnt (\r
192 IN FAT_DIRENT *DirEnt\r
193 )\r
194/*++\r
195\r
196Routine Description:\r
197\r
198 Free directory entry.\r
199\r
200Arguments:\r
201\r
202 DirEnt - The directory entry to be freed.\r
203\r
204Returns:\r
205\r
206 None.\r
207\r
208--*/\r
209{\r
210 if (DirEnt->FileString != NULL) {\r
211 FreePool (DirEnt->FileString);\r
212 }\r
213\r
214 FreePool (DirEnt);\r
215}\r
216\r
217VOID\r
218FatFreeVolume (\r
219 IN FAT_VOLUME *Volume\r
220 )\r
221/*++\r
222\r
223Routine Description:\r
224\r
225 Free volume structure (including the contents of directory cache and disk cache).\r
226\r
227Arguments:\r
228\r
229 Volume - The volume structure to be freed.\r
230\r
231Returns:\r
232\r
233 None.\r
234\r
235--*/\r
236{\r
237 //\r
238 // Free disk cache\r
239 //\r
240 if (Volume->CacheBuffer != NULL) {\r
241 FreePool (Volume->CacheBuffer);\r
242 }\r
243 //\r
244 // Free directory cache\r
245 //\r
246 FatCleanupODirCache (Volume);\r
247 FreePool (Volume);\r
248}\r
249\r
250VOID\r
251FatEfiTimeToFatTime (\r
252 IN EFI_TIME *ETime,\r
253 OUT FAT_DATE_TIME *FTime\r
254 )\r
255/*++\r
256\r
257Routine Description:\r
258\r
259 Translate EFI time to FAT time.\r
260\r
261Arguments:\r
262\r
263 ETime - The time of EFI_TIME.\r
264 FTime - The time of FAT_DATE_TIME.\r
265\r
266Returns:\r
267\r
268 None.\r
269\r
270--*/\r
271{\r
272 //\r
273 // ignores timezone info in source ETime\r
274 //\r
275 if (ETime->Year > 1980) {\r
276 FTime->Date.Year = (UINT16) (ETime->Year - 1980);\r
277 }\r
278\r
279 if (ETime->Year >= 1980 + FAT_MAX_YEAR_FROM_1980) {\r
280 FTime->Date.Year = FAT_MAX_YEAR_FROM_1980;\r
281 }\r
282\r
283 FTime->Date.Month = ETime->Month;\r
284 FTime->Date.Day = ETime->Day;\r
285 FTime->Time.Hour = ETime->Hour;\r
286 FTime->Time.Minute = ETime->Minute;\r
287 FTime->Time.DoubleSecond = (UINT16) (ETime->Second / 2);\r
288}\r
289\r
290VOID\r
291FatFatTimeToEfiTime (\r
292 IN FAT_DATE_TIME *FTime,\r
293 OUT EFI_TIME *ETime\r
294 )\r
295/*++\r
296\r
297Routine Description:\r
298\r
299 Translate Fat time to EFI time.\r
300\r
301Arguments:\r
302\r
303 FTime - The time of FAT_DATE_TIME.\r
304 ETime - The time of EFI_TIME.\r
305\r
306Returns:\r
307\r
308 None.\r
309\r
310--*/\r
311{\r
312 ETime->Year = (UINT16) (FTime->Date.Year + 1980);\r
313 ETime->Month = (UINT8) FTime->Date.Month;\r
314 ETime->Day = (UINT8) FTime->Date.Day;\r
315 ETime->Hour = (UINT8) FTime->Time.Hour;\r
316 ETime->Minute = (UINT8) FTime->Time.Minute;\r
317 ETime->Second = (UINT8) (FTime->Time.DoubleSecond * 2);\r
318 ETime->Nanosecond = 0;\r
319 ETime->TimeZone = EFI_UNSPECIFIED_TIMEZONE;\r
320 ETime->Daylight = 0;\r
321}\r
322\r
323VOID\r
324FatGetCurrentFatTime (\r
325 OUT FAT_DATE_TIME *FatNow\r
326 )\r
327/*++\r
328\r
329Routine Description:\r
330\r
331 Get Current FAT time.\r
332\r
333Arguments:\r
334\r
335 FatNow - Current FAT time.\r
336\r
337Returns:\r
338\r
339 None.\r
340\r
341--*/\r
342{\r
343 EFI_TIME Now;\r
344 gRT->GetTime (&Now, NULL);\r
345 FatEfiTimeToFatTime (&Now, FatNow);\r
346}\r
347\r
348BOOLEAN\r
349FatIsValidTime (\r
350 IN EFI_TIME *Time\r
351 )\r
352/*++\r
353\r
354Routine Description:\r
355\r
356 Check whether a time is valid.\r
357\r
358Arguments:\r
359\r
360 Time - The time of EFI_TIME.\r
361\r
362Returns:\r
363\r
364 TRUE - The time is valid.\r
365 FALSE - The time is not valid.\r
366\r
367--*/\r
368{\r
369 static UINT8 MonthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\r
370 UINTN Day;\r
371 BOOLEAN ValidTime;\r
372\r
373 ValidTime = TRUE;\r
374\r
375 //\r
376 // Check the fields for range problems\r
377 // Fat can only support from 1980\r
378 //\r
379 if (Time->Year < 1980 ||\r
380 Time->Month < 1 ||\r
381 Time->Month > 12 ||\r
382 Time->Day < 1 ||\r
383 Time->Day > 31 ||\r
384 Time->Hour > 23 ||\r
385 Time->Minute > 59 ||\r
386 Time->Second > 59 ||\r
387 Time->Nanosecond > 999999999\r
388 ) {\r
389\r
390 ValidTime = FALSE;\r
391\r
392 } else {\r
393 //\r
394 // Perform a more specific check of the day of the month\r
395 //\r
396 Day = MonthDays[Time->Month - 1];\r
397 if (Time->Month == 2 && IS_LEAP_YEAR (Time->Year)) {\r
398 Day += 1;\r
399 //\r
400 // 1 extra day this month\r
401 //\r
402 }\r
403 if (Time->Day > Day) {\r
404 ValidTime = FALSE;\r
405 }\r
406 }\r
407\r
408 return ValidTime;\r
409}\r