]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/PCD/Pei/Service.c
Sync up Pcd Library Instances and PCD Driver/PEIM with Pcd spec 0.51 and Mde 0.51
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Service.c
CommitLineData
878ddf1f 1/** @file\r
2Private functions used by PCD PEIM.\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: Service.c\r
15\r
16**/\r
878ddf1f 17#include "Service.h"\r
18\r
19\r
52e1905d 20//\r
21// Build Tool will generate PEI_PCD_DB_INIT_VALUE in Autogen.h\r
22//\r
23/* PEI_PCD_DATABASE_INIT\r
24gPEIPcdDbInit = {\r
25 PEI_PCD_DB_INIT_VALUE\r
26};\r
27*/\r
878ddf1f 28\r
29\r
878ddf1f 30\r
31\r
32/**\r
52e1905d 33 The function registers the CallBackOnSet fucntion\r
34 according to TokenNumber and EFI_GUID space.\r
878ddf1f 35\r
52e1905d 36 @param[in] TokenNumber The token number.\r
37 @param[in] Guid The GUID space.\r
38 @param[in] CallBackFunction The Callback function to be registered.\r
878ddf1f 39\r
52e1905d 40 @retval EFI_SUCCESS If the Callback function is registered.\r
41 @retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space.\r
878ddf1f 42--*/\r
52e1905d 43EFI_STATUS\r
44PeiRegisterCallBackWorker (\r
45 IN UINTN ExTokenNumber,\r
46 IN CONST EFI_GUID *Guid, OPTIONAL\r
47 IN PCD_PPI_CALLBACK CallBackFunction,\r
48 IN BOOLEAN Register\r
878ddf1f 49)\r
50{\r
52e1905d 51 EFI_HOB_GUID_TYPE *GuidHob;\r
52 PCD_PPI_CALLBACK *CallbackTable;\r
53 PCD_PPI_CALLBACK Compare;\r
54 PCD_PPI_CALLBACK Assign;\r
55 UINT32 LocalTokenNumber;\r
56 UINTN TokenNumber;\r
57 UINTN Idx;\r
58 EX_PCD_ENTRY_ATTRIBUTE Attr;\r
878ddf1f 59\r
52e1905d 60 if (Guid == NULL) {\r
61 TokenNumber = ExTokenNumber;\r
62 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
63 LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber];\r
64 } else {\r
65 GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
66 TokenNumber = Attr.TokenNumber;\r
67 LocalTokenNumber = Attr.LocalTokenNumberAlias;\r
68 }\r
878ddf1f 69\r
52e1905d 70 ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\r
71 ASSERT ((LocalTokenNumber & PCD_TYPE_VPD) == 0);\r
878ddf1f 72\r
52e1905d 73 GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
878ddf1f 74 ASSERT (GuidHob != NULL);\r
52e1905d 75 \r
76 CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
878ddf1f 77\r
52e1905d 78 Compare = Register? NULL: CallBackFunction;\r
79 Assign = Register? CallBackFunction: NULL;\r
878ddf1f 80\r
52e1905d 81 for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
82 if (CallbackTable[Idx] == Compare) {\r
83 CallbackTable[Idx] = Assign;\r
84 return EFI_SUCCESS;\r
85 }\r
86 }\r
878ddf1f 87\r
52e1905d 88 return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
878ddf1f 89\r
878ddf1f 90}\r
91\r
92\r
878ddf1f 93\r
878ddf1f 94\r
52e1905d 95/**\r
96 The function builds the PCD database based on the\r
97 PCD_IMAGE on the flash.\r
878ddf1f 98\r
52e1905d 99 @param[in] PcdImageOnFlash The PCD image on flash.\r
878ddf1f 100\r
52e1905d 101 @retval VOID\r
878ddf1f 102--*/\r
52e1905d 103VOID\r
104BuildPcdDatabase (\r
105 VOID\r
878ddf1f 106 )\r
107{\r
52e1905d 108 PEI_PCD_DATABASE *Database;\r
109 VOID *CallbackFnTable;\r
110 UINTN SizeOfCallbackFnTable;\r
111 \r
112 Database = BuildGuidHob (&gPcdDataBaseHobGuid, sizeof (PEI_PCD_DATABASE));\r
878ddf1f 113\r
52e1905d 114 ZeroMem (Database, sizeof (PEI_PCD_DATABASE));\r
878ddf1f 115\r
116 //\r
52e1905d 117 // gPEIPcdDbInit is smaller than PEI_PCD_DATABASE\r
878ddf1f 118 //\r
878ddf1f 119 \r
52e1905d 120 CopyMem (&Database->Init, &gPEIPcdDbInit, sizeof (gPEIPcdDbInit));\r
878ddf1f 121\r
52e1905d 122 SizeOfCallbackFnTable = PEI_LOCAL_TOKEN_NUMBER * sizeof (PCD_PPI_CALLBACK) * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry);\r
878ddf1f 123\r
52e1905d 124 CallbackFnTable = BuildGuidHob (&gPcdPeiCallbackFnTableHobGuid, SizeOfCallbackFnTable);\r
125 \r
126 ZeroMem (CallbackFnTable, SizeOfCallbackFnTable);\r
127 \r
128 return;\r
878ddf1f 129}\r
130\r
131\r
132\r
133/**\r
52e1905d 134 The function is provided by PCD PEIM and PCD DXE driver to\r
135 do the work of reading a HII variable from variable service.\r
878ddf1f 136\r
52e1905d 137 @param[in] VariableGuid The Variable GUID.\r
138 @param[in] VariableName The Variable Name.\r
139 @param[out] VariableData The output data.\r
140 @param[out] VariableSize The size of the variable.\r
878ddf1f 141\r
52e1905d 142 @retval EFI_SUCCESS Operation successful.\r
143 @retval EFI_SUCCESS Variablel not found.\r
878ddf1f 144--*/\r
145EFI_STATUS\r
52e1905d 146GetHiiVariable (\r
147 IN CONST EFI_GUID *VariableGuid,\r
148 IN UINT16 *VariableName,\r
149 OUT VOID **VariableData,\r
150 OUT UINTN *VariableSize\r
878ddf1f 151 )\r
152{\r
52e1905d 153 UINTN Size;\r
154 EFI_STATUS Status;\r
155 VOID *Buffer;\r
156 EFI_PEI_READ_ONLY_VARIABLE_PPI *VariablePpi;\r
878ddf1f 157\r
52e1905d 158 Status = PeiCoreLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, &VariablePpi);\r
159 ASSERT_EFI_ERROR (Status);\r
878ddf1f 160\r
52e1905d 161 Size = 0;\r
878ddf1f 162\r
52e1905d 163 Status = VariablePpi->PeiGetVariable (\r
164 GetPeiServicesTablePointer (),\r
165 VariableName,\r
166 (EFI_GUID *) VariableGuid,\r
167 NULL,\r
168 &Size,\r
169 NULL\r
170 );\r
171 ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
172\r
173 Status = PeiCoreAllocatePool (Size, &Buffer);\r
174 ASSERT_EFI_ERROR (Status);\r
175\r
176 // declare a local for STP.\r
177 //\r
178 Status = VariablePpi->PeiGetVariable (\r
179 GetPeiServicesTablePointer (),\r
180 (UINT16 *) VariableName,\r
181 (EFI_GUID *) VariableGuid,\r
182 NULL,\r
183 &Size,\r
184 Buffer\r
185 );\r
186 ASSERT_EFI_ERROR (Status);\r
187\r
188 *VariableSize = Size;\r
189 *VariableData = Buffer;\r
878ddf1f 190\r
191 return EFI_SUCCESS;\r
192}\r
193\r
194\r
52e1905d 195UINT32\r
196GetSkuEnabledTokenNumber (\r
197 UINT32 LocalTokenNumber,\r
198 UINTN Size\r
199 ) \r
878ddf1f 200{\r
52e1905d 201 PEI_PCD_DATABASE *PeiPcdDb;\r
202 SKU_HEAD *SkuHead;\r
203 SKU_ID *SkuIdTable;\r
204 INTN i;\r
205 UINT8 *Value;\r
206\r
207 PeiPcdDb = GetPcdDatabase ();\r
208\r
209 ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
210\r
211 SkuHead = (SKU_HEAD *) ((UINT8 *)PeiPcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
212 Value = (UINT8 *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuDataStartOffset));\r
213 SkuIdTable = (SKU_ID *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuIdTableOffset));\r
214 \r
215 for (i = 0; i < SkuIdTable[0]; i++) {\r
216 if (PeiPcdDb->Init.SystemSkuId == SkuIdTable[i + 1]) {\r
217 break;\r
218 }\r
219 }\r
878ddf1f 220\r
52e1905d 221 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
222 case PCD_TYPE_VPD:\r
223 Value += sizeof(VPD_HEAD) * i;\r
224 return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD);\r
225\r
226 case PCD_TYPE_HII:\r
227 Value += sizeof(VARIABLE_HEAD) * i;\r
228 return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII);\r
229 \r
230 case 0: //Change to a MACRO PCD_TYPE_DATA\r
231 Value += Size * i;\r
232 return (Value - (UINT8 *) PeiPcdDb);\r
233 \r
234 default:\r
235 ASSERT (FALSE);\r
236 }\r
878ddf1f 237\r
52e1905d 238 ASSERT (FALSE);\r
878ddf1f 239\r
52e1905d 240 return 0;\r
241 \r
878ddf1f 242}\r
243\r
244\r
245\r
878ddf1f 246\r
52e1905d 247VOID\r
248InvokeCallbackOnSet (\r
249 UINT32 ExTokenNumber,\r
250 CONST EFI_GUID *Guid, OPTIONAL\r
251 UINTN TokenNumber,\r
252 VOID *Data,\r
253 UINTN Size\r
254 )\r
878ddf1f 255{\r
878ddf1f 256 EFI_HOB_GUID_TYPE *GuidHob;\r
878ddf1f 257 PCD_PPI_CALLBACK *CallbackTable;\r
52e1905d 258 UINTN Idx;\r
878ddf1f 259\r
52e1905d 260 if (Guid == NULL)\r
261 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
262\r
263 GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
878ddf1f 264 ASSERT (GuidHob != NULL);\r
265 \r
52e1905d 266 CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
878ddf1f 267\r
52e1905d 268 CallbackTable += (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
878ddf1f 269\r
52e1905d 270 for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
271 if (CallbackTable[Idx] != NULL) {\r
272 CallbackTable[Idx] (Guid,\r
273 (Guid == NULL)? TokenNumber: ExTokenNumber,\r
274 Data,\r
275 Size\r
276 );\r
878ddf1f 277 }\r
278 }\r
52e1905d 279 \r
878ddf1f 280}\r
281\r
878ddf1f 282EFI_STATUS\r
52e1905d 283SetWorker (\r
284 UINTN TokenNumber,\r
285 VOID *Data,\r
286 UINTN Size,\r
287 BOOLEAN PtrType\r
878ddf1f 288 )\r
289{\r
52e1905d 290 UINT32 LocalTokenNumber;\r
291 PEI_PCD_DATABASE *PeiPcdDb;\r
878ddf1f 292\r
52e1905d 293 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
294 \r
295 PeiPcdDb = GetPcdDatabase ();\r
878ddf1f 296\r
52e1905d 297 LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
878ddf1f 298\r
52e1905d 299 if (PtrType) {\r
300 ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] >= Size);\r
301 } else {\r
302 ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] == Size);\r
303 }\r
878ddf1f 304\r
52e1905d 305 InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
878ddf1f 306\r
52e1905d 307 return SetWorkerByLocalTokenNumber (LocalTokenNumber, Data, Size, PtrType);\r
878ddf1f 308\r
878ddf1f 309}\r
310\r
311\r
312\r
878ddf1f 313\r
52e1905d 314EFI_STATUS\r
315ExSetWorker (\r
316 IN UINT32 ExTokenNumber,\r
317 IN CONST EFI_GUID *Guid,\r
318 VOID *Data,\r
319 UINTN Size,\r
320 BOOLEAN PtrType\r
878ddf1f 321 )\r
322{\r
52e1905d 323 PEI_PCD_DATABASE *PeiPcdDb;\r
324 EX_PCD_ENTRY_ATTRIBUTE Attr;\r
878ddf1f 325\r
878ddf1f 326\r
52e1905d 327 PeiPcdDb = GetPcdDatabase ();\r
878ddf1f 328\r
52e1905d 329 GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
878ddf1f 330\r
52e1905d 331 ASSERT (!PtrType && Attr.Size);\r
878ddf1f 332\r
52e1905d 333 ASSERT (PtrType && Attr.Size >= Size);\r
878ddf1f 334\r
52e1905d 335 InvokeCallbackOnSet (ExTokenNumber, Guid, Attr.TokenNumber, Data, Size);\r
878ddf1f 336\r
52e1905d 337 SetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, Data, Size, PtrType);\r
878ddf1f 338\r
52e1905d 339 return EFI_SUCCESS;\r
340 \r
878ddf1f 341}\r
342\r
343\r
878ddf1f 344\r
878ddf1f 345\r
52e1905d 346EFI_STATUS\r
347SetWorkerByLocalTokenNumber (\r
348 UINT32 LocalTokenNumber,\r
349 VOID *Data,\r
350 UINTN Size,\r
351 BOOLEAN PtrType\r
352 )\r
878ddf1f 353{\r
52e1905d 354 PEI_PCD_DATABASE *PeiPcdDb;\r
355 UINT8 *PeiPcdDbRaw;\r
356 UINT16 StringTableIdx;\r
357 UINTN Offset;\r
358 VOID *InternalData;\r
359 \r
360\r
361 PeiPcdDb = GetPcdDatabase ();\r
362 PeiPcdDbRaw = (UINT8 *) PeiPcdDb;\r
878ddf1f 363 \r
52e1905d 364 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
365 LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
366 }\r
878ddf1f 367\r
52e1905d 368 Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
369 InternalData = (VOID *) (PeiPcdDbRaw + Offset);\r
878ddf1f 370 \r
52e1905d 371 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
372 case PCD_TYPE_VPD:\r
373 case PCD_TYPE_HII:\r
374 {\r
375 ASSERT (FALSE);\r
376 return EFI_INVALID_PARAMETER;\r
377 }\r
878ddf1f 378\r
52e1905d 379 case PCD_TYPE_STRING:\r
380 StringTableIdx = *((UINT16 *)InternalData);\r
381 CopyMem (&PeiPcdDb->Init.StringTable[StringTableIdx], Data, Size);\r
382 break;\r
878ddf1f 383\r
52e1905d 384 case PCD_TYPE_DATA:\r
385 {\r
386 \r
387 if (PtrType) {\r
388 CopyMem (InternalData, Data, Size);\r
389 return EFI_SUCCESS;\r
390 }\r
878ddf1f 391\r
52e1905d 392 switch (Size) {\r
393 case sizeof(UINT8):\r
394 *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
395 return EFI_SUCCESS;\r
878ddf1f 396\r
52e1905d 397 case sizeof(UINT16):\r
398 *((UINT16 *) InternalData) = *((UINT16 *) Data);\r
399 return EFI_SUCCESS;\r
878ddf1f 400\r
52e1905d 401 case sizeof(UINT32):\r
402 *((UINT32 *) InternalData) = *((UINT32 *) Data);\r
403 return EFI_SUCCESS;\r
878ddf1f 404\r
52e1905d 405 case sizeof(UINT64):\r
406 *((UINT64 *) InternalData) = *((UINT64 *) Data);\r
407 return EFI_SUCCESS;\r
878ddf1f 408\r
52e1905d 409 default:\r
410 ASSERT (FALSE);\r
411 return EFI_NOT_FOUND;\r
412 }\r
413 }\r
414 \r
878ddf1f 415 }\r
416\r
52e1905d 417 ASSERT (FALSE);\r
418 return EFI_NOT_FOUND;\r
878ddf1f 419}\r
420\r
421\r
52e1905d 422VOID *\r
423GetWorkerByLocalTokenNumber (\r
424 PEI_PCD_DATABASE *PeiPcdDb,\r
425 UINT32 LocalTokenNumber,\r
426 UINTN Size\r
878ddf1f 427 )\r
428{\r
52e1905d 429 UINT32 Offset;\r
430 EFI_GUID *Guid;\r
431 UINT16 *Name;\r
432 VARIABLE_HEAD *VariableHead;\r
433 EFI_STATUS Status;\r
434 UINTN DataSize;\r
435 VOID *Data;\r
436 UINT16 *StringTable;\r
437 UINT16 StringTableIdx;\r
438 \r
439 PeiPcdDb = GetPcdDatabase ();\r
440\r
441 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
442 LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
443 }\r
878ddf1f 444\r
52e1905d 445 Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
446 StringTable = PeiPcdDb->Init.StringTable;\r
447 \r
448 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
449 case PCD_TYPE_VPD:\r
450 {\r
451 VPD_HEAD *VpdHead;\r
452 VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
453 return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
454 }\r
455 \r
456 case PCD_TYPE_HII:\r
457 {\r
458 VariableHead = (VARIABLE_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
459 \r
460 Guid = &(PeiPcdDb->Init.GuidTable[VariableHead->GuidTableIndex]);\r
461 Name = &StringTable[VariableHead->StringIndex];\r
462\r
463 Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
464 ASSERT_EFI_ERROR (Status);\r
465 ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size));\r
466\r
467 return (VOID *) ((UINT8 *) Data + VariableHead->Offset);\r
468 }\r
878ddf1f 469\r
52e1905d 470 case PCD_TYPE_DATA:\r
471 return (VOID *) ((UINT8 *)PeiPcdDb + Offset);\r
472 break;\r
878ddf1f 473\r
52e1905d 474 case PCD_TYPE_STRING:\r
475 StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset);\r
476 return (VOID *) (&StringTable[StringTableIdx]);\r
878ddf1f 477\r
52e1905d 478 default:\r
479 ASSERT (FALSE);\r
480 break;\r
481 \r
482 }\r
878ddf1f 483\r
52e1905d 484 ASSERT (FALSE);\r
485 \r
486 return NULL;\r
487 \r
488}\r
878ddf1f 489\r
878ddf1f 490\r
52e1905d 491VOID *\r
492ExGetWorker (\r
493 IN CONST EFI_GUID *Guid,\r
494 IN UINT32 ExTokenNumber,\r
495 IN UINTN GetSize\r
878ddf1f 496 )\r
497{\r
52e1905d 498 EX_PCD_ENTRY_ATTRIBUTE Attr;\r
878ddf1f 499\r
52e1905d 500 GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
878ddf1f 501 \r
52e1905d 502 ASSERT ((GetSize == Attr.Size) || (GetSize == 0));\r
878ddf1f 503\r
52e1905d 504 return GetWorkerByLocalTokenNumber (GetPcdDatabase(),\r
505 Attr.LocalTokenNumberAlias,\r
506 Attr.Size\r
507 );\r
878ddf1f 508}\r
509\r
52e1905d 510VOID *\r
511GetWorker (\r
512 UINTN TokenNumber,\r
513 UINTN GetSize\r
878ddf1f 514 )\r
515{\r
52e1905d 516 PEI_PCD_DATABASE *PeiPcdDb;\r
878ddf1f 517\r
52e1905d 518 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
878ddf1f 519\r
52e1905d 520 ASSERT (GetSize == PeiPcdGetSize (TokenNumber) || GetSize == 0);\r
878ddf1f 521\r
52e1905d 522 PeiPcdDb = GetPcdDatabase ();\r
523 \r
524 return GetWorkerByLocalTokenNumber (PeiPcdDb, PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber], GetSize);\r
525}\r
878ddf1f 526\r
878ddf1f 527\r
52e1905d 528VOID\r
529GetExPcdTokenAttributes (\r
530 IN CONST EFI_GUID *Guid,\r
531 IN UINT32 ExTokenNumber,\r
532 OUT EX_PCD_ENTRY_ATTRIBUTE *ExAttr\r
533 )\r
534{\r
535 UINT32 i;\r
536 DYNAMICEX_MAPPING *ExMap;\r
537 EFI_GUID *GuidTable;\r
538 PEI_PCD_DATABASE *PeiPcdDb;\r
878ddf1f 539\r
52e1905d 540 PeiPcdDb = GetPcdDatabase();\r
541 \r
542 ExMap = PeiPcdDb->Init.ExMapTable;\r
543 GuidTable = PeiPcdDb->Init.GuidTable;\r
544 \r
545 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
546 if ((ExTokenNumber == ExMap[i].ExTokenNumber) && \r
547 CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex])) {\r
548 ExAttr->TokenNumber = i + PEI_NEX_TOKEN_NUMBER;\r
549 ExAttr->Size = PeiPcdDb->Init.SizeTable[i + PEI_NEX_TOKEN_NUMBER];\r
550 ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber;\r
551 }\r
552 }\r
553 \r
554 ASSERT (FALSE);\r
555 \r
556 return;\r
878ddf1f 557}\r
558\r
559\r
560\r
52e1905d 561PEI_PCD_DATABASE *\r
562GetPcdDatabase (\r
563 VOID\r
878ddf1f 564 )\r
565{\r
52e1905d 566 EFI_HOB_GUID_TYPE *GuidHob;\r
878ddf1f 567\r
52e1905d 568 GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
569 ASSERT (GuidHob != NULL);\r
570 \r
571 return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
572}\r
878ddf1f 573\r