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