]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - IntelFrameworkModulePkg/Universal/VariablePei/Variable.c
Fix missing include header file and fix typo in comment.
[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
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
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
120STATIC\r
121BOOLEAN\r
122EFIAPI\r
123IsValidVariableHeader (\r
124 IN VARIABLE_HEADER *Variable\r
125 )\r
126{\r
127 if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
128 return FALSE;\r
129 }\r
130\r
131 return TRUE;\r
132}\r
133\r
134/**\r
135 This code gets the size of name of variable.\r
136\r
137 @param Variable Pointer to the Variable Header.\r
138\r
139 @Return UINTN Size of variable in bytes\r
140\r
141**/\r
142UINTN\r
143NameSizeOfVariable (\r
144 IN VARIABLE_HEADER *Variable\r
145 )\r
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
156/**\r
157 This code gets the size of name of variable.\r
158\r
159 @param Variable Pointer to the Variable Header.\r
160\r
161 @Return UINTN Size of variable in bytes\r
162\r
163**/\r
164UINTN\r
165DataSizeOfVariable (\r
166 IN VARIABLE_HEADER *Variable\r
167 )\r
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
178/**\r
179 This code gets the pointer to the variable name.\r
180\r
181 @param Variable Pointer to the Variable Header.\r
182\r
183 @Return CHAR16* Pointer to Variable Name\r
184\r
185**/\r
186CHAR16 *\r
187GetVariableNamePtr (\r
188 IN VARIABLE_HEADER *Variable\r
189 )\r
190\r
191{\r
192\r
193 return (CHAR16 *) (Variable + 1);\r
194}\r
195\r
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
202\r
203**/\r
204UINT8 *\r
205GetVariableDataPtr (\r
206 IN VARIABLE_HEADER *Variable\r
207 )\r
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
221/**\r
222 This code gets the pointer to the next variable header.\r
223\r
224 @param Variable Pointer to the Variable Header.\r
225\r
226 @Return VARIABLE_HEADER* Pointer to next variable header.\r
227\r
228**/\r
229VARIABLE_HEADER *\r
230GetNextVariablePtr (\r
231 IN VARIABLE_HEADER *Variable\r
232 )\r
233\r
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
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
255\r
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
261STATIC\r
262VARIABLE_STORE_STATUS\r
263EFIAPI\r
264GetVariableStoreStatus (\r
265 IN VARIABLE_STORE_HEADER *VarStoreHeader\r
266 )\r
267\r
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
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
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
310\r
311{\r
312 VOID *Point;\r
313\r
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
328 ASSERT (NameSizeOfVariable (Variable) != 0);\r
329 Point = (VOID *) GetVariableNamePtr (Variable);\r
330 if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable))) {\r
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
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
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
363\r
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
393\r
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
429 IndexTable->StartPtr = GetStartPointer (VariableStoreHeader);\r
430 IndexTable->EndPtr = GetEndPointer (VariableStoreHeader);\r
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
474/**\r
475 Provide the read variable functionality of the variable services.\r
476\r
477 @param PeiServices - General purpose services available to every PEIM.\r
478\r
479 @param VariableName - The variable name\r
480\r
481 @param VendorGuid - The vendor's GUID\r
482\r
483 @param Attributes - Pointer to the attribute\r
484\r
485 @param DataSize - Size of data\r
486\r
487 @param Data - Pointer to data\r
488\r
489 @retval EFI_SUCCESS - The interface could be successfully installed\r
490\r
491 @retval EFI_NOT_FOUND - The variable could not be discovered\r
492\r
493 @retval EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough\r
494\r
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
506\r
507{\r
508 VARIABLE_POINTER_TRACK Variable;\r
509 UINTN VarDataSize;\r
510 EFI_STATUS Status;\r
511\r
512 if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
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
526 VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
527 if (*DataSize >= VarDataSize) {\r
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
535 (*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
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
549/**\r
550 Provide the read variable functionality of the variable services.\r
551\r
552 @param PeiServices - General purpose services available to every PEIM.\r
553\r
554 @param VariableName - The variable name\r
555\r
556 @param VendorGuid - The vendor's GUID\r
557\r
558 @param Attributes - Pointer to the attribute\r
559\r
560 @param DataSize - Size of data\r
561\r
562 @param Data - Pointer to data\r
563\r
564 @retval EFI_SUCCESS - The interface could be successfully installed\r
565\r
566 @retval EFI_NOT_FOUND - The variable could not be discovered\r
567\r
568 @retval EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough\r
569\r
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
581\r
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
593/**\r
594 Provide the get next variable functionality of the variable services.\r
595\r
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
600\r
601 @param VariableNameSize - Size of the variable name\r
602\r
603 @param VariableName - The variable name\r
604\r
605 @param VendorGuid - The vendor's GUID\r
606\r
607 @retval EFI_SUCCESS - The interface could be successfully installed\r
608\r
609 @retval EFI_NOT_FOUND - The variable could not be discovered\r
610\r
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
620\r
621{\r
622 VARIABLE_POINTER_TRACK Variable;\r
623 UINTN VarNameSize;\r
624 EFI_STATUS Status;\r
625\r
626 if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == NULL) {\r
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
646 ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
647\r
648 VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
649 if (VarNameSize <= *VariableNameSize) {\r
650 (*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);\r
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
675/**\r
676 Provide the get next variable functionality of the variable services.\r
677\r
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
682\r
683 @param VariableNameSize - Size of the variable name\r
684\r
685 @param VariableName - The variable name\r
686\r
687 @param VendorGuid - The vendor's GUID\r
688\r
689\r
690 @retval EFI_SUCCESS - The interface could be successfully installed\r
691\r
692 @retval EFI_NOT_FOUND - The variable could not be discovered\r
693\r
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
703\r
704{\r
705 return PeiGetNextVariableName (\r
706 GetPeiServicesTablePointer (),\r
707 VariableNameSize,\r
708 VariableName,\r
709 VariableGuid\r
710 );\r
711}\r
712\r