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