]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - EdkModulePkg/Universal/PCD/Dxe/Pcd.c
Modified the version and usage display.
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Dxe / Pcd.c
... / ...
CommitLineData
1/** @file\r
2PCD DXE driver\r
3\r
4Copyright (c) 2006, Intel Corporation\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
12\r
13\r
14Module Name: Pcd.c\r
15\r
16**/\r
17\r
18#include "Service.h"\r
19\r
20\r
21PCD_PROTOCOL mPcdInstance = {\r
22 DxePcdSetSku,\r
23\r
24 DxePcdGet8,\r
25 DxePcdGet16,\r
26 DxePcdGet32,\r
27 DxePcdGet64,\r
28 DxePcdGetPtr,\r
29 DxePcdGetBool,\r
30 DxePcdGetSize,\r
31\r
32 DxePcdGet8Ex,\r
33 DxePcdGet16Ex,\r
34 DxePcdGet32Ex,\r
35 DxePcdGet64Ex,\r
36 DxePcdGetPtrEx,\r
37 DxePcdGetBoolEx,\r
38 DxePcdGetSizeEx,\r
39\r
40 DxePcdSet8,\r
41 DxePcdSet16,\r
42 DxePcdSet32,\r
43 DxePcdSet64,\r
44 DxePcdSetPtr,\r
45 DxePcdSetBool,\r
46\r
47 DxePcdSet8Ex,\r
48 DxePcdSet16Ex,\r
49 DxePcdSet32Ex,\r
50 DxePcdSet64Ex,\r
51 DxePcdSetPtrEx,\r
52 DxePcdSetBoolEx,\r
53\r
54 DxeRegisterCallBackOnSet,\r
55 DxeUnRegisterCallBackOnSet,\r
56 DxePcdGetNextToken,\r
57 DxePcdGetNextTokenSpace\r
58};\r
59\r
60\r
61//\r
62// Static global to reduce the code size\r
63//\r
64static EFI_HANDLE mNewHandle = NULL;\r
65\r
66EFI_STATUS\r
67EFIAPI\r
68PcdDxeInit (\r
69 IN EFI_HANDLE ImageHandle,\r
70 IN EFI_SYSTEM_TABLE *SystemTable\r
71 )\r
72{\r
73 EFI_STATUS Status;\r
74\r
75 //\r
76 // Make sure the Pcd Protocol is not already installed in the system\r
77 //\r
78\r
79 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gPcdProtocolGuid);\r
80\r
81 BuildPcdDxeDataBase ();\r
82\r
83 Status = gBS->InstallProtocolInterface (\r
84 &mNewHandle,\r
85 &gPcdProtocolGuid,\r
86 EFI_NATIVE_INTERFACE,\r
87 &mPcdInstance\r
88 );\r
89\r
90 ASSERT_EFI_ERROR (Status);\r
91\r
92 return EFI_SUCCESS;\r
93\r
94}\r
95\r
96\r
97VOID\r
98EFIAPI\r
99DxePcdSetSku (\r
100 IN UINTN SkuId\r
101 )\r
102{\r
103 mPcdDatabase->PeiDb.Init.SystemSkuId = (SKU_ID) SkuId;\r
104 \r
105 return;\r
106}\r
107\r
108\r
109\r
110UINT8\r
111EFIAPI\r
112DxePcdGet8 (\r
113 IN UINTN TokenNumber\r
114 )\r
115{\r
116 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
117}\r
118\r
119\r
120\r
121UINT16\r
122EFIAPI\r
123DxePcdGet16 (\r
124 IN UINTN TokenNumber\r
125 )\r
126{\r
127 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
128}\r
129\r
130\r
131\r
132UINT32\r
133EFIAPI\r
134DxePcdGet32 (\r
135 IN UINTN TokenNumber\r
136 )\r
137{\r
138 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
139}\r
140\r
141\r
142\r
143UINT64\r
144EFIAPI\r
145DxePcdGet64 (\r
146 IN UINTN TokenNumber\r
147 )\r
148{\r
149 return ReadUnaligned64(GetWorker (TokenNumber, sizeof (UINT64)));\r
150}\r
151\r
152\r
153\r
154VOID *\r
155EFIAPI\r
156DxePcdGetPtr (\r
157 IN UINTN TokenNumber\r
158 )\r
159{\r
160 return GetWorker (TokenNumber, 0);\r
161}\r
162\r
163\r
164\r
165BOOLEAN\r
166EFIAPI\r
167DxePcdGetBool (\r
168 IN UINTN TokenNumber\r
169 )\r
170{\r
171 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
172}\r
173\r
174\r
175\r
176UINTN\r
177EFIAPI\r
178DxePcdGetSize (\r
179 IN UINTN TokenNumber\r
180 )\r
181{\r
182 UINTN Size;\r
183 UINT32 *LocalTokenNumberTable;\r
184 BOOLEAN IsPeiDb;\r
185 UINTN MaxSize;\r
186 UINTN TmpTokenNumber;\r
187 //\r
188 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
189 // We have to decrement TokenNumber by 1 to make it usable\r
190 // as the array index.\r
191 //\r
192 TokenNumber--;\r
193\r
194 //\r
195 // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber\r
196 // \r
197 TmpTokenNumber = TokenNumber;\r
198\r
199 // EBC compiler is very choosy. It may report warning about comparison\r
200 // between UINTN and 0 . So we add 1 in each size of the \r
201 // comparison.\r
202 ASSERT (TokenNumber + 1 < PCD_TOTAL_TOKEN_NUMBER + 1);\r
203\r
204 // EBC compiler is very choosy. It may report warning about comparison\r
205 // between UINTN and 0 . So we add 1 in each size of the \r
206 // comparison.\r
207 IsPeiDb = (BOOLEAN) (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
208 \r
209 TokenNumber = IsPeiDb ? TokenNumber : \r
210 (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);\r
211\r
212 LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable \r
213 : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
214\r
215 Size = (LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
216\r
217 if (Size == 0) {\r
218 //\r
219 // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
220 //\r
221 return GetPtrTypeSize (TmpTokenNumber, &MaxSize);\r
222 } else {\r
223 return Size;\r
224 }\r
225\r
226}\r
227\r
228\r
229\r
230UINT8\r
231EFIAPI\r
232DxePcdGet8Ex (\r
233 IN CONST EFI_GUID *Guid,\r
234 IN UINTN ExTokenNumber\r
235 )\r
236{\r
237 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8)));\r
238}\r
239\r
240\r
241\r
242UINT16\r
243EFIAPI\r
244DxePcdGet16Ex (\r
245 IN CONST EFI_GUID *Guid,\r
246 IN UINTN ExTokenNumber\r
247 )\r
248{\r
249 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16)));\r
250}\r
251\r
252\r
253\r
254UINT32\r
255EFIAPI\r
256DxePcdGet32Ex (\r
257 IN CONST EFI_GUID *Guid,\r
258 IN UINTN ExTokenNumber\r
259 )\r
260{\r
261 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32)));\r
262}\r
263\r
264\r
265\r
266UINT64\r
267EFIAPI\r
268DxePcdGet64Ex (\r
269 IN CONST EFI_GUID *Guid,\r
270 IN UINTN ExTokenNumber\r
271 )\r
272{\r
273 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT64)));\r
274}\r
275\r
276\r
277\r
278VOID *\r
279EFIAPI\r
280DxePcdGetPtrEx (\r
281 IN CONST EFI_GUID *Guid,\r
282 IN UINTN ExTokenNumber\r
283 )\r
284{\r
285 return ExGetWorker (Guid, ExTokenNumber, 0);\r
286}\r
287\r
288\r
289\r
290BOOLEAN\r
291EFIAPI\r
292DxePcdGetBoolEx (\r
293 IN CONST EFI_GUID *Guid,\r
294 IN UINTN ExTokenNumber\r
295 )\r
296{\r
297 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN)));\r
298}\r
299\r
300\r
301\r
302UINTN\r
303EFIAPI\r
304DxePcdGetSizeEx (\r
305 IN CONST EFI_GUID *Guid,\r
306 IN UINTN ExTokenNumber\r
307 )\r
308{\r
309 return DxePcdGetSize(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber));\r
310}\r
311\r
312\r
313\r
314EFI_STATUS\r
315EFIAPI\r
316DxePcdSet8 (\r
317 IN UINTN TokenNumber,\r
318 IN UINT8 Value\r
319 )\r
320{\r
321 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
322}\r
323\r
324\r
325\r
326EFI_STATUS\r
327EFIAPI\r
328DxePcdSet16 (\r
329 IN UINTN TokenNumber,\r
330 IN UINT16 Value\r
331 )\r
332{\r
333 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
334}\r
335\r
336\r
337\r
338EFI_STATUS\r
339EFIAPI\r
340DxePcdSet32 (\r
341 IN UINTN TokenNumber,\r
342 IN UINT32 Value\r
343 )\r
344{\r
345 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
346}\r
347\r
348\r
349\r
350EFI_STATUS\r
351EFIAPI\r
352DxePcdSet64 (\r
353 IN UINTN TokenNumber,\r
354 IN UINT64 Value\r
355 )\r
356{\r
357 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
358}\r
359\r
360\r
361\r
362EFI_STATUS\r
363EFIAPI\r
364DxePcdSetPtr (\r
365 IN UINTN TokenNumber,\r
366 IN OUT UINTN *SizeOfBuffer,\r
367 IN VOID *Buffer\r
368 )\r
369{\r
370 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
371}\r
372\r
373\r
374\r
375EFI_STATUS\r
376EFIAPI\r
377DxePcdSetBool (\r
378 IN UINTN TokenNumber,\r
379 IN BOOLEAN Value\r
380 )\r
381{\r
382 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
383}\r
384\r
385\r
386\r
387EFI_STATUS\r
388EFIAPI\r
389DxePcdSet8Ex (\r
390 IN CONST EFI_GUID *Guid,\r
391 IN UINTN ExTokenNumber,\r
392 IN UINT8 Value\r
393 )\r
394{\r
395 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
396}\r
397\r
398\r
399\r
400EFI_STATUS\r
401EFIAPI\r
402DxePcdSet16Ex (\r
403 IN CONST EFI_GUID *Guid,\r
404 IN UINTN ExTokenNumber,\r
405 IN UINT16 Value\r
406 )\r
407{\r
408 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
409}\r
410\r
411\r
412\r
413EFI_STATUS\r
414EFIAPI\r
415DxePcdSet32Ex (\r
416 IN CONST EFI_GUID *Guid,\r
417 IN UINTN ExTokenNumber,\r
418 IN UINT32 Value\r
419 )\r
420{\r
421 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
422}\r
423\r
424\r
425\r
426EFI_STATUS\r
427EFIAPI\r
428DxePcdSet64Ex (\r
429 IN CONST EFI_GUID *Guid,\r
430 IN UINTN ExTokenNumber,\r
431 IN UINT64 Value\r
432 )\r
433{\r
434 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
435}\r
436\r
437\r
438\r
439EFI_STATUS\r
440EFIAPI\r
441DxePcdSetPtrEx (\r
442 IN CONST EFI_GUID *Guid,\r
443 IN UINTN ExTokenNumber,\r
444 IN OUT UINTN *SizeOfBuffer,\r
445 IN VOID *Buffer\r
446 )\r
447{\r
448 return ExSetWorker(ExTokenNumber, Guid, Buffer, SizeOfBuffer, TRUE);\r
449}\r
450\r
451\r
452\r
453EFI_STATUS\r
454EFIAPI\r
455DxePcdSetBoolEx (\r
456 IN CONST EFI_GUID *Guid,\r
457 IN UINTN ExTokenNumber,\r
458 IN BOOLEAN Value\r
459 )\r
460{\r
461 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
462}\r
463\r
464\r
465\r
466\r
467EFI_STATUS\r
468EFIAPI\r
469DxeRegisterCallBackOnSet (\r
470 IN CONST EFI_GUID *Guid, OPTIONAL\r
471 IN UINTN TokenNumber,\r
472 IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
473 )\r
474{\r
475 ASSERT (CallBackFunction != NULL);\r
476 \r
477 return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
478}\r
479\r
480\r
481\r
482EFI_STATUS\r
483EFIAPI\r
484DxeUnRegisterCallBackOnSet (\r
485 IN CONST EFI_GUID *Guid, OPTIONAL\r
486 IN UINTN TokenNumber,\r
487 IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
488 )\r
489{\r
490 ASSERT (CallBackFunction != NULL);\r
491 \r
492 return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
493}\r
494\r
495\r
496\r
497EFI_STATUS\r
498EFIAPI\r
499DxePcdGetNextToken (\r
500 IN CONST EFI_GUID *Guid, OPTIONAL\r
501 IN OUT UINTN *TokenNumber\r
502 )\r
503{\r
504 EFI_STATUS Status;\r
505\r
506 if (!FeaturePcdGet (PcdDxePcdDatabaseTraverseEnabled)) {\r
507 return EFI_UNSUPPORTED;\r
508 }\r
509\r
510 Status = EFI_NOT_FOUND;\r
511 //\r
512 // Scan the local token space\r
513 //\r
514 if (Guid == NULL) {\r
515 // EBC compiler is very choosy. It may report warning about comparison\r
516 // between UINTN and 0 . So we add 1 in each size of the \r
517 // comparison.\r
518 if (((*TokenNumber + 1 > PEI_NEX_TOKEN_NUMBER + 1) && (*TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1)) ||\r
519 ((*TokenNumber + 1 > (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1)))) {\r
520 return EFI_NOT_FOUND;\r
521 }\r
522 \r
523 (*TokenNumber)++;\r
524 if ((*TokenNumber + 1 > PEI_NEX_TOKEN_NUMBER + 1) &&\r
525 (*TokenNumber <= PEI_LOCAL_TOKEN_NUMBER)) {\r
526 //\r
527 // The first Non-Ex type Token Number for DXE PCD \r
528 // database is PEI_LOCAL_TOKEN_NUMBER\r
529 //\r
530 *TokenNumber = PEI_LOCAL_TOKEN_NUMBER;\r
531 } else if (*TokenNumber + 1 > DXE_NEX_TOKEN_NUMBER + PEI_LOCAL_TOKEN_NUMBER + 1) {\r
532 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
533 }\r
534 return EFI_SUCCESS;\r
535 }\r
536\r
537 if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) {\r
538 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
539 return EFI_NOT_FOUND;\r
540 }\r
541\r
542 if (!PEI_EXMAP_TABLE_EMPTY) {\r
543 Status = ExGetNextTokeNumber (\r
544 Guid,\r
545 TokenNumber,\r
546 mPcdDatabase->PeiDb.Init.GuidTable,\r
547 sizeof(mPcdDatabase->PeiDb.Init.GuidTable),\r
548 mPcdDatabase->PeiDb.Init.ExMapTable,\r
549 sizeof(mPcdDatabase->PeiDb.Init.ExMapTable)\r
550 );\r
551 }\r
552\r
553 if (Status == EFI_SUCCESS) {\r
554 return Status;\r
555 }\r
556\r
557 if (!DXE_EXMAP_TABLE_EMPTY) {\r
558 Status = ExGetNextTokeNumber (\r
559 Guid,\r
560 TokenNumber,\r
561 mPcdDatabase->DxeDb.Init.GuidTable,\r
562 sizeof(mPcdDatabase->DxeDb.Init.GuidTable),\r
563 mPcdDatabase->DxeDb.Init.ExMapTable,\r
564 sizeof(mPcdDatabase->DxeDb.Init.ExMapTable)\r
565 );\r
566 }\r
567\r
568 return Status;\r
569}\r
570\r
571\r
572EFI_GUID **\r
573GetDistinctTokenSpace (\r
574 IN OUT UINTN *ExMapTableSize,\r
575 IN DYNAMICEX_MAPPING *ExMapTable,\r
576 IN EFI_GUID *GuidTable\r
577 )\r
578{\r
579 EFI_GUID **DistinctTokenSpace;\r
580 UINTN OldGuidIndex;\r
581 UINTN TsIdx;\r
582 UINTN Idx;\r
583\r
584\r
585 DistinctTokenSpace = AllocateZeroPool (*ExMapTableSize * sizeof (EFI_GUID *));\r
586 ASSERT (DistinctTokenSpace != NULL);\r
587\r
588 TsIdx = 0;\r
589 OldGuidIndex = ExMapTable[0].ExGuidIndex;\r
590 DistinctTokenSpace[TsIdx] = &GuidTable[OldGuidIndex];\r
591 for (Idx = 1; Idx < *ExMapTableSize; Idx++) {\r
592 if (ExMapTable[Idx].ExGuidIndex != OldGuidIndex) {\r
593 OldGuidIndex = ExMapTable[Idx].ExGuidIndex;\r
594 DistinctTokenSpace[++TsIdx] = &GuidTable[OldGuidIndex];\r
595 }\r
596 }\r
597\r
598 //\r
599 // The total number of Distinct Token Space\r
600 // is TsIdx + 1 because we use TsIdx as a index\r
601 // to the DistinctTokenSpace[]\r
602 //\r
603 *ExMapTableSize = TsIdx + 1;\r
604 return DistinctTokenSpace;\r
605 \r
606}\r
607 \r
608//\r
609// Just pre-allocate a memory buffer that is big enough to\r
610// host all distinct TokenSpace guid in both\r
611// PEI ExMap and DXE ExMap.\r
612//\r
613STATIC EFI_GUID *TmpTokenSpaceBuffer[PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE] = { 0 };\r
614\r
615EFI_STATUS\r
616EFIAPI\r
617DxePcdGetNextTokenSpace (\r
618 IN OUT CONST EFI_GUID **Guid\r
619 )\r
620{\r
621 UINTN Idx;\r
622 UINTN Idx2;\r
623 UINTN Idx3;\r
624 UINTN PeiTokenSpaceTableSize;\r
625 UINTN DxeTokenSpaceTableSize;\r
626 EFI_GUID **PeiTokenSpaceTable;\r
627 EFI_GUID **DxeTokenSpaceTable;\r
628 BOOLEAN Match;\r
629\r
630 if (!FeaturePcdGet (PcdDxePcdDatabaseTraverseEnabled)) {\r
631 return EFI_UNSUPPORTED;\r
632 }\r
633\r
634 ASSERT (Guid != NULL);\r
635 \r
636 if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) {\r
637 if (*Guid != NULL) {\r
638 return EFI_NOT_FOUND;\r
639 } else {\r
640 return EFI_SUCCESS;\r
641 }\r
642 }\r
643 \r
644 \r
645 if (TmpTokenSpaceBuffer[0] == NULL) {\r
646 PeiTokenSpaceTableSize = 0;\r
647\r
648 if (!PEI_EXMAP_TABLE_EMPTY) {\r
649 PeiTokenSpaceTableSize = PEI_EXMAPPING_TABLE_SIZE;\r
650 PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize,\r
651 mPcdDatabase->PeiDb.Init.ExMapTable,\r
652 mPcdDatabase->PeiDb.Init.GuidTable\r
653 );\r
654 CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize);\r
655 }\r
656\r
657 if (!DXE_EXMAP_TABLE_EMPTY) {\r
658 DxeTokenSpaceTableSize = DXE_EXMAPPING_TABLE_SIZE;\r
659 DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize,\r
660 mPcdDatabase->DxeDb.Init.ExMapTable,\r
661 mPcdDatabase->DxeDb.Init.GuidTable\r
662 );\r
663\r
664 //\r
665 // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable\r
666 //\r
667 for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) {\r
668 Match = FALSE;\r
669 for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) {\r
670 if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) {\r
671 Match = TRUE;\r
672 break;\r
673 }\r
674 }\r
675 if (!Match) {\r
676 TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2];\r
677 }\r
678 }\r
679 }\r
680 }\r
681\r
682 if (*Guid == NULL) {\r
683 *Guid = TmpTokenSpaceBuffer[0];\r
684 return EFI_SUCCESS;\r
685 }\r
686 \r
687 for (Idx = 0; Idx < (PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE); Idx++) {\r
688 if(CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) {\r
689 Idx++;\r
690 *Guid = TmpTokenSpaceBuffer[Idx];\r
691 return EFI_SUCCESS;\r
692 }\r
693 }\r
694\r
695 return EFI_NOT_FOUND;\r
696\r
697}\r
698\r
699\r