]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/VariablePei/Variable.c
Update PEIM entry point to follow PEIM entry point.
[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
819d1488 22EFI_PEI_READ_ONLY_VARIABLE_PPI mVariablePpi = {\r
7ba905c9 23 PeiGetVariable,\r
24 PeiGetNextVariableName\r
25};\r
26\r
819d1488 27EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariable2Ppi = {\r
7ba905c9 28 PeiGetVariable2,\r
29 PeiGetNextVariableName2\r
30};\r
31\r
819d1488 32EFI_PEI_PPI_DESCRIPTOR mPpiListVariable[] = {\r
7ba905c9 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
8bd22b8a
LG
50 @param FileHandle Handle of the file being invoked.\r
51 @param PeiServices Describes the list of possible PEI Services.\r
bcd70414 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
8bd22b8a
LG
60 IN EFI_PEI_FILE_HANDLE FileHandle,\r
61 IN CONST EFI_PEI_SERVICES **PeiServices\r
7ba905c9 62 )\r
7ba905c9 63{\r
64 //\r
65 // Publish the variable capability to other modules\r
66 //\r
8bd22b8a 67 return (**PeiServices).InstallPpi (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
fdb05fa3 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
fdb05fa3 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 120BOOLEAN\r
121EFIAPI\r
122IsValidVariableHeader (\r
123 IN VARIABLE_HEADER *Variable\r
124 )\r
7ba905c9 125{\r
9cad030b 126 if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
7ba905c9 127 return FALSE;\r
128 }\r
129\r
130 return TRUE;\r
131}\r
132\r
bcd70414 133/**\r
134 This code gets the size of name of variable.\r
135\r
136 @param Variable Pointer to the Variable Header.\r
130e2569 137\r
fdb05fa3 138 @return UINTN Size of variable in bytes\r
bcd70414 139\r
140**/\r
130e2569 141UINTN\r
142NameSizeOfVariable (\r
143 IN VARIABLE_HEADER *Variable\r
144 )\r
130e2569 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
bcd70414 155/**\r
130e2569 156 This code gets the size of name of variable.\r
157\r
bcd70414 158 @param Variable Pointer to the Variable Header.\r
130e2569 159\r
fdb05fa3 160 @return UINTN Size of variable in bytes\r
130e2569 161\r
bcd70414 162**/\r
163UINTN\r
164DataSizeOfVariable (\r
165 IN VARIABLE_HEADER *Variable\r
166 )\r
130e2569 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
bcd70414 177/**\r
130e2569 178 This code gets the pointer to the variable name.\r
179\r
bcd70414 180 @param Variable Pointer to the Variable Header.\r
130e2569 181\r
fdb05fa3 182 @return CHAR16* Pointer to Variable Name\r
130e2569 183\r
bcd70414 184**/\r
185CHAR16 *\r
186GetVariableNamePtr (\r
187 IN VARIABLE_HEADER *Variable\r
188 )\r
130e2569 189\r
130e2569 190{\r
191\r
192 return (CHAR16 *) (Variable + 1);\r
193}\r
194\r
bcd70414 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
fdb05fa3 200 @return UINT8* Pointer to Variable Data\r
130e2569 201\r
bcd70414 202**/\r
130e2569 203UINT8 *\r
204GetVariableDataPtr (\r
205 IN VARIABLE_HEADER *Variable\r
206 )\r
130e2569 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
bcd70414 220/**\r
130e2569 221 This code gets the pointer to the next variable header.\r
222\r
bcd70414 223 @param Variable Pointer to the Variable Header.\r
130e2569 224\r
fdb05fa3 225 @return VARIABLE_HEADER* Pointer to next variable header.\r
130e2569 226\r
bcd70414 227**/\r
228VARIABLE_HEADER *\r
229GetNextVariablePtr (\r
230 IN VARIABLE_HEADER *Variable\r
231 )\r
130e2569 232\r
130e2569 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
bcd70414 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
130e2569 254\r
bcd70414 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
7ba905c9 260VARIABLE_STORE_STATUS\r
261EFIAPI\r
262GetVariableStoreStatus (\r
263 IN VARIABLE_STORE_HEADER *VarStoreHeader\r
264 )\r
7ba905c9 265\r
7ba905c9 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
bcd70414 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
fdb05fa3 296 @retval EFI_SUCCESS - Found match variable\r
bcd70414 297 @retval EFI_NOT_FOUND - Variable not found\r
298\r
299**/\r
7ba905c9 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
7ba905c9 307\r
7ba905c9 308{\r
130e2569 309 VOID *Point;\r
310\r
7ba905c9 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
130e2569 325 ASSERT (NameSizeOfVariable (Variable) != 0);\r
326 Point = (VOID *) GetVariableNamePtr (Variable);\r
327 if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable))) {\r
7ba905c9 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
bcd70414 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
7ba905c9 351EFI_STATUS\r
352EFIAPI\r
353FindVariable (\r
1b641bb8 354 IN EFI_PEI_SERVICES **PeiServices,\r
7ba905c9 355 IN CONST CHAR16 *VariableName,\r
356 IN CONST EFI_GUID *VendorGuid,\r
357 OUT VARIABLE_POINTER_TRACK *PtrTrack\r
358 )\r
7ba905c9 359\r
7ba905c9 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
130e2569 389\r
7ba905c9 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
130e2569 425 IndexTable->StartPtr = GetStartPointer (VariableStoreHeader);\r
426 IndexTable->EndPtr = GetEndPointer (VariableStoreHeader);\r
7ba905c9 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
bcd70414 470/**\r
7ba905c9 471 Provide the read variable functionality of the variable services.\r
472\r
bcd70414 473 @param PeiServices - General purpose services available to every PEIM.\r
7ba905c9 474\r
bcd70414 475 @param VariableName - The variable name\r
7ba905c9 476\r
bcd70414 477 @param VendorGuid - The vendor's GUID\r
7ba905c9 478\r
bcd70414 479 @param Attributes - Pointer to the attribute\r
7ba905c9 480\r
bcd70414 481 @param DataSize - Size of data\r
7ba905c9 482\r
bcd70414 483 @param Data - Pointer to data\r
7ba905c9 484\r
bcd70414 485 @retval EFI_SUCCESS - The interface could be successfully installed\r
7ba905c9 486\r
bcd70414 487 @retval EFI_NOT_FOUND - The variable could not be discovered\r
7ba905c9 488\r
bcd70414 489 @retval EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough\r
7ba905c9 490\r
bcd70414 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
7ba905c9 502\r
7ba905c9 503{\r
504 VARIABLE_POINTER_TRACK Variable;\r
505 UINTN VarDataSize;\r
506 EFI_STATUS Status;\r
507\r
de631489 508 if (VariableName == NULL || VendorGuid == NULL || DataSize == NULL) {\r
7ba905c9 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
130e2569 522 VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
7ba905c9 523 if (*DataSize >= VarDataSize) {\r
fd431a9b 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
130e2569 531 (*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
7ba905c9 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
bcd70414 545/**\r
7ba905c9 546 Provide the read variable functionality of the variable services.\r
547\r
bcd70414 548 @param PeiServices - General purpose services available to every PEIM.\r
7ba905c9 549\r
bcd70414 550 @param VariableName - The variable name\r
7ba905c9 551\r
bcd70414 552 @param VendorGuid - The vendor's GUID\r
7ba905c9 553\r
bcd70414 554 @param Attributes - Pointer to the attribute\r
7ba905c9 555\r
bcd70414 556 @param DataSize - Size of data\r
7ba905c9 557\r
bcd70414 558 @param Data - Pointer to data\r
7ba905c9 559\r
bcd70414 560 @retval EFI_SUCCESS - The interface could be successfully installed\r
7ba905c9 561\r
bcd70414 562 @retval EFI_NOT_FOUND - The variable could not be discovered\r
7ba905c9 563\r
bcd70414 564 @retval EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough\r
7ba905c9 565\r
bcd70414 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
7ba905c9 577\r
7ba905c9 578{\r
579 return PeiGetVariable (\r
1b641bb8 580 (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),\r
7ba905c9 581 (CHAR16*)VariableName,\r
582 (EFI_GUID*)VariableGuid,\r
583 Attributes,\r
584 DataSize,\r
585 Data\r
586 );\r
587}\r
588\r
bcd70414 589/**\r
7ba905c9 590 Provide the get next variable functionality of the variable services.\r
591\r
bcd70414 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
7ba905c9 596\r
bcd70414 597 @param VariableNameSize - Size of the variable name\r
7ba905c9 598\r
bcd70414 599 @param VariableName - The variable name\r
7ba905c9 600\r
bcd70414 601 @param VendorGuid - The vendor's GUID\r
7ba905c9 602\r
bcd70414 603 @retval EFI_SUCCESS - The interface could be successfully installed\r
7ba905c9 604\r
bcd70414 605 @retval EFI_NOT_FOUND - The variable could not be discovered\r
7ba905c9 606\r
bcd70414 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
7ba905c9 616\r
7ba905c9 617{\r
618 VARIABLE_POINTER_TRACK Variable;\r
619 UINTN VarNameSize;\r
620 EFI_STATUS Status;\r
621\r
de631489 622 if (VariableNameSize == NULL || VariableName == NULL || VendorGuid == NULL) {\r
7ba905c9 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
130e2569 642 ASSERT (NameSizeOfVariable (Variable.CurrPtr) != 0);\r
9cad030b 643\r
130e2569 644 VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
7ba905c9 645 if (VarNameSize <= *VariableNameSize) {\r
130e2569 646 (*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);\r
7ba905c9 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
bcd70414 671/**\r
7ba905c9 672 Provide the get next variable functionality of the variable services.\r
673\r
bcd70414 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
7ba905c9 678\r
bcd70414 679 @param VariableNameSize - Size of the variable name\r
7ba905c9 680\r
bcd70414 681 @param VariableName - The variable name\r
7ba905c9 682\r
bcd70414 683 @param VendorGuid - The vendor's GUID\r
7ba905c9 684\r
7ba905c9 685\r
bcd70414 686 @retval EFI_SUCCESS - The interface could be successfully installed\r
7ba905c9 687\r
bcd70414 688 @retval EFI_NOT_FOUND - The variable could not be discovered\r
7ba905c9 689\r
bcd70414 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
7ba905c9 699\r
7ba905c9 700{\r
701 return PeiGetNextVariableName (\r
1b641bb8 702 (EFI_PEI_SERVICES **) GetPeiServicesTablePointer (),\r
7ba905c9 703 VariableNameSize,\r
704 VariableName,\r
705 VariableGuid\r
706 );\r
6bee1632 707}\r
bcd70414 708\r