]> git.proxmox.com Git - mirror_edk2.git/blame - EdkNt32Pkg/Dxe/PcdEmulator/PcdEmulator.c
Initial import.
[mirror_edk2.git] / EdkNt32Pkg / Dxe / PcdEmulator / PcdEmulator.c
CommitLineData
878ddf1f 1/*++\r
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
12Module Name:\r
13 PcdEmulator.c\r
14\r
15Abstract:\r
16 Platform Configuration Database (PCD) Protocol\r
17\r
18--*/\r
19\r
20#include <PcdEmulator.h>\r
21\r
22UINTN mSkuId = 0;\r
23\r
24STATIC UINTN \r
25GetPcdDataEntryCount (\r
26 VOID\r
27) {\r
28 return gEmulatedPcdDatabaseEx->Count;\r
29}\r
30\r
31EFI_STATUS\r
32EFIAPI\r
33PcdEmulatorSetSku (\r
34 IN UINTN SkuId\r
35 )\r
36{\r
37 mSkuId = SkuId;\r
38 return EFI_SUCCESS;\r
39}\r
40\r
41UINT8\r
42EFIAPI\r
43PcdEmulatorGet8 (\r
44 IN UINTN TokenNumber\r
45 )\r
46{\r
47 EMULATED_PCD_ENTRY_EX *Pcd;\r
48\r
49 Pcd = GetPcdEntry (TokenNumber);\r
50 ASSERT (Pcd != NULL);\r
51 ASSERT (Pcd->DatumSize == 1);\r
52\r
53 return (UINT8)Pcd->Datum;\r
54}\r
55\r
56UINT16\r
57EFIAPI\r
58PcdEmulatorGet16 (\r
59 IN UINTN TokenNumber\r
60 )\r
61{\r
62 EMULATED_PCD_ENTRY_EX *Pcd;\r
63\r
64 Pcd = GetPcdEntry (TokenNumber);\r
65 ASSERT (Pcd != NULL);\r
66 ASSERT (Pcd->DatumSize == 2);\r
67\r
68 return (UINT16)Pcd->Datum;\r
69}\r
70\r
71UINT32\r
72EFIAPI\r
73PcdEmulatorGet32 (\r
74 IN UINTN TokenNumber\r
75 )\r
76{\r
77 EMULATED_PCD_ENTRY_EX *Pcd;\r
78\r
79 Pcd = GetPcdEntry (TokenNumber);\r
80 ASSERT (Pcd != NULL);\r
81 ASSERT (Pcd->DatumSize == 4);\r
82\r
83 return (UINT32)Pcd->Datum;\r
84}\r
85\r
86UINT64\r
87EFIAPI\r
88PcdEmulatorGet64 (\r
89 IN UINTN TokenNumber\r
90 )\r
91{\r
92 EMULATED_PCD_ENTRY_EX *Pcd;\r
93\r
94 Pcd = GetPcdEntry (TokenNumber);\r
95 ASSERT (Pcd != NULL);\r
96 ASSERT (Pcd->DatumSize == sizeof (UINT64));\r
97\r
98 return (UINT64)Pcd->Datum;\r
99}\r
100\r
101VOID *\r
102EFIAPI\r
103PcdEmulatorGetPtr (\r
104 IN UINTN TokenNumber\r
105 )\r
106{\r
107 EMULATED_PCD_ENTRY_EX *Pcd;\r
108\r
109 Pcd = GetPcdEntry (TokenNumber);\r
110 ASSERT (Pcd != NULL);\r
111\r
112 return (VOID *)(UINTN)Pcd->ExtendedData;\r
113}\r
114\r
115BOOLEAN\r
116EFIAPI\r
117PcdEmulatorGetBoolean (\r
118 IN UINTN TokenNumber\r
119 )\r
120{\r
121 EMULATED_PCD_ENTRY_EX *Pcd;\r
122\r
123 Pcd = GetPcdEntry (TokenNumber);\r
124 ASSERT (Pcd != NULL);\r
125 ASSERT (Pcd->DatumSize == 1);\r
126\r
127 return (BOOLEAN)Pcd->Datum;\r
128}\r
129\r
130UINTN\r
131EFIAPI\r
132PcdEmulatorGetSize (\r
133 IN UINTN TokenNumber\r
134 )\r
135{\r
136 EMULATED_PCD_ENTRY_EX *Pcd;\r
137\r
138 Pcd = GetPcdEntry (TokenNumber);\r
139 ASSERT (Pcd != NULL);\r
140 return Pcd->DatumSize;\r
141}\r
142\r
143UINT8\r
144EFIAPI\r
145PcdEmulatorGet8Ex (\r
146 IN CONST EFI_GUID *PcdDataBaseName,\r
147 IN UINTN TokenNumber\r
148 )\r
149{\r
150 ASSERT (FALSE);\r
151 return 0;\r
152}\r
153\r
154UINT16\r
155EFIAPI\r
156PcdEmulatorGet16Ex (\r
157 IN CONST EFI_GUID *PcdDataBaseName,\r
158 IN UINTN TokenNumber\r
159 )\r
160{\r
161 ASSERT (FALSE);\r
162 return 0;\r
163}\r
164\r
165UINT32\r
166EFIAPI\r
167PcdEmulatorGet32Ex (\r
168 IN CONST EFI_GUID *PcdDataBaseName,\r
169 IN UINTN TokenNumber\r
170 )\r
171{\r
172 ASSERT (FALSE);\r
173 return 0;\r
174}\r
175\r
176UINT64\r
177EFIAPI\r
178PcdEmulatorGet64Ex (\r
179 IN CONST EFI_GUID *PcdDataBaseName,\r
180 IN UINTN TokenNumber\r
181 )\r
182{\r
183 ASSERT (FALSE);\r
184 return 0;\r
185}\r
186\r
187VOID *\r
188EFIAPI\r
189PcdEmulatorGetPtrEx (\r
190 IN CONST EFI_GUID *PcdDataBaseName,\r
191 IN UINTN TokenNumber\r
192 )\r
193{\r
194 ASSERT (FALSE);\r
195 return 0;\r
196}\r
197\r
198BOOLEAN\r
199EFIAPI\r
200PcdEmulatorGetBooleanEx (\r
201 IN CONST EFI_GUID *PcdDataBaseName,\r
202 IN UINTN TokenNumber\r
203 )\r
204{\r
205 ASSERT (FALSE);\r
206 return 0;\r
207}\r
208\r
209UINTN\r
210EFIAPI\r
211PcdEmulatorGetSizeEx (\r
212 IN CONST EFI_GUID *PcdDataBaseName,\r
213 IN UINTN TokenNumber\r
214 )\r
215{\r
216 EMULATED_PCD_ENTRY_EX *Pcd;\r
217\r
218 Pcd = GetPcdEntry (TokenNumber);\r
219 ASSERT (Pcd != NULL);\r
220 return Pcd->DatumSize;\r
221}\r
222\r
223\r
224EFI_STATUS\r
225EFIAPI\r
226PcdEmulatorSet8 (\r
227 IN UINTN TokenNumber,\r
228 IN UINT8 Value\r
229 )\r
230{ \r
231\r
232 EMULATED_PCD_ENTRY_EX *Pcd;\r
233\r
234 Pcd = GetPcdEntry (TokenNumber);\r
235 ASSERT (Pcd != NULL);\r
236\r
237 ASSERT (Pcd->DatumSize == sizeof (UINT8));\r
238\r
239 Pcd->Datum = Value;\r
240\r
241 return EFI_SUCCESS;\r
242}\r
243\r
244EFI_STATUS\r
245EFIAPI\r
246PcdEmulatorSet16 (\r
247 IN UINTN TokenNumber,\r
248 IN UINT16 Value\r
249 )\r
250{ \r
251\r
252 ASSERT (FALSE);\r
253\r
254 return EFI_SUCCESS;\r
255}\r
256\r
257EFI_STATUS\r
258EFIAPI\r
259PcdEmulatorSet32 (\r
260 IN UINTN TokenNumber,\r
261 IN UINT32 Value\r
262 )\r
263{ \r
264\r
265 EMULATED_PCD_ENTRY_EX *Pcd;\r
266\r
267 Pcd = GetPcdEntry (TokenNumber);\r
268 ASSERT (Pcd != NULL);\r
269\r
270 ASSERT (Pcd->DatumSize == sizeof (UINT32));\r
271\r
272 Pcd->Datum = Value;\r
273\r
274 return EFI_SUCCESS;\r
275}\r
276\r
277EFI_STATUS\r
278EFIAPI\r
279PcdEmulatorSet64 (\r
280 IN UINTN TokenNumber,\r
281 IN UINT64 Value\r
282 )\r
283{ \r
284\r
285 ASSERT (FALSE);\r
286\r
287 return EFI_SUCCESS;\r
288}\r
289\r
290EFI_STATUS\r
291EFIAPI\r
292PcdEmulatorSetPtr (\r
293 IN UINTN TokenNumber,\r
294 IN CONST VOID *Value\r
295 )\r
296{ \r
297\r
298 ASSERT (FALSE);\r
299\r
300 return EFI_SUCCESS;\r
301}\r
302\r
303EFI_STATUS\r
304EFIAPI\r
305PcdEmulatorSetBoolean (\r
306 IN UINTN TokenNumber,\r
307 IN BOOLEAN Value\r
308 )\r
309{ \r
310\r
311 ASSERT (FALSE);\r
312\r
313 return EFI_SUCCESS;\r
314}\r
315\r
316EFI_STATUS\r
317EFIAPI\r
318PcdEmulatorSet8Ex (\r
319 IN CONST EFI_GUID *Guid,\r
320 IN UINTN TokenNumber,\r
321 IN UINT8 Value\r
322 )\r
323{ \r
324\r
325 ASSERT (FALSE);\r
326\r
327 return EFI_SUCCESS;\r
328}\r
329\r
330EFI_STATUS\r
331EFIAPI\r
332PcdEmulatorSet16Ex (\r
333 IN CONST EFI_GUID *Guid,\r
334 IN UINTN TokenNumber,\r
335 IN UINT16 Value\r
336 )\r
337{ \r
338\r
339 ASSERT (FALSE);\r
340\r
341 return EFI_SUCCESS;\r
342}\r
343\r
344EFI_STATUS\r
345EFIAPI\r
346PcdEmulatorSet32Ex (\r
347 IN CONST EFI_GUID *Guid,\r
348 IN UINTN TokenNumber,\r
349 IN UINT32 Value\r
350 )\r
351{ \r
352\r
353 ASSERT (FALSE);\r
354\r
355 return EFI_SUCCESS;\r
356}\r
357\r
358EFI_STATUS\r
359EFIAPI\r
360PcdEmulatorSet64Ex (\r
361 IN CONST EFI_GUID *Guid,\r
362 IN UINTN TokenNumber,\r
363 IN UINT64 Value\r
364 )\r
365{ \r
366\r
367 ASSERT (FALSE);\r
368\r
369 return EFI_SUCCESS;\r
370}\r
371\r
372EFI_STATUS\r
373EFIAPI\r
374PcdEmulatorSetPtrEx (\r
375 IN CONST EFI_GUID *Guid,\r
376 IN UINTN TokenNumber,\r
377 IN CONST VOID *Value\r
378 )\r
379{ \r
380\r
381 ASSERT (FALSE);\r
382\r
383 return EFI_SUCCESS;\r
384}\r
385\r
386EFI_STATUS\r
387EFIAPI\r
388PcdEmulatorSetBooleanEx (\r
389 IN CONST EFI_GUID *Guid,\r
390 IN UINTN TokenNumber,\r
391 IN BOOLEAN Value\r
392 )\r
393{ \r
394\r
395 ASSERT (FALSE);\r
396\r
397 return EFI_SUCCESS;\r
398}\r
399\r
400EFI_STATUS\r
401EFIAPI\r
402PcdEmulatorCallBackOnSet (\r
403 IN UINTN TokenNumber,\r
404 IN CONST EFI_GUID *Guid, OPTIONAL\r
405 IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
406 )\r
407{\r
408 EMULATED_PCD_ENTRY_EX *Pcd;\r
409\r
410 Pcd = GetPcdEntry (TokenNumber);\r
411 ASSERT (Pcd != NULL);\r
412\r
413 if (Pcd->CallBackListSize == Pcd->CallBackEntries) {\r
414 return EFI_OUT_OF_RESOURCES;\r
415 }\r
416\r
417 Pcd->CallBackList[Pcd->CallBackEntries++] = CallBackFunction;\r
418\r
419 return EFI_SUCCESS;\r
420}\r
421\r
422EFI_STATUS\r
423EFIAPI\r
424PcdEmulatorUnregisterCallBackOnSet (\r
425 IN UINTN TokenNumber,\r
426 IN CONST EFI_GUID *Guid, OPTIONAL\r
427 IN PCD_PROTOCOL_CALLBACK CallBackfunction\r
428 )\r
429{\r
430 EMULATED_PCD_ENTRY_EX *Pcd;\r
431 UINT32 Index;\r
432\r
433 Pcd = GetPcdEntry (TokenNumber);\r
434 ASSERT (Pcd != NULL);\r
435\r
436 for (Index = 0; Index < Pcd->CallBackListSize; Index++) {\r
437 if (Pcd->CallBackList[Index] == CallBackfunction) {\r
438 Pcd->CallBackList[Index] = NULL;\r
439 return EFI_SUCCESS;\r
440 }\r
441 }\r
442\r
443 return EFI_NOT_FOUND;\r
444}\r
445\r
446EFI_STATUS\r
447EFIAPI\r
448PcdEmulatorGetNextToken (\r
449 IN CONST EFI_GUID *Guid, OPTIONAL\r
450 IN UINTN *Token\r
451 )\r
452{\r
453 EMULATED_PCD_ENTRY_EX *Pcd;\r
454 EMULATED_PCD_ENTRY_EX *LastPcdEntry;\r
455\r
456 if (*Token == PCD_INVALID_TOKEN) {\r
457 //\r
458 // BugBug: Due to variable size array, ensure we convert this to a reasonable database\r
459 // that can accomodate array references for simplicity's sake\r
460 *Token = gEmulatedPcdEntryEx[0].Token;\r
461 return EFI_SUCCESS;\r
462 }\r
463\r
464 Pcd = GetPcdEntry (*Token);\r
465 if (Pcd == NULL) {\r
466 return EFI_NOT_FOUND;\r
467 }\r
468\r
469 LastPcdEntry = gEmulatedPcdEntryEx + GetPcdDataEntryCount ();\r
470 if (++Pcd >= LastPcdEntry) {\r
471 return EFI_NOT_FOUND;\r
472 }\r
473 \r
474 *Token = Pcd->Token;\r
475 return EFI_SUCCESS;\r
476}\r
477\r
478PCD_PROTOCOL mPcdProtocolInstance = {\r
479 PcdEmulatorSetSku,\r
480\r
481 PcdEmulatorGet8,\r
482 PcdEmulatorGet16, \r
483 PcdEmulatorGet32, \r
484 PcdEmulatorGet64, \r
485 PcdEmulatorGetPtr, \r
486 PcdEmulatorGetBoolean, \r
487 PcdEmulatorGetSize,\r
488\r
489 PcdEmulatorGet8Ex,\r
490 PcdEmulatorGet16Ex, \r
491 PcdEmulatorGet32Ex, \r
492 PcdEmulatorGet64Ex, \r
493 PcdEmulatorGetPtrEx, \r
494 PcdEmulatorGetBooleanEx, \r
495 PcdEmulatorGetSizeEx,\r
496 \r
497 PcdEmulatorSet8,\r
498 PcdEmulatorSet16, \r
499 PcdEmulatorSet32, \r
500 PcdEmulatorSet64, \r
501 PcdEmulatorSetPtr, \r
502 PcdEmulatorSetBoolean, \r
503\r
504 PcdEmulatorSet8Ex,\r
505 PcdEmulatorSet16Ex, \r
506 PcdEmulatorSet32Ex, \r
507 PcdEmulatorSet64Ex, \r
508 PcdEmulatorSetPtrEx, \r
509 PcdEmulatorSetBooleanEx, \r
510\r
511 PcdEmulatorCallBackOnSet,\r
512 PcdEmulatorUnregisterCallBackOnSet,\r
513 PcdEmulatorGetNextToken\r
514};\r
515\r
516\r
517EFI_STATUS\r
518EFIAPI\r
519PcdEmulatorEntry (\r
520 IN EFI_HANDLE ImageHandle,\r
521 IN EFI_SYSTEM_TABLE *SystemTable\r
522 )\r
523{\r
524 EFI_STATUS Status;\r
525 EFI_HOB_GUID_TYPE *GuidHob;\r
526\r
527 GuidHob = GetFirstGuidHob (&gPcdHobGuid);\r
528 gEmulatedPcdDatabaseEx = (EMULATED_PCD_DATABASE_EX *) GET_GUID_HOB_DATA(GuidHob);\r
529 ASSERT (gEmulatedPcdDatabaseEx != NULL);\r
530 gEmulatedPcdEntryEx = gEmulatedPcdDatabaseEx->Entry;\r
531\r
532 Status = gBS->InstallMultipleProtocolInterfaces (\r
533 &ImageHandle,\r
534 &gPcdProtocolGuid, &mPcdProtocolInstance,\r
535 NULL\r
536 );\r
537 ASSERT_EFI_ERROR (Status);\r
538 return Status;\r
539}\r
540\r
541\r
542EMULATED_PCD_ENTRY_EX *\r
543GetPcdEntry (\r
544 IN UINTN TokenNumber\r
545 )\r
546{\r
547 UINTN Index;\r
548 UINTN Count;\r
549\r
550 Count = GetPcdDataEntryCount ();\r
551 for (Index = 0; Index < Count; Index++) {\r
552 if (gEmulatedPcdEntryEx[Index].Token == TokenNumber) {\r
553 return &gEmulatedPcdEntryEx[Index];\r
554 }\r
555 }\r
556 return NULL;\r
557}\r