]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportFile.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbSupportFile.c
CommitLineData
e8a5ac7c 1/** @file\r
748edcd5 2\r
e8a5ac7c 3Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
9d510e61 4SPDX-License-Identifier: BSD-2-Clause-Patent\r
748edcd5 5\r
748edcd5 6\r
e8a5ac7c 7**/\r
748edcd5 8\r
e8a5ac7c 9#include "Edb.h"\r
748edcd5 10\r
e8a5ac7c
DB
11/**\r
12 Read a file.\r
748edcd5 13\r
e8a5ac7c
DB
14 @param Vol - File System Volume\r
15 @param FileName - The file to be read.\r
16 @param BufferSize - The file buffer size\r
17 @param Buffer - The file buffer\r
748edcd5 18\r
e8a5ac7c
DB
19 @retval EFI_SUCCESS - read file successfully\r
20 @retval EFI_NOT_FOUND - file not found\r
748edcd5 21\r
e8a5ac7c 22**/\r
748edcd5
PB
23EFI_STATUS\r
24EFIAPI\r
25ReadFileFromVol (\r
1436aea4
MK
26 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol,\r
27 IN CHAR16 *FileName,\r
28 OUT UINTN *BufferSize,\r
29 OUT VOID **Buffer\r
748edcd5 30 )\r
748edcd5 31{\r
1436aea4
MK
32 EFI_STATUS Status;\r
33 EFI_FILE_HANDLE RootDir;\r
34 EFI_FILE_HANDLE Handle;\r
35 UINTN FileInfoSize;\r
36 EFI_FILE_INFO *FileInfo;\r
37 UINTN TempBufferSize;\r
38 VOID *TempBuffer;\r
748edcd5
PB
39\r
40 //\r
41 // Open the root directory\r
42 //\r
43 Status = Vol->OpenVolume (Vol, &RootDir);\r
44 if (EFI_ERROR (Status)) {\r
45 return Status;\r
46 }\r
47\r
48 //\r
49 // Open the file\r
50 //\r
51 Status = RootDir->Open (\r
52 RootDir,\r
53 &Handle,\r
54 FileName,\r
55 EFI_FILE_MODE_READ,\r
56 0\r
57 );\r
58 if (EFI_ERROR (Status)) {\r
59 RootDir->Close (RootDir);\r
60 return Status;\r
61 }\r
62\r
63 RootDir->Close (RootDir);\r
64\r
65 //\r
66 // Get the file information\r
67 //\r
1436aea4 68 FileInfoSize = sizeof (EFI_FILE_INFO) + 1024;\r
748edcd5
PB
69\r
70 FileInfo = AllocateZeroPool (FileInfoSize);\r
71 if (FileInfo == NULL) {\r
72 Handle->Close (Handle);\r
73 return Status;\r
74 }\r
75\r
76 Status = Handle->GetInfo (\r
77 Handle,\r
78 &gEfiFileInfoGuid,\r
79 &FileInfoSize,\r
80 FileInfo\r
81 );\r
82 if (EFI_ERROR (Status)) {\r
83 Handle->Close (Handle);\r
84 gBS->FreePool (FileInfo);\r
85 return Status;\r
86 }\r
87\r
88 //\r
89 // Allocate buffer for the file data. The last CHAR16 is for L'\0'\r
90 //\r
1436aea4
MK
91 TempBufferSize = (UINTN)FileInfo->FileSize + sizeof (CHAR16);\r
92 TempBuffer = AllocateZeroPool (TempBufferSize);\r
748edcd5
PB
93 if (TempBuffer == NULL) {\r
94 Handle->Close (Handle);\r
95 gBS->FreePool (FileInfo);\r
96 return Status;\r
97 }\r
98\r
99 gBS->FreePool (FileInfo);\r
100\r
101 //\r
102 // Read the file data to the buffer\r
103 //\r
104 Status = Handle->Read (\r
105 Handle,\r
106 &TempBufferSize,\r
107 TempBuffer\r
108 );\r
109 if (EFI_ERROR (Status)) {\r
110 Handle->Close (Handle);\r
111 gBS->FreePool (TempBuffer);\r
112 return Status;\r
113 }\r
114\r
115 Handle->Close (Handle);\r
116\r
117 *BufferSize = TempBufferSize;\r
118 *Buffer = TempBuffer;\r
119 return EFI_SUCCESS;\r
120}\r
121\r
e8a5ac7c
DB
122/**\r
123\r
124 Read a file.\r
125 If ScanFs is FLASE, it will use DebuggerPrivate->Vol as default Fs.\r
126 If ScanFs is TRUE, it will scan all FS and check the file.\r
127 If there is only one file match the name, it will be read.\r
128 If there is more than one file match the name, it will return Error.\r
129\r
130 @param DebuggerPrivate - EBC Debugger private data structure\r
131 @param FileName - The file to be read.\r
132 @param BufferSize - The file buffer size\r
133 @param Buffer - The file buffer\r
134 @param ScanFs - Need Scan all FS\r
135\r
136 @retval EFI_SUCCESS - read file successfully\r
137 @retval EFI_NOT_FOUND - file not found\r
138 @retval EFI_NO_MAPPING - there is duplicated files found\r
139\r
140**/\r
748edcd5
PB
141EFI_STATUS\r
142EFIAPI\r
143ReadFileToBuffer (\r
1436aea4
MK
144 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
145 IN CHAR16 *FileName,\r
146 OUT UINTN *BufferSize,\r
147 OUT VOID **Buffer,\r
148 IN BOOLEAN ScanFs\r
748edcd5 149 )\r
748edcd5 150{\r
1436aea4
MK
151 EFI_STATUS Status;\r
152 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol;\r
153 UINTN TempBufferSize;\r
154 VOID *TempBuffer;\r
155 UINTN NoHandles;\r
156 EFI_HANDLE *HandleBuffer;\r
157 UINTN Index;\r
748edcd5
PB
158\r
159 //\r
160 // Check parameters\r
161 //\r
162 if ((FileName == NULL) || (Buffer == NULL)) {\r
163 return EFI_INVALID_PARAMETER;\r
164 }\r
165\r
166 //\r
167 // not scan fs\r
168 //\r
169 if (!ScanFs) {\r
170 if (DebuggerPrivate->Vol == NULL) {\r
171 return EFI_INVALID_PARAMETER;\r
172 }\r
1436aea4 173\r
748edcd5
PB
174 //\r
175 // Read file directly from Vol\r
176 //\r
177 return ReadFileFromVol (DebuggerPrivate->Vol, FileName, BufferSize, Buffer);\r
178 }\r
179\r
180 //\r
181 // need scan fs\r
182 //\r
183\r
184 //\r
185 // Get all Vol handle\r
186 //\r
187 Status = gBS->LocateHandleBuffer (\r
1436aea4
MK
188 ByProtocol,\r
189 &gEfiSimpleFileSystemProtocolGuid,\r
190 NULL,\r
191 &NoHandles,\r
192 &HandleBuffer\r
193 );\r
748edcd5
PB
194 if (EFI_ERROR (Status) && (NoHandles == 0)) {\r
195 return EFI_NOT_FOUND;\r
196 }\r
197\r
198 //\r
199 // Walk through each Vol\r
200 //\r
201 DebuggerPrivate->Vol = NULL;\r
1436aea4
MK
202 *BufferSize = 0;\r
203 *Buffer = NULL;\r
748edcd5
PB
204 for (Index = 0; Index < NoHandles; Index++) {\r
205 Status = gBS->HandleProtocol (\r
206 HandleBuffer[Index],\r
207 &gEfiSimpleFileSystemProtocolGuid,\r
1436aea4 208 (VOID **)&Vol\r
748edcd5 209 );\r
1436aea4 210 if (EFI_ERROR (Status)) {\r
748edcd5
PB
211 continue;\r
212 }\r
213\r
214 Status = ReadFileFromVol (Vol, FileName, &TempBufferSize, &TempBuffer);\r
215 if (!EFI_ERROR (Status)) {\r
216 //\r
217 // Read file OK, check duplication\r
218 //\r
219 if (DebuggerPrivate->Vol != NULL) {\r
220 //\r
221 // Find the duplicated file\r
222 //\r
223 gBS->FreePool (TempBuffer);\r
224 gBS->FreePool (*Buffer);\r
225 EDBPrint (L"Duplicated FileName found!\n");\r
226 return EFI_NO_MAPPING;\r
227 } else {\r
228 //\r
229 // Record value\r
230 //\r
231 DebuggerPrivate->Vol = Vol;\r
1436aea4
MK
232 *BufferSize = TempBufferSize;\r
233 *Buffer = TempBuffer;\r
748edcd5
PB
234 }\r
235 }\r
236 }\r
237\r
238 //\r
239 // Scan Fs done\r
240 //\r
241 if (DebuggerPrivate->Vol == NULL) {\r
242 return EFI_NOT_FOUND;\r
243 }\r
244\r
245 //\r
246 // Done\r
247 //\r
248 return EFI_SUCCESS;\r
249}\r
250\r
e8a5ac7c
DB
251/**\r
252\r
253 Get file name under this dir with index\r
254\r
255 @param DebuggerPrivate - EBC Debugger private data structure\r
256 @param DirName - The dir to be read.\r
257 @param FileName - The file name pattern under this dir\r
258 @param Index - The file index under this dir\r
259\r
260 @return File Name which match the pattern and index.\r
261\r
262**/\r
748edcd5
PB
263CHAR16 *\r
264EFIAPI\r
265GetFileNameUnderDir (\r
1436aea4
MK
266 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
267 IN CHAR16 *DirName,\r
268 IN CHAR16 *FileName,\r
269 IN OUT UINTN *Index\r
748edcd5 270 )\r
748edcd5 271{\r
1436aea4
MK
272 EFI_STATUS Status;\r
273 EFI_FILE_HANDLE RootDir;\r
274 EFI_FILE_HANDLE Handle;\r
275 UINTN FileInfoSize;\r
276 EFI_FILE_INFO *FileInfo;\r
277 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol;\r
278 VOID *TempName;\r
279 UINTN FileIndex;\r
748edcd5
PB
280\r
281 if (DebuggerPrivate->Vol == NULL) {\r
282 Status = gBS->LocateProtocol (\r
283 &gEfiSimpleFileSystemProtocolGuid,\r
284 NULL,\r
1436aea4 285 (VOID **)&DebuggerPrivate->Vol\r
748edcd5 286 );\r
1436aea4 287 if (EFI_ERROR (Status)) {\r
748edcd5
PB
288 return NULL;\r
289 }\r
290 }\r
1436aea4 291\r
748edcd5
PB
292 Vol = DebuggerPrivate->Vol;\r
293\r
294 //\r
295 // Open the root directory\r
296 //\r
297 Status = Vol->OpenVolume (Vol, &RootDir);\r
298 if (EFI_ERROR (Status)) {\r
299 return NULL;\r
300 }\r
301\r
302 //\r
303 // Open the file\r
304 //\r
305 Status = RootDir->Open (\r
306 RootDir,\r
307 &Handle,\r
308 DirName,\r
309 EFI_FILE_MODE_READ,\r
310 EFI_FILE_DIRECTORY\r
311 );\r
312 if (EFI_ERROR (Status)) {\r
313 RootDir->Close (RootDir);\r
314 return NULL;\r
315 }\r
1436aea4 316\r
748edcd5
PB
317 RootDir->Close (RootDir);\r
318\r
319 //\r
320 // Set Dir Position\r
321 //\r
322 Status = Handle->SetPosition (Handle, 0);\r
323 if (EFI_ERROR (Status)) {\r
324 Handle->Close (Handle);\r
325 return NULL;\r
326 }\r
327\r
328 //\r
329 // Get the file information\r
330 //\r
1436aea4 331 FileInfoSize = sizeof (EFI_FILE_INFO) + 1024;\r
748edcd5
PB
332\r
333 FileInfo = AllocateZeroPool (FileInfoSize);\r
334 if (FileInfo == NULL) {\r
335 Handle->Close (Handle);\r
336 return NULL;\r
337 }\r
338\r
339 //\r
340 // Walk through each file in the directory\r
341 //\r
342 FileIndex = 0;\r
1436aea4 343 TempName = NULL;\r
748edcd5
PB
344 while (TRUE) {\r
345 //\r
346 // Read a file entry\r
347 //\r
1436aea4 348 FileInfoSize = sizeof (EFI_FILE_INFO) + 1024;\r
748edcd5
PB
349\r
350 Status = Handle->Read (\r
351 Handle,\r
352 &FileInfoSize,\r
353 FileInfo\r
354 );\r
355 if (EFI_ERROR (Status) || (FileInfoSize == 0)) {\r
356 break;\r
357 }\r
358\r
359 if ((FileInfo->Attribute & EFI_FILE_DIRECTORY) == 0) {\r
360 //\r
361 // This is a file\r
362 //\r
363\r
364 //\r
365 // Only deal with the EFI key file\r
366 //\r
367 if (!StrEndWith (FileInfo->FileName, FileName)) {\r
368 continue;\r
369 }\r
370\r
371 if (FileIndex == *Index) {\r
372 TempName = StrDuplicate (FileInfo->FileName);\r
1436aea4 373 *Index = *Index + 1;\r
748edcd5
PB
374 break;\r
375 }\r
1436aea4
MK
376\r
377 FileIndex++;\r
748edcd5
PB
378 }\r
379 }\r
380\r
381 //\r
382 // Free resources\r
383 //\r
384 gBS->FreePool (FileInfo);\r
385 Handle->Close (Handle);\r
386\r
387 return TempName;\r
388}\r