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