]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/VariablePei/Variable.c
[Description]
[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
fd431a9b 617 //\r
618 // PO-TKW: Address one checking in this place\r
619 //\r
620 if (Data == NULL) {\r
621 return EFI_INVALID_PARAMETER;\r
622 }\r
623\r
130e2569 624 (*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
7ba905c9 625\r
626 if (Attributes != NULL) {\r
627 *Attributes = Variable.CurrPtr->Attributes;\r
628 }\r
629\r
630 *DataSize = VarDataSize;\r
631 return EFI_SUCCESS;\r
632 } else {\r
633 *DataSize = VarDataSize;\r
634 return EFI_BUFFER_TOO_SMALL;\r
635 }\r
636}\r
637\r
638\r
639EFI_STATUS\r
640EFIAPI\r
641PeiGetVariable2 (\r
642 IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,\r
643 IN CONST CHAR16 *VariableName,\r
644 IN CONST EFI_GUID *VariableGuid,\r
645 OUT UINT32 *Attributes,\r
646 IN OUT UINTN *DataSize,\r
647 OUT VOID *Data\r
648 )\r
649/*++\r
650\r
651Routine Description:\r
652\r
653 Provide the read variable functionality of the variable services.\r
654\r
655Arguments:\r
656\r
657 PeiServices - General purpose services available to every PEIM.\r
658\r
659 VariableName - The variable name\r
660\r
661 VendorGuid - The vendor's GUID\r
662\r
663 Attributes - Pointer to the attribute\r
664\r
665 DataSize - Size of data\r
666\r
667 Data - Pointer to data\r
668\r
669Returns:\r
670\r
671 EFI_SUCCESS - The interface could be successfully installed\r
672\r
673 EFI_NOT_FOUND - The variable could not be discovered\r
674\r
675 EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough\r
676\r
677--*/\r
678{\r
679 return PeiGetVariable (\r
680 GetPeiServicesTablePointer (),\r
681 (CHAR16*)VariableName,\r
682 (EFI_GUID*)VariableGuid,\r
683 Attributes,\r
684 DataSize,\r
685 Data\r
686 );\r
687}\r
688\r
689EFI_STATUS\r
690EFIAPI\r
691PeiGetNextVariableName (\r
692 IN EFI_PEI_SERVICES **PeiServices,\r
693 IN OUT UINTN *VariableNameSize,\r
694 IN OUT CHAR16 *VariableName,\r
695 IN OUT EFI_GUID *VendorGuid\r
696 )\r
697/*++\r
698\r
699Routine Description:\r
700\r
701 Provide the get next variable functionality of the variable services.\r
702\r
703Arguments:\r
704\r
705 PeiServices - General purpose services available to every PEIM.\r
706 VariabvleNameSize - The variable name's size.\r
707 VariableName - A pointer to the variable's name.\r
708 VendorGuid - A pointer to the EFI_GUID structure.\r
709\r
710 VariableNameSize - Size of the variable name\r
711\r
712 VariableName - The variable name\r
713\r
714 VendorGuid - The vendor's GUID\r
715\r
716Returns:\r
717\r
718 EFI_SUCCESS - The interface could be successfully installed\r
719\r
720 EFI_NOT_FOUND - The variable could not be discovered\r
721\r
722--*/\r
723{\r
724 VARIABLE_POINTER_TRACK Variable;\r
725 UINTN VarNameSize;\r
726 EFI_STATUS Status;\r
727\r
728 if (VariableName == NULL) {\r
729 return EFI_INVALID_PARAMETER;\r
730 }\r
731\r
732 Status = FindVariable (PeiServices, VariableName, VendorGuid, &Variable);\r
733\r
734 if (Variable.CurrPtr == NULL || Status != EFI_SUCCESS) {\r
735 return Status;\r
736 }\r
737\r
738 if (VariableName[0] != 0) {\r
739 //\r
740 // If variable name is not NULL, get next variable\r
741 //\r
742 Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr);\r
743 }\r
744\r
745 while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) {\r
746 if (IsValidVariableHeader (Variable.CurrPtr)) {\r
747 if (Variable.CurrPtr->State == VAR_ADDED) {\r
130e2569 748 ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
9cad030b 749\r
130e2569 750 VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
7ba905c9 751 if (VarNameSize <= *VariableNameSize) {\r
130e2569 752 (*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);\r
7ba905c9 753\r
754 (*PeiServices)->CopyMem (VendorGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID));\r
755\r
756 Status = EFI_SUCCESS;\r
757 } else {\r
758 Status = EFI_BUFFER_TOO_SMALL;\r
759 }\r
760\r
761 *VariableNameSize = VarNameSize;\r
762 return Status;\r
763 //\r
764 // Variable is found\r
765 //\r
766 } else {\r
767 Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr);\r
768 }\r
769 } else {\r
770 break;\r
771 }\r
772 }\r
773\r
774 return EFI_NOT_FOUND;\r
775}\r
776\r
777EFI_STATUS\r
778EFIAPI\r
779PeiGetNextVariableName2 (\r
780 IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This,\r
781 IN OUT UINTN *VariableNameSize,\r
782 IN OUT CHAR16 *VariableName,\r
783 IN OUT EFI_GUID *VariableGuid\r
784 )\r
785/*++\r
786\r
787Routine Description:\r
788\r
789 Provide the get next variable functionality of the variable services.\r
790\r
791Arguments:\r
792\r
793 PeiServices - General purpose services available to every PEIM.\r
794 VariabvleNameSize - The variable name's size.\r
795 VariableName - A pointer to the variable's name.\r
796 VariableGuid - A pointer to the EFI_GUID structure.\r
797\r
798 VariableNameSize - Size of the variable name\r
799\r
800 VariableName - The variable name\r
801\r
802 VendorGuid - The vendor's GUID\r
803\r
804Returns:\r
805\r
806 EFI_SUCCESS - The interface could be successfully installed\r
807\r
808 EFI_NOT_FOUND - The variable could not be discovered\r
809\r
810--*/\r
811{\r
812 return PeiGetNextVariableName (\r
813 GetPeiServicesTablePointer (),\r
814 VariableNameSize,\r
815 VariableName,\r
816 VariableGuid\r
817 );\r
6bee1632 818}\r