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