]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Change behavior if found more than one FPD files from let user choice one to report...
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Pcd.c
CommitLineData
52e1905d 1/** @file PCD PEIM\r
878ddf1f 2\r
3Copyright (c) 2006, Intel Corporation \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
11\r
12\r
13Module Name: Pcd.c\r
14\r
15**/\r
16\r
878ddf1f 17#include "Service.h"\r
18\r
19\r
20PCD_PPI mPcdPpiInstance = {\r
21 PeiPcdSetSku,\r
22\r
23 PeiPcdGet8,\r
24 PeiPcdGet16, \r
25 PeiPcdGet32, \r
26 PeiPcdGet64, \r
27 PeiPcdGetPtr, \r
28 PeiPcdGetBool, \r
29 PeiPcdGetSize,\r
30\r
31 PeiPcdGet8Ex,\r
32 PeiPcdGet16Ex, \r
33 PeiPcdGet32Ex, \r
34 PeiPcdGet64Ex, \r
35 PeiPcdGetPtrEx, \r
36 PeiPcdGetBoolEx, \r
37 PeiPcdGetSizeEx,\r
38 \r
39 PeiPcdSet8,\r
40 PeiPcdSet16, \r
41 PeiPcdSet32, \r
42 PeiPcdSet64, \r
43 PeiPcdSetPtr, \r
44 PeiPcdSetBool, \r
45\r
46 PeiPcdSet8Ex,\r
47 PeiPcdSet16Ex, \r
48 PeiPcdSet32Ex, \r
49 PeiPcdSet64Ex, \r
50 PeiPcdSetPtrEx, \r
51 PeiPcdSetBoolEx,\r
52\r
4c114006 53 PeiRegisterCallBackOnSet,\r
878ddf1f 54 PcdUnRegisterCallBackOnSet,\r
4276d5da 55 PeiPcdGetNextToken,\r
56 PeiPcdGetNextTokenSpace\r
878ddf1f 57};\r
58\r
59\r
60\r
61STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {\r
62 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
63 &gPcdPpiGuid,\r
64 &mPcdPpiInstance\r
65};\r
66\r
67\r
68\r
69EFI_STATUS\r
70EFIAPI\r
71PcdPeimInit (\r
72 IN EFI_FFS_FILE_HEADER *FfsHeader,\r
73 IN EFI_PEI_SERVICES **PeiServices\r
74 )\r
75{\r
76 EFI_STATUS Status;\r
878ddf1f 77\r
52e1905d 78 BuildPcdDatabase ();\r
79 \r
84a99d48 80 Status = PeiServicesInstallPpi (&mPpiPCD);\r
878ddf1f 81\r
82 ASSERT_EFI_ERROR (Status);\r
83 \r
84 return EFI_SUCCESS;\r
85}\r
86\r
00b7af13 87VOID\r
878ddf1f 88EFIAPI\r
89PeiPcdSetSku (\r
8a43e8dd 90 IN UINTN SkuId\r
878ddf1f 91 )\r
92{\r
878ddf1f 93\r
8a43e8dd 94 GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;\r
878ddf1f 95\r
00b7af13 96 return;\r
878ddf1f 97}\r
98\r
99\r
100\r
101UINT8\r
102EFIAPI\r
103PeiPcdGet8 (\r
8a43e8dd 104 IN UINTN TokenNumber\r
878ddf1f 105 )\r
106{\r
52e1905d 107 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
878ddf1f 108}\r
109\r
110\r
111\r
112UINT16\r
113EFIAPI\r
114PeiPcdGet16 (\r
8a43e8dd 115 IN UINTN TokenNumber\r
878ddf1f 116 )\r
117{\r
52e1905d 118 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
878ddf1f 119}\r
120\r
121\r
122\r
123UINT32\r
124EFIAPI\r
125PeiPcdGet32 (\r
8a43e8dd 126 IN UINTN TokenNumber\r
878ddf1f 127 )\r
128{\r
52e1905d 129 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
878ddf1f 130}\r
131\r
132\r
133\r
134UINT64\r
135EFIAPI\r
136PeiPcdGet64 (\r
8a43e8dd 137 IN UINTN TokenNumber\r
878ddf1f 138 )\r
139{\r
52e1905d 140 return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
878ddf1f 141}\r
142\r
143\r
144\r
145VOID *\r
146EFIAPI\r
147PeiPcdGetPtr (\r
8a43e8dd 148 IN UINTN TokenNumber\r
878ddf1f 149 )\r
150{\r
52e1905d 151 return GetWorker (TokenNumber, 0);\r
878ddf1f 152}\r
153\r
154\r
155\r
156BOOLEAN\r
157EFIAPI\r
158PeiPcdGetBool (\r
8a43e8dd 159 IN UINTN TokenNumber\r
878ddf1f 160 )\r
161{\r
52e1905d 162 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
878ddf1f 163}\r
164\r
165\r
166\r
167UINTN\r
168EFIAPI\r
169PeiPcdGetSize (\r
8a43e8dd 170 IN UINTN TokenNumber\r
878ddf1f 171 )\r
172{\r
1de04b4f 173 PEI_PCD_DATABASE *PeiPcdDb;\r
174 UINTN Size;\r
175 UINTN MaxSize;\r
176\r
f89f5802 177 if (!FeaturePcdGet(PcdPeiPcdDatabaseGetSizeEnabled)) {\r
178 return EFI_UNSUPPORTED;\r
179 }\r
180\r
1de04b4f 181 PeiPcdDb = GetPcdDatabase ();\r
58f1099f 182 //\r
183 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
184 // We have to decrement TokenNumber by 1 to make it usable\r
185 // as the array index.\r
186 //\r
187 TokenNumber--;\r
188\r
4f914125 189 // EBC compiler is very choosy. It may report warning about comparison\r
190 // between UINTN and 0 . So we add 1 in each size of the \r
191 // comparison.\r
192 ASSERT (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
52e1905d 193\r
1de04b4f 194 Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
195\r
196 if (Size == 0) {\r
197 //\r
198 // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
199 //\r
200 return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);\r
201 } else {\r
202 return Size;\r
203 }\r
204\r
878ddf1f 205}\r
206\r
207\r
208\r
209UINT8\r
210EFIAPI\r
211PeiPcdGet8Ex (\r
212 IN CONST EFI_GUID *Guid,\r
8a43e8dd 213 IN UINTN ExTokenNumber\r
878ddf1f 214 )\r
215{\r
52e1905d 216 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
878ddf1f 217}\r
218\r
219\r
220\r
221UINT16\r
222EFIAPI\r
223PeiPcdGet16Ex (\r
224 IN CONST EFI_GUID *Guid,\r
8a43e8dd 225 IN UINTN ExTokenNumber\r
878ddf1f 226 )\r
227{\r
52e1905d 228 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
878ddf1f 229}\r
230\r
231\r
232\r
233UINT32\r
234EFIAPI\r
235PeiPcdGet32Ex (\r
236 IN CONST EFI_GUID *Guid,\r
8a43e8dd 237 IN UINTN ExTokenNumber\r
878ddf1f 238 )\r
239{\r
52e1905d 240 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
878ddf1f 241}\r
242\r
243\r
244\r
245UINT64\r
246EFIAPI\r
247PeiPcdGet64Ex (\r
248 IN CONST EFI_GUID *Guid,\r
8a43e8dd 249 IN UINTN ExTokenNumber\r
878ddf1f 250 )\r
251{\r
52e1905d 252 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
878ddf1f 253}\r
254\r
255\r
256\r
257VOID *\r
258EFIAPI\r
259PeiPcdGetPtrEx (\r
260 IN CONST EFI_GUID *Guid,\r
8a43e8dd 261 IN UINTN ExTokenNumber\r
878ddf1f 262 )\r
263{\r
52e1905d 264 return ExGetWorker (Guid, ExTokenNumber, 0);\r
878ddf1f 265}\r
266\r
267\r
268\r
269BOOLEAN\r
270EFIAPI\r
271PeiPcdGetBoolEx (\r
272 IN CONST EFI_GUID *Guid,\r
8a43e8dd 273 IN UINTN ExTokenNumber\r
878ddf1f 274 )\r
275{\r
52e1905d 276 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
878ddf1f 277}\r
278\r
279\r
280\r
281UINTN\r
282EFIAPI\r
283PeiPcdGetSizeEx (\r
284 IN CONST EFI_GUID *Guid,\r
8a43e8dd 285 IN UINTN ExTokenNumber\r
878ddf1f 286 )\r
287{\r
f89f5802 288 if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled)) || !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) {\r
289 return EFI_UNSUPPORTED;\r
290 }\r
291\r
9d6d8b24 292 return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
878ddf1f 293}\r
294\r
295\r
296\r
297EFI_STATUS\r
298EFIAPI\r
299PeiPcdSet8 (\r
8a43e8dd 300 IN UINTN TokenNumber,\r
1de04b4f 301 IN UINT8 Value\r
878ddf1f 302 )\r
303{\r
1de04b4f 304 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 305}\r
306\r
307\r
308\r
309EFI_STATUS\r
310EFIAPI\r
311PeiPcdSet16 (\r
1de04b4f 312 IN UINTN TokenNumber,\r
313 IN UINT16 Value\r
878ddf1f 314 )\r
315{\r
1de04b4f 316 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 317}\r
318\r
319\r
320\r
321EFI_STATUS\r
322EFIAPI\r
323PeiPcdSet32 (\r
1de04b4f 324 IN UINTN TokenNumber,\r
325 IN UINT32 Value\r
878ddf1f 326 )\r
327{\r
1de04b4f 328 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 329}\r
330\r
331\r
332\r
333EFI_STATUS\r
334EFIAPI\r
335PeiPcdSet64 (\r
1de04b4f 336 IN UINTN TokenNumber,\r
337 IN UINT64 Value\r
878ddf1f 338 )\r
339{\r
1de04b4f 340 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 341}\r
342\r
343\r
344EFI_STATUS\r
345EFIAPI\r
346PeiPcdSetPtr (\r
1de04b4f 347 IN UINTN TokenNumber,\r
348 IN OUT UINTN *SizeOfBuffer,\r
349 IN VOID *Buffer\r
878ddf1f 350 )\r
351{\r
00b7af13 352 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
878ddf1f 353}\r
354\r
355\r
356\r
357EFI_STATUS\r
358EFIAPI\r
359PeiPcdSetBool (\r
1de04b4f 360 IN UINTN TokenNumber,\r
361 IN BOOLEAN Value\r
878ddf1f 362 )\r
363{\r
1de04b4f 364 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 365}\r
366\r
367\r
368\r
369EFI_STATUS\r
370EFIAPI\r
371PeiPcdSet8Ex (\r
372 IN CONST EFI_GUID *Guid,\r
8a43e8dd 373 IN UINTN ExTokenNumber,\r
878ddf1f 374 IN UINT8 Value\r
375 )\r
376{\r
1de04b4f 377 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 378}\r
379\r
380\r
381\r
382EFI_STATUS\r
383EFIAPI\r
384PeiPcdSet16Ex (\r
385 IN CONST EFI_GUID *Guid,\r
8a43e8dd 386 IN UINTN ExTokenNumber,\r
878ddf1f 387 IN UINT16 Value\r
388 )\r
389{\r
1de04b4f 390 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 391}\r
392\r
393\r
394\r
395EFI_STATUS\r
396EFIAPI\r
397PeiPcdSet32Ex (\r
398 IN CONST EFI_GUID *Guid,\r
8a43e8dd 399 IN UINTN ExTokenNumber,\r
878ddf1f 400 IN UINT32 Value\r
401 )\r
402{\r
1de04b4f 403 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 404}\r
405\r
406\r
407\r
408EFI_STATUS\r
409EFIAPI\r
410PeiPcdSet64Ex (\r
411 IN CONST EFI_GUID *Guid,\r
8a43e8dd 412 IN UINTN ExTokenNumber,\r
878ddf1f 413 IN UINT64 Value\r
414 )\r
415{\r
1de04b4f 416 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 417}\r
418\r
419\r
420\r
421EFI_STATUS\r
422EFIAPI\r
423PeiPcdSetPtrEx (\r
424 IN CONST EFI_GUID *Guid,\r
8a43e8dd 425 IN UINTN ExTokenNumber,\r
1de04b4f 426 IN UINTN *SizeOfBuffer,\r
00b7af13 427 IN VOID *Value\r
878ddf1f 428 )\r
429{\r
1de04b4f 430 return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);\r
878ddf1f 431}\r
432\r
433\r
434\r
435EFI_STATUS\r
436EFIAPI\r
437PeiPcdSetBoolEx (\r
438 IN CONST EFI_GUID *Guid,\r
8a43e8dd 439 IN UINTN ExTokenNumber,\r
878ddf1f 440 IN BOOLEAN Value\r
441 )\r
442{\r
1de04b4f 443 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 444}\r
445\r
446\r
447\r
448\r
449EFI_STATUS\r
450EFIAPI\r
4c114006 451PeiRegisterCallBackOnSet (\r
878ddf1f 452 IN CONST EFI_GUID *Guid, OPTIONAL\r
2a870f53 453 IN UINTN ExTokenNumber,\r
878ddf1f 454 IN PCD_PPI_CALLBACK CallBackFunction\r
455 )\r
456{\r
f89f5802 457 if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
458 return EFI_UNSUPPORTED;\r
459 }\r
460\r
4c114006 461 ASSERT (CallBackFunction != NULL);\r
462 \r
52e1905d 463 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
878ddf1f 464}\r
465\r
466\r
467\r
468EFI_STATUS\r
469EFIAPI\r
470PcdUnRegisterCallBackOnSet (\r
878ddf1f 471 IN CONST EFI_GUID *Guid, OPTIONAL\r
2a870f53 472 IN UINTN ExTokenNumber,\r
878ddf1f 473 IN PCD_PPI_CALLBACK CallBackFunction\r
474 )\r
475{\r
f89f5802 476 if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
477 return EFI_UNSUPPORTED;\r
478 }\r
479\r
4c114006 480 ASSERT (CallBackFunction != NULL);\r
481 \r
52e1905d 482 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
878ddf1f 483}\r
484\r
485\r
486\r
487EFI_STATUS\r
488EFIAPI\r
489PeiPcdGetNextToken (\r
490 IN CONST EFI_GUID *Guid, OPTIONAL\r
8a43e8dd 491 IN OUT UINTN *TokenNumber\r
878ddf1f 492 )\r
493{\r
00b7af13 494 UINTN GuidTableIdx;\r
495 PEI_PCD_DATABASE *PeiPcdDb;\r
496 EFI_GUID *MatchGuid;\r
497 DYNAMICEX_MAPPING *ExMapTable;\r
498 UINTN i;\r
499 BOOLEAN Found;\r
500 \r
4f914125 501 if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
502 return EFI_UNSUPPORTED;\r
503 }\r
504 \r
52e1905d 505 if (Guid == NULL) {\r
2b21a971 506 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
507 return EFI_NOT_FOUND;\r
508 }\r
b560bb65 509 (*TokenNumber)++;\r
c24ba2f6 510 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
0653eb89 511 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
52e1905d 512 }\r
c24ba2f6 513 return EFI_SUCCESS;\r
00b7af13 514 } else {\r
00b7af13 515 if (PEI_EXMAP_TABLE_EMPTY) {\r
0653eb89 516 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
c24ba2f6 517 return EFI_SUCCESS;\r
00b7af13 518 }\r
519 \r
520 //\r
521 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
522 // 1) ExGuid\r
523 // 2) ExTokenNumber\r
524 //\r
525 PeiPcdDb = GetPcdDatabase ();\r
526 \r
527 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
528\r
529 if (MatchGuid == NULL) {\r
c24ba2f6 530 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
00b7af13 531 return EFI_NOT_FOUND;\r
532 }\r
533\r
534 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
535\r
536 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
537\r
538 Found = FALSE;\r
c24ba2f6 539 //\r
540 // Locate the GUID in ExMapTable first.\r
541 //\r
00b7af13 542 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
543 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
544 Found = TRUE;\r
545 break;\r
546 }\r
547 }\r
548\r
549 if (Found) {\r
550 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
551 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
552 return EFI_SUCCESS;\r
553 }\r
c24ba2f6 554\r
555 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
00b7af13 556 if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
557 i++;\r
c24ba2f6 558 if (i == PEI_EXMAPPING_TABLE_SIZE) {\r
559 //\r
560 // Exceed the length of ExMap Table\r
561 //\r
562 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
563 return EFI_SUCCESS;\r
564 }\r
00b7af13 565 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
566 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
567 return EFI_SUCCESS;\r
568 } else {\r
c24ba2f6 569 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
00b7af13 570 return EFI_SUCCESS;\r
571 }\r
572 }\r
573 }\r
00b7af13 574 return EFI_NOT_FOUND;\r
575 }\r
00b7af13 576 }\r
577\r
c24ba2f6 578 return EFI_NOT_FOUND;\r
00b7af13 579}\r
580\r
1de04b4f 581\r
582\r
58f1099f 583EFI_STATUS\r
00b7af13 584EFIAPI\r
4276d5da 585PeiPcdGetNextTokenSpace (\r
58f1099f 586 IN OUT CONST EFI_GUID **Guid\r
00b7af13 587 )\r
588{\r
589 UINTN GuidTableIdx;\r
590 EFI_GUID *MatchGuid;\r
591 PEI_PCD_DATABASE *PeiPcdDb;\r
592 DYNAMICEX_MAPPING *ExMapTable;\r
593 UINTN i;\r
594 BOOLEAN Found;\r
595\r
4f914125 596 if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
597 return EFI_UNSUPPORTED;\r
598 }\r
599\r
4276d5da 600 ASSERT (Guid != NULL);\r
601\r
602 if (PEI_EXMAP_TABLE_EMPTY) {\r
603 if (*Guid != NULL) {\r
604 return EFI_NOT_FOUND;\r
58f1099f 605 } else {\r
58f1099f 606 return EFI_SUCCESS;\r
607 }\r
4276d5da 608 }\r
52e1905d 609\r
610 //\r
00b7af13 611 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
612 // 1) ExGuid\r
613 // 2) ExTokenNumber\r
52e1905d 614 //\r
00b7af13 615 PeiPcdDb = GetPcdDatabase ();\r
52e1905d 616\r
4276d5da 617 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
618\r
619 if (*Guid == NULL) {\r
620 //\r
621 // return the first Token Space Guid.\r
622 //\r
623 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
624 return EFI_SUCCESS;\r
625 }\r
626\r
58f1099f 627 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
00b7af13 628\r
629 if (MatchGuid == NULL) {\r
58f1099f 630 return EFI_NOT_FOUND;\r
00b7af13 631 }\r
632 \r
633 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
878ddf1f 634\r
00b7af13 635 Found = FALSE;\r
636 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
637 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
638 Found = TRUE;\r
639 break;\r
640 }\r
641 }\r
642\r
643 if (Found) {\r
4276d5da 644 i++;\r
00b7af13 645 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
646 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
58f1099f 647 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
648 return EFI_SUCCESS;\r
00b7af13 649 }\r
650 }\r
4276d5da 651 *Guid = NULL;\r
652 return EFI_SUCCESS;\r
00b7af13 653 }\r
654\r
58f1099f 655 return EFI_NOT_FOUND;\r
00b7af13 656\r
657}\r
878ddf1f 658\r