]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/VariablePei/Variable.c
Fix missing include header file and fix typo in comment.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / VariablePei / Variable.c
CommitLineData
3dbba770 1/** @file\r
bcd70414 2 Framework PEIM to provide the Variable functionality\r
3 \r
de631489 4Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
7ba905c9 5All rights reserved. This program and the accompanying materials\r
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
12Module Name:\r
13\r
3dbba770 14**/\r
7ba905c9 15\r
16\r
17#include "Variable.h"\r
18\r
19//\r
20// Module globals\r
21//\r
22static EFI_PEI_READ_ONLY_VARIABLE_PPI mVariablePpi = {\r
23 PeiGetVariable,\r
24 PeiGetNextVariableName\r
25};\r
26\r
27static EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariable2Ppi = {\r
28 PeiGetVariable2,\r
29 PeiGetNextVariableName2\r
30};\r
31\r
32static EFI_PEI_PPI_DESCRIPTOR mPpiListVariable[] = {\r
33 {\r
34 (EFI_PEI_PPI_DESCRIPTOR_PPI),\r
35 &gEfiPeiReadOnlyVariable2PpiGuid,\r
36 &mVariable2Ppi\r
37 },\r
38 {\r
39 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
40 &gEfiPeiReadOnlyVariablePpiGuid,\r
41 &mVariablePpi\r
42 }\r
43};\r
44\r
45EFI_GUID mEfiVariableIndexTableGuid = EFI_VARIABLE_INDEX_TABLE_GUID;\r
46\r
bcd70414 47/**\r
48 Provide the functionality of the variable services.\r
49\r
50 @param FfsHeadher - The FFS file header\r
51 @param PeiServices - General purpose services available to every PEIM.\r
52\r
53 @return Status - EFI_SUCCESS if the interface could be successfully\r
54 installed\r
55\r
56**/\r
7ba905c9 57EFI_STATUS\r
58EFIAPI\r
59PeimInitializeVariableServices (\r
60 IN EFI_FFS_FILE_HEADER *FfsHeader,\r
61 IN EFI_PEI_SERVICES **PeiServices\r
62 )\r
7ba905c9 63{\r
64 //\r
65 // Publish the variable capability to other modules\r
66 //\r
507b36ca 67 return (**PeiServices).InstallPpi ((CONST EFI_PEI_SERVICES **) PeiServices, &mPpiListVariable[0]);\r
7ba905c9 68\r
69}\r
70\r
bcd70414 71/**\r
130e2569 72 This code gets the pointer to the first variable memory pointer byte\r
7ba905c9 73\r
bcd70414 74 @param VarStoreHeader Pointer to the Variable Store Header.\r
130e2569 75\r
bcd70414 76 @Return VARIABLE_HEADER* Pointer to last unavailable Variable Header\r
130e2569 77\r
bcd70414 78**/\r
79VARIABLE_HEADER *\r
80GetStartPointer (\r
81 IN VARIABLE_STORE_HEADER *VarStoreHeader\r
82 )\r
130e2569 83{\r
84 //\r
85 // The end of variable store\r
86 //\r
87 return (VARIABLE_HEADER *) HEADER_ALIGN (VarStoreHeader + 1);\r
88}\r
89\r
bcd70414 90/**\r
130e2569 91 This code gets the pointer to the last variable memory pointer byte\r
92\r
bcd70414 93 @param VarStoreHeader Pointer to the Variable Store Header.\r
130e2569 94\r
bcd70414 95 @Return VARIABLE_HEADER* Pointer to last unavailable Variable Header\r
130e2569 96\r
bcd70414 97**/\r
98VARIABLE_HEADER *\r
99GetEndPointer (\r
100 IN VARIABLE_STORE_HEADER *VarStoreHeader\r
101 )\r
7ba905c9 102\r
7ba905c9 103{\r
130e2569 104 //\r
105 // The end of variable store\r
106 //\r
107 return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VarStoreHeader + VarStoreHeader->Size);\r
7ba905c9 108}\r
109\r
bcd70414 110/**\r
111\r
112 This code checks if variable header is valid or not.\r
113\r
114 @param Variable Pointer to the Variable Header.\r
115\r
116 @retval TRUE Variable header is valid.\r
117 @retval FALSE Variable header is not valid.\r
118\r
119**/\r
7ba905c9 120STATIC\r
121BOOLEAN\r
122EFIAPI\r
123IsValidVariableHeader (\r
124 IN VARIABLE_HEADER *Variable\r
125 )\r
7ba905c9 126{\r
9cad030b 127 if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
7ba905c9 128 return FALSE;\r
129 }\r
130\r
131 return TRUE;\r
132}\r
133\r
bcd70414 134/**\r
135 This code gets the size of name of variable.\r
136\r
137 @param Variable Pointer to the Variable Header.\r
130e2569 138\r
bcd70414 139 @Return UINTN Size of variable in bytes\r
140\r
141**/\r
130e2569 142UINTN\r
143NameSizeOfVariable (\r
144 IN VARIABLE_HEADER *Variable\r
145 )\r
130e2569 146{\r
147 if (Variable->State == (UINT8) (-1) ||\r
148 Variable->DataSize == (UINT32) -1 ||\r
149 Variable->NameSize == (UINT32) -1 ||\r
150 Variable->Attributes == (UINT32) -1) {\r
151 return 0;\r
152 }\r
153 return (UINTN) Variable->NameSize;\r
154}\r
155\r
bcd70414 156/**\r
130e2569 157 This code gets the size of name of variable.\r
158\r
bcd70414 159 @param Variable Pointer to the Variable Header.\r
130e2569 160\r
bcd70414 161 @Return UINTN Size of variable in bytes\r
130e2569 162\r
bcd70414 163**/\r
164UINTN\r
165DataSizeOfVariable (\r
166 IN VARIABLE_HEADER *Variable\r
167 )\r
130e2569 168{\r
169 if (Variable->State == (UINT8) -1 ||\r
170 Variable->DataSize == (UINT32) -1 ||\r
171 Variable->NameSize == (UINT32) -1 ||\r
172 Variable->Attributes == (UINT32) -1) {\r
173 return 0;\r
174 }\r
175 return (UINTN) Variable->DataSize;\r
176}\r
177\r
bcd70414 178/**\r
130e2569 179 This code gets the pointer to the variable name.\r
180\r
bcd70414 181 @param Variable Pointer to the Variable Header.\r
130e2569 182\r
bcd70414 183 @Return CHAR16* Pointer to Variable Name\r
130e2569 184\r
bcd70414 185**/\r
186CHAR16 *\r
187GetVariableNamePtr (\r
188 IN VARIABLE_HEADER *Variable\r
189 )\r
130e2569 190\r
130e2569 191{\r
192\r
193 return (CHAR16 *) (Variable + 1);\r
194}\r
195\r
bcd70414 196/**\r
197 This code gets the pointer to the variable data.\r
198\r
199 @param Variable Pointer to the Variable Header.\r
200\r
201 @Return UINT8* Pointer to Variable Data\r
130e2569 202\r
bcd70414 203**/\r
130e2569 204UINT8 *\r
205GetVariableDataPtr (\r
206 IN VARIABLE_HEADER *Variable\r
207 )\r
130e2569 208{\r
209 UINTN Value;\r
210 \r
211 //\r
212 // Be careful about pad size for alignment\r
213 //\r
214 Value = (UINTN) GetVariableNamePtr (Variable);\r
215 Value += NameSizeOfVariable (Variable);\r
216 Value += GET_PAD_SIZE (NameSizeOfVariable (Variable));\r
217\r
218 return (UINT8 *) Value;\r
219}\r
220\r
bcd70414 221/**\r
130e2569 222 This code gets the pointer to the next variable header.\r
223\r
bcd70414 224 @param Variable Pointer to the Variable Header.\r
130e2569 225\r
bcd70414 226 @Return VARIABLE_HEADER* Pointer to next variable header.\r
130e2569 227\r
bcd70414 228**/\r
229VARIABLE_HEADER *\r
230GetNextVariablePtr (\r
231 IN VARIABLE_HEADER *Variable\r
232 )\r
130e2569 233\r
130e2569 234{\r
235 UINTN Value;\r
236\r
237 if (!IsValidVariableHeader (Variable)) {\r
238 return NULL;\r
239 }\r
240\r
241 Value = (UINTN) GetVariableDataPtr (Variable);\r
242 Value += DataSizeOfVariable (Variable);\r
243 Value += GET_PAD_SIZE (DataSizeOfVariable (Variable));\r
244\r
245 //\r
246 // Be careful about pad size for alignment\r
247 //\r
248 return (VARIABLE_HEADER *) HEADER_ALIGN (Value);\r
249}\r
250\r
bcd70414 251/**\r
252 This code gets the pointer to the variable name.\r
253\r
254 @param VarStoreHeader Pointer to the Variable Store Header.\r
130e2569 255\r
bcd70414 256 @retval EfiRaw Variable store is raw\r
257 @retval EfiValid Variable store is valid\r
258 @retval EfiInvalid Variable store is invalid\r
259\r
260**/\r
7ba905c9 261STATIC\r
262VARIABLE_STORE_STATUS\r
263EFIAPI\r
264GetVariableStoreStatus (\r
265 IN VARIABLE_STORE_HEADER *VarStoreHeader\r
266 )\r
7ba905c9 267\r
7ba905c9 268{\r
269 if (VarStoreHeader->Signature == VARIABLE_STORE_SIGNATURE &&\r
270 VarStoreHeader->Format == VARIABLE_STORE_FORMATTED &&\r
271 VarStoreHeader->State == VARIABLE_STORE_HEALTHY\r
272 ) {\r
273\r
274 return EfiValid;\r
275 }\r
276\r
277 if (VarStoreHeader->Signature == 0xffffffff &&\r
278 VarStoreHeader->Size == 0xffffffff &&\r
279 VarStoreHeader->Format == 0xff &&\r
280 VarStoreHeader->State == 0xff\r
281 ) {\r
282\r
283 return EfiRaw;\r
284 } else {\r
285 return EfiInvalid;\r
286 }\r
287}\r
288\r
bcd70414 289/**\r
290 This function compares a variable with variable entries in database\r
291\r
292 @param Variable - Pointer to the variable in our database\r
293 @param VariableName - Name of the variable to compare to 'Variable'\r
294 @param VendorGuid - GUID of the variable to compare to 'Variable'\r
295 @param PtrTrack - Variable Track Pointer structure that contains\r
296 Variable Information.\r
297\r
298 @Retval EFI_SUCCESS - Found match variable\r
299 @retval EFI_NOT_FOUND - Variable not found\r
300\r
301**/\r
7ba905c9 302STATIC\r
303EFI_STATUS\r
304CompareWithValidVariable (\r
305 IN VARIABLE_HEADER *Variable,\r
306 IN CONST CHAR16 *VariableName,\r
307 IN CONST EFI_GUID *VendorGuid,\r
308 OUT VARIABLE_POINTER_TRACK *PtrTrack\r
309 )\r
7ba905c9 310\r
7ba905c9 311{\r
130e2569 312 VOID *Point;\r
313\r
7ba905c9 314 if (VariableName[0] == 0) {\r
315 PtrTrack->CurrPtr = Variable;\r
316 return EFI_SUCCESS;\r
317 } else {\r
318 //\r
319 // Don't use CompareGuid function here for performance reasons.\r
320 // Instead we compare the GUID a UINT32 at a time and branch\r
321 // on the first failed comparison.\r
322 //\r
323 if ((((INT32 *) VendorGuid)[0] == ((INT32 *) &Variable->VendorGuid)[0]) &&\r
324 (((INT32 *) VendorGuid)[1] == ((INT32 *) &Variable->VendorGuid)[1]) &&\r
325 (((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) &&\r
326 (((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3])\r
327 ) {\r
130e2569 328 ASSERT (NameSizeOfVariable (Variable) != 0);\r
329 Point = (VOID *) GetVariableNamePtr (Variable);\r
330 if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable))) {\r
7ba905c9 331 PtrTrack->CurrPtr = Variable;\r
332 return EFI_SUCCESS;\r
333 }\r
334 }\r
335 }\r
336\r
337 return EFI_NOT_FOUND;\r
338}\r
339\r
bcd70414 340/**\r
341 This code finds variable in storage blocks (Non-Volatile)\r
342\r
343 @param PeiServices - General purpose services available to every PEIM.\r
344 @param VariableName - Name of the variable to be found\r
345 @param VendorGuid - Vendor GUID to be found.\r
346 @param PtrTrack - Variable Track Pointer structure that contains\r
347 Variable Information.\r
348\r
349 @retval EFI_SUCCESS - Variable found successfully\r
350 @retval EFI_NOT_FOUND - Variable not found\r
351 @retval EFI_INVALID_PARAMETER - Invalid variable name\r
352\r
353**/\r
7ba905c9 354STATIC\r
355EFI_STATUS\r
356EFIAPI\r
357FindVariable (\r
358 IN EFI_PEI_SERVICES **PeiServices,\r
359 IN CONST CHAR16 *VariableName,\r
360 IN CONST EFI_GUID *VendorGuid,\r
361 OUT VARIABLE_POINTER_TRACK *PtrTrack\r
362 )\r
7ba905c9 363\r
7ba905c9 364{\r
365 EFI_HOB_GUID_TYPE *GuidHob;\r
366 VARIABLE_STORE_HEADER *VariableStoreHeader;\r
367 VARIABLE_HEADER *Variable;\r
368 VARIABLE_HEADER *MaxIndex;\r
369 VARIABLE_INDEX_TABLE *IndexTable;\r
370 UINT32 Count;\r
371 UINT8 *VariableBase;\r
372\r
373 if (VariableName != 0 && VendorGuid == NULL) {\r
374 return EFI_INVALID_PARAMETER;\r
375 }\r
376 //\r
377 // No Variable Address equals zero, so 0 as initial value is safe.\r
378 //\r
379 MaxIndex = 0;\r
380\r
381 GuidHob = GetFirstGuidHob (&mEfiVariableIndexTableGuid);\r
382 if (GuidHob == NULL) {\r
383 IndexTable = BuildGuidHob (&mEfiVariableIndexTableGuid, sizeof (VARIABLE_INDEX_TABLE));\r
384 IndexTable->Length = 0;\r
385 IndexTable->StartPtr = NULL;\r
386 IndexTable->EndPtr = NULL;\r
387 IndexTable->GoneThrough = 0;\r
388 } else {\r
389 IndexTable = GET_GUID_HOB_DATA (GuidHob);\r
390 for (Count = 0; Count < IndexTable->Length; Count++)\r
391 {\r
392 MaxIndex = GetVariableByIndex (IndexTable, Count);\r
130e2569 393\r
7ba905c9 394 if (CompareWithValidVariable (MaxIndex, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) {\r
395 PtrTrack->StartPtr = IndexTable->StartPtr;\r
396 PtrTrack->EndPtr = IndexTable->EndPtr;\r
397\r
398 return EFI_SUCCESS;\r
399 }\r
400 }\r
401\r
402 if (IndexTable->GoneThrough) {\r
403 return EFI_NOT_FOUND;\r
404 }\r
405 }\r
406 //\r
407 // If not found in HOB, then let's start from the MaxIndex we've found.\r
408 //\r
409 if (MaxIndex != NULL) {\r
410 Variable = GetNextVariablePtr (MaxIndex);\r
411 } else {\r
412 if (IndexTable->StartPtr || IndexTable->EndPtr) {\r
413 Variable = IndexTable->StartPtr;\r
414 } else {\r
415 VariableBase = (UINT8 *) (UINTN) PcdGet32 (PcdFlashNvStorageVariableBase);\r
416 VariableStoreHeader = (VARIABLE_STORE_HEADER *) (VariableBase + \\r
417 ((EFI_FIRMWARE_VOLUME_HEADER *) (VariableBase)) -> HeaderLength);\r
418\r
419 if (GetVariableStoreStatus (VariableStoreHeader) != EfiValid) {\r
420 return EFI_UNSUPPORTED;\r
421 }\r
422\r
423 if (~VariableStoreHeader->Size == 0) {\r
424 return EFI_NOT_FOUND;\r
425 }\r
426 //\r
427 // Find the variable by walk through non-volatile variable store\r
428 //\r
130e2569 429 IndexTable->StartPtr = GetStartPointer (VariableStoreHeader);\r
430 IndexTable->EndPtr = GetEndPointer (VariableStoreHeader);\r
7ba905c9 431\r
432 //\r
433 // Start Pointers for the variable.\r
434 // Actual Data Pointer where data can be written.\r
435 //\r
436 Variable = IndexTable->StartPtr;\r
437 }\r
438 }\r
439 //\r
440 // Find the variable by walk through non-volatile variable store\r
441 //\r
442 PtrTrack->StartPtr = IndexTable->StartPtr;\r
443 PtrTrack->EndPtr = IndexTable->EndPtr;\r
444\r
445 while (IsValidVariableHeader (Variable) && (Variable <= IndexTable->EndPtr)) {\r
446 if (Variable->State == VAR_ADDED) {\r
447 //\r
448 // Record Variable in VariableIndex HOB\r
449 //\r
450 if (IndexTable->Length < VARIABLE_INDEX_TABLE_VOLUME)\r
451 {\r
452 VariableIndexTableUpdate (IndexTable, Variable);\r
453 }\r
454\r
455 if (CompareWithValidVariable (Variable, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) {\r
456 return EFI_SUCCESS;\r
457 }\r
458 }\r
459\r
460 Variable = GetNextVariablePtr (Variable);\r
461 }\r
462 //\r
463 // If gone through the VariableStore, that means we never find in Firmware any more.\r
464 //\r
465 if (IndexTable->Length < VARIABLE_INDEX_TABLE_VOLUME) {\r
466 IndexTable->GoneThrough = 1;\r
467 }\r
468\r
469 PtrTrack->CurrPtr = NULL;\r
470\r
471 return EFI_NOT_FOUND;\r
472}\r
473\r
bcd70414 474/**\r
7ba905c9 475 Provide the read variable functionality of the variable services.\r
476\r
bcd70414 477 @param PeiServices - General purpose services available to every PEIM.\r
7ba905c9 478\r
bcd70414 479 @param VariableName - The variable name\r
7ba905c9 480\r
bcd70414 481 @param VendorGuid - The vendor's GUID\r
7ba905c9 482\r
bcd70414 483 @param Attributes - Pointer to the attribute\r
7ba905c9 484\r
bcd70414 485 @param DataSize - Size of data\r
7ba905c9 486\r
bcd70414 487 @param Data - Pointer to data\r
7ba905c9 488\r
bcd70414 489 @retval EFI_SUCCESS - The interface could be successfully installed\r
7ba905c9 490\r
bcd70414 491 @retval EFI_NOT_FOUND - The variable could not be discovered\r
7ba905c9 492\r
bcd70414 493 @retval EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough\r
7ba905c9 494\r
bcd70414 495**/\r
496EFI_STATUS\r
497EFIAPI\r
498PeiGetVariable (\r
499 IN EFI_PEI_SERVICES **PeiServices,\r
500 IN CHAR16 *VariableName,\r
501 IN EFI_GUID * VendorGuid,\r
502 OUT UINT32 *Attributes OPTIONAL,\r
503 IN OUT UINTN *DataSize,\r
504 OUT VOID *Data\r
505 )\r
7ba905c9 506\r
7ba905c9 507{\r
508 VARIABLE_POINTER_TRACK Variable;\r
509 UINTN VarDataSize;\r
510 EFI_STATUS Status;\r
511\r
de631489 512 if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
7ba905c9 513 return EFI_INVALID_PARAMETER;\r
514 }\r
515 //\r
516 // Find existing variable\r
517 //\r
518 Status = FindVariable (PeiServices, VariableName, VendorGuid, &Variable);\r
519\r
520 if (Variable.CurrPtr == NULL || Status != EFI_SUCCESS) {\r
521 return Status;\r
522 }\r
523 //\r
524 // Get data size\r
525 //\r
130e2569 526 VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
7ba905c9 527 if (*DataSize >= VarDataSize) {\r
fd431a9b 528 //\r
529 // PO-TKW: Address one checking in this place\r
530 //\r
531 if (Data == NULL) {\r
532 return EFI_INVALID_PARAMETER;\r
533 }\r
534\r
130e2569 535 (*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
7ba905c9 536\r
537 if (Attributes != NULL) {\r
538 *Attributes = Variable.CurrPtr->Attributes;\r
539 }\r
540\r
541 *DataSize = VarDataSize;\r
542 return EFI_SUCCESS;\r
543 } else {\r
544 *DataSize = VarDataSize;\r
545 return EFI_BUFFER_TOO_SMALL;\r
546 }\r
547}\r
548\r
bcd70414 549/**\r
7ba905c9 550 Provide the read variable functionality of the variable services.\r
551\r
bcd70414 552 @param PeiServices - General purpose services available to every PEIM.\r
7ba905c9 553\r
bcd70414 554 @param VariableName - The variable name\r
7ba905c9 555\r
bcd70414 556 @param VendorGuid - The vendor's GUID\r
7ba905c9 557\r
bcd70414 558 @param Attributes - Pointer to the attribute\r
7ba905c9 559\r
bcd70414 560 @param DataSize - Size of data\r
7ba905c9 561\r
bcd70414 562 @param Data - Pointer to data\r
7ba905c9 563\r
bcd70414 564 @retval EFI_SUCCESS - The interface could be successfully installed\r
7ba905c9 565\r
bcd70414 566 @retval EFI_NOT_FOUND - The variable could not be discovered\r
7ba905c9 567\r
bcd70414 568 @retval EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough\r
7ba905c9 569\r
bcd70414 570**/\r
571EFI_STATUS\r
572EFIAPI\r
573PeiGetVariable2 (\r
574 IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,\r
575 IN CONST CHAR16 *VariableName,\r
576 IN CONST EFI_GUID *VariableGuid,\r
577 OUT UINT32 *Attributes,\r
578 IN OUT UINTN *DataSize,\r
579 OUT VOID *Data\r
580 )\r
7ba905c9 581\r
7ba905c9 582{\r
583 return PeiGetVariable (\r
584 GetPeiServicesTablePointer (),\r
585 (CHAR16*)VariableName,\r
586 (EFI_GUID*)VariableGuid,\r
587 Attributes,\r
588 DataSize,\r
589 Data\r
590 );\r
591}\r
592\r
bcd70414 593/**\r
7ba905c9 594 Provide the get next variable functionality of the variable services.\r
595\r
bcd70414 596 @param PeiServices - General purpose services available to every PEIM.\r
597 @param VariabvleNameSize - The variable name's size.\r
598 @param VariableName - A pointer to the variable's name.\r
599 @param VendorGuid - A pointer to the EFI_GUID structure.\r
7ba905c9 600\r
bcd70414 601 @param VariableNameSize - Size of the variable name\r
7ba905c9 602\r
bcd70414 603 @param VariableName - The variable name\r
7ba905c9 604\r
bcd70414 605 @param VendorGuid - The vendor's GUID\r
7ba905c9 606\r
bcd70414 607 @retval EFI_SUCCESS - The interface could be successfully installed\r
7ba905c9 608\r
bcd70414 609 @retval EFI_NOT_FOUND - The variable could not be discovered\r
7ba905c9 610\r
bcd70414 611**/\r
612EFI_STATUS\r
613EFIAPI\r
614PeiGetNextVariableName (\r
615 IN EFI_PEI_SERVICES **PeiServices,\r
616 IN OUT UINTN *VariableNameSize,\r
617 IN OUT CHAR16 *VariableName,\r
618 IN OUT EFI_GUID *VendorGuid\r
619 )\r
7ba905c9 620\r
7ba905c9 621{\r
622 VARIABLE_POINTER_TRACK Variable;\r
623 UINTN VarNameSize;\r
624 EFI_STATUS Status;\r
625\r
de631489 626 if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == NULL) {\r
7ba905c9 627 return EFI_INVALID_PARAMETER;\r
628 }\r
629\r
630 Status = FindVariable (PeiServices, VariableName, VendorGuid, &Variable);\r
631\r
632 if (Variable.CurrPtr == NULL || Status != EFI_SUCCESS) {\r
633 return Status;\r
634 }\r
635\r
636 if (VariableName[0] != 0) {\r
637 //\r
638 // If variable name is not NULL, get next variable\r
639 //\r
640 Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr);\r
641 }\r
642\r
643 while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {\r
644 if (IsValidVariableHeader (Variable.CurrPtr)) {\r
645 if (Variable.CurrPtr->State == VAR_ADDED) {\r
130e2569 646 ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
9cad030b 647\r
130e2569 648 VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
7ba905c9 649 if (VarNameSize <= *VariableNameSize) {\r
130e2569 650 (*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);\r
7ba905c9 651\r
652 (*PeiServices)->CopyMem (VendorGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID));\r
653\r
654 Status = EFI_SUCCESS;\r
655 } else {\r
656 Status = EFI_BUFFER_TOO_SMALL;\r
657 }\r
658\r
659 *VariableNameSize = VarNameSize;\r
660 return Status;\r
661 //\r
662 // Variable is found\r
663 //\r
664 } else {\r
665 Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr);\r
666 }\r
667 } else {\r
668 break;\r
669 }\r
670 }\r
671\r
672 return EFI_NOT_FOUND;\r
673}\r
674\r
bcd70414 675/**\r
7ba905c9 676 Provide the get next variable functionality of the variable services.\r
677\r
bcd70414 678 @param PeiServices - General purpose services available to every PEIM.\r
679 @param VariabvleNameSize - The variable name's size.\r
680 @param VariableName - A pointer to the variable's name.\r
681 @param VariableGuid - A pointer to the EFI_GUID structure.\r
7ba905c9 682\r
bcd70414 683 @param VariableNameSize - Size of the variable name\r
7ba905c9 684\r
bcd70414 685 @param VariableName - The variable name\r
7ba905c9 686\r
bcd70414 687 @param VendorGuid - The vendor's GUID\r
7ba905c9 688\r
7ba905c9 689\r
bcd70414 690 @retval EFI_SUCCESS - The interface could be successfully installed\r
7ba905c9 691\r
bcd70414 692 @retval EFI_NOT_FOUND - The variable could not be discovered\r
7ba905c9 693\r
bcd70414 694**/\r
695EFI_STATUS\r
696EFIAPI\r
697PeiGetNextVariableName2 (\r
698 IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,\r
699 IN OUT UINTN *VariableNameSize,\r
700 IN OUT CHAR16 *VariableName,\r
701 IN OUT EFI_GUID *VariableGuid\r
702 )\r
7ba905c9 703\r
7ba905c9 704{\r
705 return PeiGetNextVariableName (\r
706 GetPeiServicesTablePointer (),\r
707 VariableNameSize,\r
708 VariableName,\r
709 VariableGuid\r
710 );\r
6bee1632 711}\r
bcd70414 712\r