1 /** @file
2 Implementation of PcdLib class library for PEI phase.
3 
4 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 
14 **/
15 
16 
17 
18 
19 #include <PiPei.h>
20 
21 #include <Ppi/Pcd.h>
22 #include <Ppi/PiPcd.h>
23 #include <Ppi/PcdInfo.h>
24 #include <Ppi/PiPcdInfo.h>
25 
26 #include <Library/PeiServicesLib.h>
27 #include <Library/PcdLib.h>
28 #include <Library/DebugLib.h>
29 #include <Library/BaseMemoryLib.h>
30 
31 /**
32   Retrieve the PCD_PPI pointer.
33 
34   This function is to locate PCD_PPI PPI via PeiService.
35   If fail to locate PCD_PPI, then ASSERT_EFI_ERROR().
36 
37   @retval PCD_PPI * The pointer to the PCD_PPI.
38 
39 **/
40 PCD_PPI  *
GetPcdPpiPointer(VOID)41 GetPcdPpiPointer (
42   VOID
43   )
44 {
45   EFI_STATUS        Status;
46   PCD_PPI           *PcdPpi;
47 
48   Status = PeiServicesLocatePpi (&gPcdPpiGuid, 0, NULL, (VOID **)&PcdPpi);
49   ASSERT_EFI_ERROR (Status);
50 
51   return PcdPpi;
52 }
53 
54 /**
55   Retrieve the pointer of EFI_PEI_PCD_PPI defined in PI 1.2 Vol 3.
56 
57   This function is to locate EFI_PEI_PCD_PPI PPI via PeiService.
58   If fail to locate EFI_PEI_PCD_PPI, then ASSERT_EFI_ERROR().
59 
60   @retval EFI_PEI_PCD_PPI * The pointer to the EFI_PEI_PCD_PPI.
61 
62 **/
63 EFI_PEI_PCD_PPI *
GetPiPcdPpiPointer(VOID)64 GetPiPcdPpiPointer (
65   VOID
66   )
67 {
68   EFI_STATUS        Status;
69   EFI_PEI_PCD_PPI   *PiPcdPpi;
70 
71   Status = PeiServicesLocatePpi (&gEfiPeiPcdPpiGuid, 0, NULL, (VOID **)&PiPcdPpi);
72   ASSERT_EFI_ERROR (Status);
73 
74   return PiPcdPpi;
75 }
76 
77 /**
78   Retrieve the GET_PCD_INFO_PPI pointer.
79 
80   This function is to locate GET_PCD_INFO_PPI PPI via PeiService.
81   If fail to locate GET_PCD_INFO_PPI, then ASSERT_EFI_ERROR().
82 
83   @retval GET_PCD_INFO_PPI * The pointer to the GET_PCD_INFO_PPI.
84 
85 **/
86 GET_PCD_INFO_PPI *
GetPcdInfoPpiPointer(VOID)87 GetPcdInfoPpiPointer (
88   VOID
89   )
90 {
91   EFI_STATUS            Status;
92   GET_PCD_INFO_PPI      *PcdInfoPpi;
93 
94   Status = PeiServicesLocatePpi (&gGetPcdInfoPpiGuid, 0, NULL, (VOID **)&PcdInfoPpi);
95   ASSERT_EFI_ERROR (Status);
96 
97   return PcdInfoPpi;
98 }
99 
100 /**
101   Retrieve the pointer of EFI_GET_PCD_INFO_PPI defined in PI 1.2.1 Vol 3.
102 
103   This function is to locate EFI_GET_PCD_INFO_PPI PPI via PeiService.
104   If fail to locate EFI_GET_PCD_INFO_PPI, then ASSERT_EFI_ERROR().
105 
106   @retval EFI_GET_PCD_INFO_PPI * The pointer to the EFI_GET_PCD_INFO_PPI.
107 
108 **/
109 EFI_GET_PCD_INFO_PPI *
GetPiPcdInfoPpiPointer(VOID)110 GetPiPcdInfoPpiPointer (
111   VOID
112   )
113 {
114   EFI_STATUS            Status;
115   EFI_GET_PCD_INFO_PPI  *PiPcdInfoPpi;
116 
117   Status = PeiServicesLocatePpi (&gEfiGetPcdInfoPpiGuid, 0, NULL, (VOID **)&PiPcdInfoPpi);
118   ASSERT_EFI_ERROR (Status);
119 
120   return PiPcdInfoPpi;
121 }
122 
123 /**
124   This function provides a means by which SKU support can be established in the PCD infrastructure.
125 
126   Sets the current SKU in the PCD database to the value specified by SkuId.  SkuId is returned.
127 
128   @param  SkuId   The SKU value that will be used when the PCD service retrieves
129                   and sets values associated with a PCD token.
130 
131   @return  Return the SKU ID that just be set.
132 
133 **/
134 UINTN
135 EFIAPI
LibPcdSetSku(IN UINTN SkuId)136 LibPcdSetSku (
137   IN UINTN   SkuId
138   )
139 {
140   GetPiPcdPpiPointer()->SetSku (SkuId);
141 
142   return SkuId;
143 }
144 
145 
146 
147 /**
148   This function provides a means by which to retrieve a value for a given PCD token.
149 
150   Returns the 8-bit value for the token specified by TokenNumber.
151 
152   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
153 
154   @return Returns the 8-bit value for the token specified by TokenNumber.
155 
156 **/
157 UINT8
158 EFIAPI
LibPcdGet8(IN UINTN TokenNumber)159 LibPcdGet8 (
160   IN UINTN             TokenNumber
161   )
162 {
163   return (GetPcdPpiPointer ())->Get8 (TokenNumber);
164 }
165 
166 
167 
168 /**
169   This function provides a means by which to retrieve a value for a given PCD token.
170 
171   Returns the 16-bit value for the token specified by TokenNumber.
172 
173   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
174 
175   @return Returns the 16-bit value for the token specified by TokenNumber.
176 
177 **/
178 UINT16
179 EFIAPI
LibPcdGet16(IN UINTN TokenNumber)180 LibPcdGet16 (
181   IN UINTN             TokenNumber
182   )
183 {
184   return (GetPcdPpiPointer ())->Get16 (TokenNumber);
185 }
186 
187 
188 
189 /**
190   This function provides a means by which to retrieve a value for a given PCD token.
191 
192   Returns the 32-bit value for the token specified by TokenNumber.
193 
194   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
195 
196   @return Returns the 32-bit value for the token specified by TokenNumber.
197 
198 **/
199 UINT32
200 EFIAPI
LibPcdGet32(IN UINTN TokenNumber)201 LibPcdGet32 (
202   IN UINTN             TokenNumber
203   )
204 {
205   return (GetPcdPpiPointer ())->Get32 (TokenNumber);
206 }
207 
208 
209 
210 /**
211   This function provides a means by which to retrieve a value for a given PCD token.
212 
213   Returns the 64-bit value for the token specified by TokenNumber.
214 
215   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
216 
217   @return Returns the 64-bit value for the token specified by TokenNumber.
218 
219 **/
220 UINT64
221 EFIAPI
LibPcdGet64(IN UINTN TokenNumber)222 LibPcdGet64 (
223   IN UINTN             TokenNumber
224   )
225 {
226   return (GetPcdPpiPointer ())->Get64 (TokenNumber);
227 }
228 
229 
230 
231 /**
232   This function provides a means by which to retrieve a value for a given PCD token.
233 
234   Returns the pointer to the buffer of the token specified by TokenNumber.
235 
236   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
237 
238   @return Returns the pointer to the token specified by TokenNumber.
239 
240 **/
241 VOID *
242 EFIAPI
LibPcdGetPtr(IN UINTN TokenNumber)243 LibPcdGetPtr (
244   IN UINTN             TokenNumber
245   )
246 {
247   return (GetPcdPpiPointer ())->GetPtr (TokenNumber);
248 }
249 
250 
251 
252 /**
253   This function provides a means by which to retrieve a value for a given PCD token.
254 
255   Returns the Boolean value of the token specified by TokenNumber.
256 
257   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
258 
259   @return Returns the Boolean value of the token specified by TokenNumber.
260 
261 **/
262 BOOLEAN
263 EFIAPI
LibPcdGetBool(IN UINTN TokenNumber)264 LibPcdGetBool (
265   IN UINTN             TokenNumber
266   )
267 {
268   return (GetPcdPpiPointer ())->GetBool (TokenNumber);
269 }
270 
271 
272 
273 /**
274   This function provides a means by which to retrieve the size of a given PCD token.
275 
276   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
277 
278   @return Returns the size of the token specified by TokenNumber.
279 
280 **/
281 UINTN
282 EFIAPI
LibPcdGetSize(IN UINTN TokenNumber)283 LibPcdGetSize (
284   IN UINTN             TokenNumber
285   )
286 {
287   return (GetPcdPpiPointer ())->GetSize (TokenNumber);
288 }
289 
290 
291 
292 /**
293   This function provides a means by which to retrieve a value for a given PCD token.
294 
295   Returns the 8-bit value for the token specified by TokenNumber and Guid.
296 
297   If Guid is NULL, then ASSERT().
298 
299   @param[in]  Guid         The pointer to a 128-bit unique value that designates
300                            which namespace to retrieve a value from.
301   @param[in]  TokenNumber  The PCD token number to retrieve a current value for.
302 
303   @return Return the UINT8.
304 
305 **/
306 UINT8
307 EFIAPI
LibPcdGetEx8(IN CONST GUID * Guid,IN UINTN TokenNumber)308 LibPcdGetEx8 (
309   IN CONST GUID        *Guid,
310   IN UINTN             TokenNumber
311   )
312 {
313   ASSERT (Guid != NULL);
314 
315   return (GetPiPcdPpiPointer ())->Get8 (Guid, TokenNumber);
316 }
317 
318 
319 
320 /**
321   This function provides a means by which to retrieve a value for a given PCD token.
322 
323   Returns the 16-bit value for the token specified by TokenNumber and Guid.
324 
325   If Guid is NULL, then ASSERT().
326 
327   @param[in]  Guid         The pointer to a 128-bit unique value that designates
328                            which namespace to retrieve a value from.
329   @param[in]  TokenNumber  The PCD token number to retrieve a current value for.
330 
331   @return Return the UINT16.
332 
333 **/
334 UINT16
335 EFIAPI
LibPcdGetEx16(IN CONST GUID * Guid,IN UINTN TokenNumber)336 LibPcdGetEx16 (
337   IN CONST GUID        *Guid,
338   IN UINTN             TokenNumber
339   )
340 {
341 
342   ASSERT (Guid != NULL);
343 
344   return (GetPiPcdPpiPointer ())->Get16 (Guid, TokenNumber);
345 }
346 
347 
348 
349 /**
350   Returns the 32-bit value for the token specified by TokenNumber and Guid.
351   If Guid is NULL, then ASSERT().
352 
353   @param[in]  Guid         The pointer to a 128-bit unique value that designates
354                            which namespace to retrieve a value from.
355   @param[in]  TokenNumber  The PCD token number to retrieve a current value for.
356 
357   @return Return the UINT32.
358 
359 **/
360 UINT32
361 EFIAPI
LibPcdGetEx32(IN CONST GUID * Guid,IN UINTN TokenNumber)362 LibPcdGetEx32 (
363   IN CONST GUID        *Guid,
364   IN UINTN             TokenNumber
365   )
366 {
367   ASSERT (Guid != NULL);
368 
369   return (GetPiPcdPpiPointer ())->Get32 (Guid, TokenNumber);
370 }
371 
372 
373 
374 
375 /**
376   This function provides a means by which to retrieve a value for a given PCD token.
377 
378   Returns the 64-bit value for the token specified by TokenNumber and Guid.
379 
380   If Guid is NULL, then ASSERT().
381 
382   @param[in]  Guid          The pointer to a 128-bit unique value that designates
383                             which namespace to retrieve a value from.
384   @param[in]  TokenNumber   The PCD token number to retrieve a current value for.
385 
386   @return Return the UINT64.
387 
388 **/
389 UINT64
390 EFIAPI
LibPcdGetEx64(IN CONST GUID * Guid,IN UINTN TokenNumber)391 LibPcdGetEx64 (
392   IN CONST GUID        *Guid,
393   IN UINTN             TokenNumber
394   )
395 {
396   ASSERT (Guid != NULL);
397   return (GetPiPcdPpiPointer ())->Get64 (Guid, TokenNumber);
398 }
399 
400 
401 
402 /**
403   This function provides a means by which to retrieve a value for a given PCD token.
404 
405   Returns the pointer to the buffer of token specified by TokenNumber and Guid.
406 
407   If Guid is NULL, then ASSERT().
408 
409   @param[in]  Guid          The pointer to a 128-bit unique value that designates
410                             which namespace to retrieve a value from.
411   @param[in]  TokenNumber   The PCD token number to retrieve a current value for.
412 
413   @return Return the VOID* pointer.
414 
415 **/
416 VOID *
417 EFIAPI
LibPcdGetExPtr(IN CONST GUID * Guid,IN UINTN TokenNumber)418 LibPcdGetExPtr (
419   IN CONST GUID        *Guid,
420   IN UINTN             TokenNumber
421   )
422 {
423   ASSERT (Guid != NULL);
424 
425   return (GetPiPcdPpiPointer ())->GetPtr (Guid, TokenNumber);
426 }
427 
428 
429 
430 /**
431   This function provides a means by which to retrieve a value for a given PCD token.
432 
433   Returns the Boolean value of the token specified by TokenNumber and Guid.
434 
435   If Guid is NULL, then ASSERT().
436 
437   @param[in]  Guid          The pointer to a 128-bit unique value that designates
438                             which namespace to retrieve a value from.
439   @param[in]  TokenNumber   The PCD token number to retrieve a current value for.
440 
441   @return Return the BOOLEAN.
442 
443 **/
444 BOOLEAN
445 EFIAPI
LibPcdGetExBool(IN CONST GUID * Guid,IN UINTN TokenNumber)446 LibPcdGetExBool (
447   IN CONST GUID        *Guid,
448   IN UINTN             TokenNumber
449   )
450 {
451   ASSERT (Guid != NULL);
452   return (GetPiPcdPpiPointer ())->GetBool (Guid, TokenNumber);
453 }
454 
455 
456 
457 /**
458   This function provides a means by which to retrieve the size of a given PCD token.
459 
460   Returns the size of the token specified by TokenNumber and Guid.
461 
462   If Guid is NULL, then ASSERT().
463 
464   @param[in]  Guid          The pointer to a 128-bit unique value that designates
465                             which namespace to retrieve a value from.
466   @param[in]  TokenNumber   The PCD token number to retrieve a current value for.
467 
468   @return Return the size.
469 
470 **/
471 UINTN
472 EFIAPI
LibPcdGetExSize(IN CONST GUID * Guid,IN UINTN TokenNumber)473 LibPcdGetExSize (
474   IN CONST GUID        *Guid,
475   IN UINTN             TokenNumber
476   )
477 {
478   ASSERT (Guid != NULL);
479   return (GetPiPcdPpiPointer ())->GetSize (Guid, TokenNumber);
480 }
481 
482 
483 
484 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
485 /**
486   This function provides a means by which to set a value for a given PCD token.
487 
488   Sets the 8-bit value for the token specified by TokenNumber
489   to the value specified by Value.  Value is returned.
490 
491   @param[in]  TokenNumber   The PCD token number to set a current value for.
492   @param[in]  Value         The 8-bit value to set.
493 
494   @return Return the value that was set.
495 
496 **/
497 UINT8
498 EFIAPI
LibPcdSet8(IN UINTN TokenNumber,IN UINT8 Value)499 LibPcdSet8 (
500   IN UINTN             TokenNumber,
501   IN UINT8             Value
502   )
503 {
504   (GetPcdPpiPointer ())->Set8 (TokenNumber, Value);
505 
506   return Value;
507 }
508 
509 
510 
511 /**
512   This function provides a means by which to set a value for a given PCD token.
513 
514   Sets the 16-bit value for the token specified by TokenNumber
515   to the value specified by Value.  Value is returned.
516 
517   @param[in]  TokenNumber   The PCD token number to set a current value for.
518   @param[in]  Value         The 16-bit value to set.
519 
520   @return Return the value that was set.
521 
522 **/
523 UINT16
524 EFIAPI
LibPcdSet16(IN UINTN TokenNumber,IN UINT16 Value)525 LibPcdSet16 (
526   IN UINTN             TokenNumber,
527   IN UINT16            Value
528   )
529 {
530   (GetPcdPpiPointer ())->Set16 (TokenNumber, Value);
531 
532   return Value;
533 }
534 
535 
536 
537 /**
538   This function provides a means by which to set a value for a given PCD token.
539 
540   Sets the 32-bit value for the token specified by TokenNumber
541   to the value specified by Value.  Value is returned.
542 
543   @param[in]  TokenNumber   The PCD token number to set a current value for.
544   @param[in]  Value         The 32-bit value to set.
545 
546   @return Return the value that was set.
547 
548 **/
549 UINT32
550 EFIAPI
LibPcdSet32(IN UINTN TokenNumber,IN UINT32 Value)551 LibPcdSet32 (
552   IN UINTN             TokenNumber,
553   IN UINT32            Value
554   )
555 {
556   (GetPcdPpiPointer ())->Set32 (TokenNumber, Value);
557 
558   return Value;
559 }
560 
561 
562 
563 /**
564   This function provides a means by which to set a value for a given PCD token.
565 
566   Sets the 64-bit value for the token specified by TokenNumber
567   to the value specified by Value.  Value is returned.
568 
569   @param[in]  TokenNumber   The PCD token number to set a current value for.
570   @param[in]  Value         The 64-bit value to set.
571 
572   @return Return the value that was set.
573 
574 **/
575 UINT64
576 EFIAPI
LibPcdSet64(IN UINTN TokenNumber,IN UINT64 Value)577 LibPcdSet64 (
578   IN UINTN             TokenNumber,
579   IN UINT64            Value
580   )
581 {
582   (GetPcdPpiPointer ())->Set64 (TokenNumber, Value);
583 
584   return Value;
585 }
586 
587 
588 
589 /**
590   This function provides a means by which to set a value for a given PCD token.
591 
592   Sets a buffer for the token specified by TokenNumber to the value
593   specified by Buffer and SizeOfBuffer.  Buffer is returned.
594   If SizeOfBuffer is greater than the maximum size support by TokenNumber,
595   then set SizeOfBuffer to the maximum size supported by TokenNumber and
596   return NULL to indicate that the set operation was not actually performed.
597 
598   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to the
599   maximum size supported by TokenName and NULL must be returned.
600 
601   If SizeOfBuffer is NULL, then ASSERT().
602   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
603 
604   @param[in]      TokenNumber   The PCD token number to set a current value for.
605   @param[in, out] SizeOfBuffer  The size, in bytes, of Buffer.
606   @param[in]      Buffer        A pointer to the buffer to set.
607 
608   @return Return the pointer for the buffer been set.
609 
610 **/
611 VOID *
612 EFIAPI
LibPcdSetPtr(IN UINTN TokenNumber,IN OUT UINTN * SizeOfBuffer,IN CONST VOID * Buffer)613 LibPcdSetPtr (
614   IN        UINTN             TokenNumber,
615   IN OUT    UINTN             *SizeOfBuffer,
616   IN CONST  VOID              *Buffer
617   )
618 {
619   EFI_STATUS Status;
620   UINTN      InputSizeOfBuffer;
621 
622   ASSERT (SizeOfBuffer != NULL);
623 
624   if (*SizeOfBuffer > 0) {
625     ASSERT (Buffer != NULL);
626   }
627 
628   InputSizeOfBuffer = *SizeOfBuffer;
629   Status = (GetPcdPpiPointer ())->SetPtr (TokenNumber, SizeOfBuffer, (VOID *) Buffer);
630   if (EFI_ERROR (Status) && (*SizeOfBuffer < InputSizeOfBuffer)) {
631     return NULL;
632   }
633 
634   return (VOID *) Buffer;
635 }
636 
637 
638 
639 /**
640   This function provides a means by which to set a value for a given PCD token.
641 
642   Sets the Boolean value for the token specified by TokenNumber
643   to the value specified by Value.  Value is returned.
644 
645   @param[in]  TokenNumber   The PCD token number to set a current value for.
646   @param[in]  Value         The boolean value to set.
647 
648   @return Return the value that was set.
649 
650 **/
651 BOOLEAN
652 EFIAPI
LibPcdSetBool(IN UINTN TokenNumber,IN BOOLEAN Value)653 LibPcdSetBool (
654   IN UINTN             TokenNumber,
655   IN BOOLEAN           Value
656   )
657 {
658   (GetPcdPpiPointer ())->SetBool (TokenNumber, Value);
659 
660   return Value;
661 }
662 
663 
664 
665 /**
666   This function provides a means by which to set a value for a given PCD token.
667 
668   Sets the 8-bit value for the token specified by TokenNumber and
669   Guid to the value specified by Value. Value is returned.
670 
671   If Guid is NULL, then ASSERT().
672 
673   @param[in]  Guid          The pointer to a 128-bit unique value that
674                             designates which namespace to set a value from.
675   @param[in]  TokenNumber   The PCD token number to set a current value for.
676   @param[in]  Value         The 8-bit value to set.
677 
678   @return Return the value that was set.
679 
680 **/
681 UINT8
682 EFIAPI
LibPcdSetEx8(IN CONST GUID * Guid,IN UINTN TokenNumber,IN UINT8 Value)683 LibPcdSetEx8 (
684   IN CONST GUID        *Guid,
685   IN UINTN             TokenNumber,
686   IN UINT8             Value
687   )
688 {
689   ASSERT (Guid != NULL);
690 
691   (GetPiPcdPpiPointer ())->Set8 (Guid, TokenNumber, Value);
692 
693   return Value;
694 }
695 
696 
697 
698 /**
699   This function provides a means by which to set a value for a given PCD token.
700 
701   Sets the 16-bit value for the token specified by TokenNumber and
702   Guid to the value specified by Value. Value is returned.
703 
704   If Guid is NULL, then ASSERT().
705 
706   @param[in]  Guid          The pointer to a 128-bit unique value that
707                             designates which namespace to set a value from.
708   @param[in]  TokenNumber   The PCD token number to set a current value for.
709   @param[in]  Value         The 16-bit value to set.
710 
711   @return Return the value that was set.
712 
713 **/
714 UINT16
715 EFIAPI
LibPcdSetEx16(IN CONST GUID * Guid,IN UINTN TokenNumber,IN UINT16 Value)716 LibPcdSetEx16 (
717   IN CONST GUID        *Guid,
718   IN UINTN             TokenNumber,
719   IN UINT16            Value
720   )
721 {
722   ASSERT (Guid != NULL);
723 
724   (GetPiPcdPpiPointer ())->Set16 (Guid, TokenNumber, Value);
725 
726   return Value;
727 }
728 
729 
730 
731 /**
732   This function provides a means by which to set a value for a given PCD token.
733 
734   Sets the 32-bit value for the token specified by TokenNumber and
735   Guid to the value specified by Value. Value is returned.
736 
737   If Guid is NULL, then ASSERT().
738 
739   @param[in]  Guid          The pointer to a 128-bit unique value that
740                             designates which namespace to set a value from.
741   @param[in]  TokenNumber   The PCD token number to set a current value for.
742   @param[in]  Value         The 32-bit value to set.
743 
744   @return Return the value that was set.
745 
746 **/
747 UINT32
748 EFIAPI
LibPcdSetEx32(IN CONST GUID * Guid,IN UINTN TokenNumber,IN UINT32 Value)749 LibPcdSetEx32 (
750   IN CONST GUID        *Guid,
751   IN UINTN             TokenNumber,
752   IN UINT32            Value
753   )
754 {
755   ASSERT (Guid != NULL);
756 
757   (GetPiPcdPpiPointer ())->Set32 (Guid, TokenNumber, Value);
758 
759   return Value;
760 }
761 
762 
763 
764 /**
765   This function provides a means by which to set a value for a given PCD token.
766 
767   Sets the 64-bit value for the token specified by TokenNumber and
768   Guid to the value specified by Value. Value is returned.
769 
770   If Guid is NULL, then ASSERT().
771 
772   @param[in]  Guid          The pointer to a 128-bit unique value that
773                             designates which namespace to set a value from.
774   @param[in]  TokenNumber   The PCD token number to set a current value for.
775   @param[in]  Value         The 64-bit value to set.
776 
777   @return Return the value that was set.
778 
779 **/
780 UINT64
781 EFIAPI
LibPcdSetEx64(IN CONST GUID * Guid,IN UINTN TokenNumber,IN UINT64 Value)782 LibPcdSetEx64 (
783   IN CONST GUID        *Guid,
784   IN UINTN             TokenNumber,
785   IN UINT64            Value
786   )
787 {
788   ASSERT (Guid != NULL);
789 
790   (GetPiPcdPpiPointer ())->Set64 (Guid, TokenNumber, Value);
791 
792   return Value;
793 }
794 
795 
796 
797 /**
798   This function provides a means by which to set a value for a given PCD token.
799 
800   Sets a buffer for the token specified by TokenNumber to the value specified by
801   Buffer and SizeOfBuffer.  Buffer is returned.  If SizeOfBuffer is greater than
802   the maximum size support by TokenNumber, then set SizeOfBuffer to the maximum size
803   supported by TokenNumber and return NULL to indicate that the set operation
804   was not actually performed.
805 
806   If Guid is NULL, then ASSERT().
807   If SizeOfBuffer is NULL, then ASSERT().
808   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
809 
810   @param[in]  Guid              The pointer to a 128-bit unique value that
811                                 designates which namespace to set a value from.
812   @param[in]  TokenNumber       The PCD token number to set a current value for.
813   @param[in, out] SizeOfBuffer  The size, in bytes, of Buffer.
814   @param[in]  Buffer            A pointer to the buffer to set.
815 
816   @return Return the pinter to the buffer been set.
817 
818 **/
819 VOID *
820 EFIAPI
LibPcdSetExPtr(IN CONST GUID * Guid,IN UINTN TokenNumber,IN OUT UINTN * SizeOfBuffer,IN VOID * Buffer)821 LibPcdSetExPtr (
822   IN      CONST GUID        *Guid,
823   IN      UINTN             TokenNumber,
824   IN OUT  UINTN             *SizeOfBuffer,
825   IN      VOID              *Buffer
826   )
827 {
828   EFI_STATUS      Status;
829   UINTN           InputSizeOfBuffer;
830 
831   ASSERT (SizeOfBuffer != NULL);
832   if (*SizeOfBuffer > 0) {
833     ASSERT (Buffer != NULL);
834   }
835   ASSERT (Guid != NULL);
836 
837   InputSizeOfBuffer = *SizeOfBuffer;
838   Status = (GetPiPcdPpiPointer ())->SetPtr (Guid, TokenNumber, SizeOfBuffer, Buffer);
839   if (EFI_ERROR (Status) && (*SizeOfBuffer < InputSizeOfBuffer)) {
840     return NULL;
841   }
842 
843   return Buffer;
844 }
845 
846 
847 
848 /**
849   This function provides a means by which to set a value for a given PCD token.
850 
851   Sets the Boolean value for the token specified by TokenNumber and
852   Guid to the value specified by Value. Value is returned.
853 
854   If Guid is NULL, then ASSERT().
855 
856   @param[in]  Guid          The pointer to a 128-bit unique value that
857                             designates which namespace to set a value from.
858   @param[in]  TokenNumber   The PCD token number to set a current value for.
859   @param[in]  Value         The Boolean value to set.
860 
861   @return Return the value that was set.
862 
863 **/
864 BOOLEAN
865 EFIAPI
LibPcdSetExBool(IN CONST GUID * Guid,IN UINTN TokenNumber,IN BOOLEAN Value)866 LibPcdSetExBool (
867   IN CONST GUID        *Guid,
868   IN UINTN             TokenNumber,
869   IN BOOLEAN           Value
870   )
871 {
872   ASSERT (Guid != NULL);
873 
874   (GetPiPcdPpiPointer ())->SetBool (Guid, TokenNumber, Value);
875 
876   return Value;
877 }
878 #endif
879 
880 /**
881   This function provides a means by which to set a value for a given PCD token.
882 
883   Sets the 8-bit value for the token specified by TokenNumber
884   to the value specified by Value.
885 
886   @param[in] TokenNumber    The PCD token number to set a current value for.
887   @param[in] Value          The 8-bit value to set.
888 
889   @return The status of the set operation.
890 
891 **/
892 RETURN_STATUS
893 EFIAPI
LibPcdSet8S(IN UINTN TokenNumber,IN UINT8 Value)894 LibPcdSet8S (
895   IN UINTN          TokenNumber,
896   IN UINT8          Value
897   )
898 {
899   return (GetPcdPpiPointer ())->Set8 (TokenNumber, Value);
900 }
901 
902 /**
903   This function provides a means by which to set a value for a given PCD token.
904 
905   Sets the 16-bit value for the token specified by TokenNumber
906   to the value specified by Value.
907 
908   @param[in] TokenNumber    The PCD token number to set a current value for.
909   @param[in] Value          The 16-bit value to set.
910 
911   @return The status of the set operation.
912 
913 **/
914 RETURN_STATUS
915 EFIAPI
LibPcdSet16S(IN UINTN TokenNumber,IN UINT16 Value)916 LibPcdSet16S (
917   IN UINTN          TokenNumber,
918   IN UINT16         Value
919   )
920 {
921   return (GetPcdPpiPointer ())->Set16 (TokenNumber, Value);
922 }
923 
924 /**
925   This function provides a means by which to set a value for a given PCD token.
926 
927   Sets the 32-bit value for the token specified by TokenNumber
928   to the value specified by Value.
929 
930   @param[in] TokenNumber    The PCD token number to set a current value for.
931   @param[in] Value          The 32-bit value to set.
932 
933   @return The status of the set operation.
934 
935 **/
936 RETURN_STATUS
937 EFIAPI
LibPcdSet32S(IN UINTN TokenNumber,IN UINT32 Value)938 LibPcdSet32S (
939   IN UINTN          TokenNumber,
940   IN UINT32         Value
941   )
942 {
943   return (GetPcdPpiPointer ())->Set32 (TokenNumber, Value);
944 }
945 
946 /**
947   This function provides a means by which to set a value for a given PCD token.
948 
949   Sets the 64-bit value for the token specified by TokenNumber
950   to the value specified by Value.
951 
952   @param[in] TokenNumber    The PCD token number to set a current value for.
953   @param[in] Value          The 64-bit value to set.
954 
955   @return The status of the set operation.
956 
957 **/
958 RETURN_STATUS
959 EFIAPI
LibPcdSet64S(IN UINTN TokenNumber,IN UINT64 Value)960 LibPcdSet64S (
961   IN UINTN          TokenNumber,
962   IN UINT64         Value
963   )
964 {
965   return (GetPcdPpiPointer ())->Set64 (TokenNumber, Value);
966 }
967 
968 /**
969   This function provides a means by which to set a value for a given PCD token.
970 
971   Sets a buffer for the token specified by TokenNumber to the value specified
972   by Buffer and SizeOfBuffer. If SizeOfBuffer is greater than the maximum size
973   support by TokenNumber, then set SizeOfBuffer to the maximum size supported by
974   TokenNumber and return EFI_INVALID_PARAMETER to indicate that the set operation
975   was not actually performed.
976 
977   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to the
978   maximum size supported by TokenName and EFI_INVALID_PARAMETER must be returned.
979 
980   If SizeOfBuffer is NULL, then ASSERT().
981   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
982 
983   @param[in]      TokenNumber   The PCD token number to set a current value for.
984   @param[in, out] SizeOfBuffer  The size, in bytes, of Buffer.
985   @param[in]      Buffer        A pointer to the buffer to set.
986 
987   @return The status of the set operation.
988 
989 **/
990 RETURN_STATUS
991 EFIAPI
LibPcdSetPtrS(IN UINTN TokenNumber,IN OUT UINTN * SizeOfBuffer,IN CONST VOID * Buffer)992 LibPcdSetPtrS (
993   IN       UINTN    TokenNumber,
994   IN OUT   UINTN    *SizeOfBuffer,
995   IN CONST VOID     *Buffer
996   )
997 {
998   ASSERT (SizeOfBuffer != NULL);
999 
1000   if (*SizeOfBuffer > 0) {
1001     ASSERT (Buffer != NULL);
1002   }
1003 
1004   return (GetPcdPpiPointer ())->SetPtr (TokenNumber, SizeOfBuffer, (VOID *) Buffer);
1005 }
1006 
1007 /**
1008   This function provides a means by which to set a value for a given PCD token.
1009 
1010   Sets the boolean value for the token specified by TokenNumber
1011   to the value specified by Value.
1012 
1013   @param[in] TokenNumber    The PCD token number to set a current value for.
1014   @param[in] Value          The boolean value to set.
1015 
1016   @return The status of the set operation.
1017 
1018 **/
1019 RETURN_STATUS
1020 EFIAPI
LibPcdSetBoolS(IN UINTN TokenNumber,IN BOOLEAN Value)1021 LibPcdSetBoolS (
1022   IN UINTN          TokenNumber,
1023   IN BOOLEAN        Value
1024   )
1025 {
1026   return (GetPcdPpiPointer ())->SetBool (TokenNumber, Value);
1027 }
1028 
1029 /**
1030   This function provides a means by which to set a value for a given PCD token.
1031 
1032   Sets the 8-bit value for the token specified by TokenNumber
1033   to the value specified by Value.
1034 
1035   If Guid is NULL, then ASSERT().
1036 
1037   @param[in] Guid           The pointer to a 128-bit unique value that
1038                             designates which namespace to set a value from.
1039   @param[in] TokenNumber    The PCD token number to set a current value for.
1040   @param[in] Value          The 8-bit value to set.
1041 
1042   @return The status of the set operation.
1043 
1044 **/
1045 RETURN_STATUS
1046 EFIAPI
LibPcdSetEx8S(IN CONST GUID * Guid,IN UINTN TokenNumber,IN UINT8 Value)1047 LibPcdSetEx8S (
1048   IN CONST GUID     *Guid,
1049   IN UINTN          TokenNumber,
1050   IN UINT8          Value
1051   )
1052 {
1053   ASSERT (Guid != NULL);
1054 
1055   return (GetPiPcdPpiPointer ())->Set8 (Guid, TokenNumber, Value);
1056 }
1057 
1058 /**
1059   This function provides a means by which to set a value for a given PCD token.
1060 
1061   Sets the 16-bit value for the token specified by TokenNumber
1062   to the value specified by Value.
1063 
1064   If Guid is NULL, then ASSERT().
1065 
1066   @param[in] Guid           The pointer to a 128-bit unique value that
1067                             designates which namespace to set a value from.
1068   @param[in] TokenNumber    The PCD token number to set a current value for.
1069   @param[in] Value          The 16-bit value to set.
1070 
1071   @return The status of the set operation.
1072 
1073 **/
1074 RETURN_STATUS
1075 EFIAPI
LibPcdSetEx16S(IN CONST GUID * Guid,IN UINTN TokenNumber,IN UINT16 Value)1076 LibPcdSetEx16S (
1077   IN CONST GUID     *Guid,
1078   IN UINTN          TokenNumber,
1079   IN UINT16         Value
1080   )
1081 {
1082   ASSERT (Guid != NULL);
1083 
1084   return (GetPiPcdPpiPointer ())->Set16 (Guid, TokenNumber, Value);
1085 }
1086 
1087 /**
1088   This function provides a means by which to set a value for a given PCD token.
1089 
1090   Sets the 32-bit value for the token specified by TokenNumber
1091   to the value specified by Value.
1092 
1093   If Guid is NULL, then ASSERT().
1094 
1095   @param[in] Guid           The pointer to a 128-bit unique value that
1096                             designates which namespace to set a value from.
1097   @param[in] TokenNumber    The PCD token number to set a current value for.
1098   @param[in] Value          The 32-bit value to set.
1099 
1100   @return The status of the set operation.
1101 
1102 **/
1103 RETURN_STATUS
1104 EFIAPI
LibPcdSetEx32S(IN CONST GUID * Guid,IN UINTN TokenNumber,IN UINT32 Value)1105 LibPcdSetEx32S (
1106   IN CONST GUID     *Guid,
1107   IN UINTN          TokenNumber,
1108   IN UINT32         Value
1109   )
1110 {
1111   ASSERT (Guid != NULL);
1112 
1113   return (GetPiPcdPpiPointer ())->Set32 (Guid, TokenNumber, Value);
1114 }
1115 
1116 /**
1117   This function provides a means by which to set a value for a given PCD token.
1118 
1119   Sets the 64-bit value for the token specified by TokenNumber
1120   to the value specified by Value.
1121 
1122   If Guid is NULL, then ASSERT().
1123 
1124   @param[in] Guid           The pointer to a 128-bit unique value that
1125                             designates which namespace to set a value from.
1126   @param[in] TokenNumber    The PCD token number to set a current value for.
1127   @param[in] Value          The 64-bit value to set.
1128 
1129   @return The status of the set operation.
1130 
1131 **/
1132 RETURN_STATUS
1133 EFIAPI
LibPcdSetEx64S(IN CONST GUID * Guid,IN UINTN TokenNumber,IN UINT64 Value)1134 LibPcdSetEx64S (
1135   IN CONST GUID     *Guid,
1136   IN UINTN          TokenNumber,
1137   IN UINT64         Value
1138   )
1139 {
1140   ASSERT (Guid != NULL);
1141 
1142   return (GetPiPcdPpiPointer ())->Set64 (Guid, TokenNumber, Value);
1143 }
1144 
1145 /**
1146   This function provides a means by which to set a value for a given PCD token.
1147 
1148   Sets a buffer for the token specified by TokenNumber to the value specified by
1149   Buffer and SizeOfBuffer. If SizeOfBuffer is greater than the maximum size
1150   support by TokenNumber, then set SizeOfBuffer to the maximum size supported by
1151   TokenNumber and return EFI_INVALID_PARAMETER to indicate that the set operation
1152   was not actually performed.
1153 
1154   If Guid is NULL, then ASSERT().
1155   If SizeOfBuffer is NULL, then ASSERT().
1156   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1157 
1158   @param[in]      Guid          Pointer to a 128-bit unique value that
1159                                 designates which namespace to set a value from.
1160   @param[in]      TokenNumber   The PCD token number to set a current value for.
1161   @param[in, out] SizeOfBuffer  The size, in bytes, of Buffer.
1162   @param[in]      Buffer        A pointer to the buffer to set.
1163 
1164   @return The status of the set operation.
1165 
1166 **/
1167 RETURN_STATUS
1168 EFIAPI
LibPcdSetExPtrS(IN CONST GUID * Guid,IN UINTN TokenNumber,IN OUT UINTN * SizeOfBuffer,IN VOID * Buffer)1169 LibPcdSetExPtrS (
1170   IN CONST GUID     *Guid,
1171   IN       UINTN    TokenNumber,
1172   IN OUT   UINTN    *SizeOfBuffer,
1173   IN       VOID     *Buffer
1174   )
1175 {
1176   ASSERT (Guid != NULL);
1177 
1178   ASSERT (SizeOfBuffer != NULL);
1179 
1180   if (*SizeOfBuffer > 0) {
1181     ASSERT (Buffer != NULL);
1182   }
1183 
1184   return (GetPiPcdPpiPointer ())->SetPtr (Guid, TokenNumber, SizeOfBuffer, Buffer);
1185 }
1186 
1187 /**
1188   This function provides a means by which to set a value for a given PCD token.
1189 
1190   Sets the boolean value for the token specified by TokenNumber
1191   to the value specified by Value.
1192 
1193   If Guid is NULL, then ASSERT().
1194 
1195   @param[in] Guid           The pointer to a 128-bit unique value that
1196                             designates which namespace to set a value from.
1197   @param[in] TokenNumber    The PCD token number to set a current value for.
1198   @param[in] Value          The boolean value to set.
1199 
1200   @return The status of the set operation.
1201 
1202 **/
1203 RETURN_STATUS
1204 EFIAPI
LibPcdSetExBoolS(IN CONST GUID * Guid,IN UINTN TokenNumber,IN BOOLEAN Value)1205 LibPcdSetExBoolS (
1206   IN CONST GUID     *Guid,
1207   IN UINTN          TokenNumber,
1208   IN BOOLEAN        Value
1209   )
1210 {
1211   ASSERT (Guid != NULL);
1212 
1213   return (GetPiPcdPpiPointer ())->SetBool (Guid, TokenNumber, Value);
1214 }
1215 
1216 /**
1217   Set up a notification function that is called when a specified token is set.
1218 
1219   When the token specified by TokenNumber and Guid is set,
1220   then notification function specified by NotificationFunction is called.
1221   If Guid is NULL, then the default token space is used.
1222   If NotificationFunction is NULL, then ASSERT().
1223 
1224   @param[in]  Guid                  The pointer to a 128-bit unique value that
1225                                     designates which namespace to set a value from.
1226                                     If NULL, then the default token space is used.
1227   @param[in]  TokenNumber           The PCD token number to monitor.
1228   @param[in]  NotificationFunction  The function to call when the token
1229                                     specified by Guid and TokenNumber is set.
1230 
1231 **/
1232 VOID
1233 EFIAPI
LibPcdCallbackOnSet(IN CONST GUID * Guid,OPTIONAL IN UINTN TokenNumber,IN PCD_CALLBACK NotificationFunction)1234 LibPcdCallbackOnSet (
1235   IN CONST GUID               *Guid,       OPTIONAL
1236   IN UINTN                    TokenNumber,
1237   IN PCD_CALLBACK             NotificationFunction
1238   )
1239 {
1240   EFI_STATUS Status;
1241 
1242   ASSERT (NotificationFunction != NULL);
1243 
1244   Status = (GetPiPcdPpiPointer ())->CallbackOnSet (Guid, TokenNumber, (EFI_PEI_PCD_PPI_CALLBACK) NotificationFunction);
1245 
1246   ASSERT_EFI_ERROR (Status);
1247 
1248   return;
1249 }
1250 
1251 
1252 
1253 /**
1254   Disable a notification function that was established with LibPcdCallbackonSet().
1255 
1256   Disable a notification function that was previously established with LibPcdCallbackOnSet().
1257   If NotificationFunction is NULL, then ASSERT().
1258   If LibPcdCallbackOnSet() was not previously called with Guid, TokenNumber,
1259   and NotificationFunction, then ASSERT().
1260 
1261   @param[in]  Guid                 Specify the GUID token space.
1262   @param[in]  TokenNumber          Specify the token number.
1263   @param[in]  NotificationFunction The callback function to be unregistered.
1264 
1265 **/
1266 VOID
1267 EFIAPI
LibPcdCancelCallback(IN CONST GUID * Guid,OPTIONAL IN UINTN TokenNumber,IN PCD_CALLBACK NotificationFunction)1268 LibPcdCancelCallback (
1269   IN CONST GUID               *Guid,       OPTIONAL
1270   IN UINTN                    TokenNumber,
1271   IN PCD_CALLBACK             NotificationFunction
1272   )
1273 {
1274   EFI_STATUS Status;
1275 
1276   ASSERT (NotificationFunction != NULL);
1277 
1278   Status = (GetPiPcdPpiPointer ())->CancelCallback (Guid, TokenNumber, (EFI_PEI_PCD_PPI_CALLBACK) NotificationFunction);
1279 
1280   ASSERT_EFI_ERROR (Status);
1281 
1282   return;
1283 }
1284 
1285 
1286 
1287 /**
1288   Retrieves the next token in a token space.
1289 
1290   Retrieves the next PCD token number from the token space specified by Guid.
1291   If Guid is NULL, then the default token space is used.  If TokenNumber is 0,
1292   then the first token number is returned.  Otherwise, the token number that
1293   follows TokenNumber in the token space is returned.  If TokenNumber is the last
1294   token number in the token space, then 0 is returned.
1295 
1296   If TokenNumber is not 0 and is not in the token space specified by Guid, then ASSERT().
1297 
1298   @param[in]  Guid        The pointer to a 128-bit unique value that designates which namespace
1299                           to set a value from.  If NULL, then the default token space is used.
1300   @param[in]  TokenNumber The previous PCD token number.  If 0, then retrieves the first PCD
1301                           token number.
1302 
1303   @return The next valid token number.
1304 
1305 **/
1306 UINTN
1307 EFIAPI
LibPcdGetNextToken(IN CONST GUID * Guid,OPTIONAL IN UINTN TokenNumber)1308 LibPcdGetNextToken (
1309   IN CONST GUID               *Guid,       OPTIONAL
1310   IN UINTN                    TokenNumber
1311   )
1312 {
1313   EFI_STATUS    Status;
1314 
1315   Status = (GetPiPcdPpiPointer ())->GetNextToken (Guid, &TokenNumber);
1316   ASSERT (!EFI_ERROR (Status) || TokenNumber == 0);
1317 
1318   return TokenNumber;
1319 }
1320 
1321 
1322 /**
1323   Used to retrieve the list of available PCD token space GUIDs.
1324 
1325   Returns the PCD token space GUID that follows TokenSpaceGuid in the list of token spaces
1326   in the platform.
1327   If TokenSpaceGuid is NULL, then a pointer to the first PCD token spaces returned.
1328   If TokenSpaceGuid is the last PCD token space GUID in the list, then NULL is returned.
1329 
1330   @param  TokenSpaceGuid  The pointer to the a PCD token space GUID
1331 
1332   @return The next valid token namespace.
1333 
1334 **/
1335 GUID *
1336 EFIAPI
LibPcdGetNextTokenSpace(IN CONST GUID * TokenSpaceGuid)1337 LibPcdGetNextTokenSpace (
1338   IN CONST GUID  *TokenSpaceGuid
1339   )
1340 {
1341   (GetPiPcdPpiPointer ())->GetNextTokenSpace (&TokenSpaceGuid);
1342 
1343   return (GUID *) TokenSpaceGuid;
1344 }
1345 
1346 
1347 
1348 /**
1349   Sets a value of a patchable PCD entry that is type pointer.
1350 
1351   Sets the PCD entry specified by PatchVariable to the value specified by Buffer
1352   and SizeOfBuffer.  Buffer is returned.  If SizeOfBuffer is greater than
1353   MaximumDatumSize, then set SizeOfBuffer to MaximumDatumSize and return
1354   NULL to indicate that the set operation was not actually performed.
1355   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to
1356   MaximumDatumSize and NULL must be returned.
1357 
1358   If PatchVariable is NULL, then ASSERT().
1359   If SizeOfBuffer is NULL, then ASSERT().
1360   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1361 
1362   @param[out] PatchVariable     A pointer to the global variable in a module that is
1363                                 the target of the set operation.
1364   @param[in] MaximumDatumSize   The maximum size allowed for the PCD entry specified by PatchVariable.
1365   @param[in, out] SizeOfBuffer  A pointer to the size, in bytes, of Buffer.
1366   @param[in] Buffer             A pointer to the buffer to used to set the target variable.
1367 
1368   @return Return the pointer to the buffer been set.
1369 
1370 **/
1371 VOID *
1372 EFIAPI
LibPatchPcdSetPtr(OUT VOID * PatchVariable,IN UINTN MaximumDatumSize,IN OUT UINTN * SizeOfBuffer,IN CONST VOID * Buffer)1373 LibPatchPcdSetPtr (
1374   OUT       VOID        *PatchVariable,
1375   IN        UINTN       MaximumDatumSize,
1376   IN OUT    UINTN       *SizeOfBuffer,
1377   IN CONST  VOID        *Buffer
1378   )
1379 {
1380   ASSERT (PatchVariable != NULL);
1381   ASSERT (SizeOfBuffer  != NULL);
1382 
1383   if (*SizeOfBuffer > 0) {
1384     ASSERT (Buffer != NULL);
1385   }
1386 
1387   if ((*SizeOfBuffer > MaximumDatumSize) ||
1388       (*SizeOfBuffer == MAX_ADDRESS)) {
1389     *SizeOfBuffer = MaximumDatumSize;
1390     return NULL;
1391   }
1392 
1393   CopyMem (PatchVariable, Buffer, *SizeOfBuffer);
1394 
1395   return (VOID *) Buffer;
1396 }
1397 
1398 /**
1399   Sets a value of a patchable PCD entry that is type pointer.
1400 
1401   Sets the PCD entry specified by PatchVariable to the value specified
1402   by Buffer and SizeOfBuffer. If SizeOfBuffer is greater than MaximumDatumSize,
1403   then set SizeOfBuffer to MaximumDatumSize and return RETURN_INVALID_PARAMETER
1404   to indicate that the set operation was not actually performed.
1405   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to
1406   MaximumDatumSize and RETURN_INVALID_PARAMETER must be returned.
1407 
1408   If PatchVariable is NULL, then ASSERT().
1409   If SizeOfBuffer is NULL, then ASSERT().
1410   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1411 
1412   @param[out] PatchVariable     A pointer to the global variable in a module that is
1413                                 the target of the set operation.
1414   @param[in] MaximumDatumSize   The maximum size allowed for the PCD entry specified by PatchVariable.
1415   @param[in, out] SizeOfBuffer  A pointer to the size, in bytes, of Buffer.
1416   @param[in] Buffer             A pointer to the buffer to used to set the target variable.
1417 
1418   @return The status of the set operation.
1419 
1420 **/
1421 RETURN_STATUS
1422 EFIAPI
LibPatchPcdSetPtrS(OUT VOID * PatchVariable,IN UINTN MaximumDatumSize,IN OUT UINTN * SizeOfBuffer,IN CONST VOID * Buffer)1423 LibPatchPcdSetPtrS (
1424   OUT      VOID     *PatchVariable,
1425   IN       UINTN    MaximumDatumSize,
1426   IN OUT   UINTN    *SizeOfBuffer,
1427   IN CONST VOID     *Buffer
1428   )
1429 {
1430   ASSERT (PatchVariable != NULL);
1431   ASSERT (SizeOfBuffer  != NULL);
1432 
1433   if (*SizeOfBuffer > 0) {
1434     ASSERT (Buffer != NULL);
1435   }
1436 
1437   if ((*SizeOfBuffer > MaximumDatumSize) ||
1438       (*SizeOfBuffer == MAX_ADDRESS)) {
1439     *SizeOfBuffer = MaximumDatumSize;
1440     return RETURN_INVALID_PARAMETER;
1441   }
1442 
1443   CopyMem (PatchVariable, Buffer, *SizeOfBuffer);
1444 
1445   return RETURN_SUCCESS;
1446 }
1447 
1448 
1449 /**
1450   Sets a value and size of a patchable PCD entry that is type pointer.
1451 
1452   Sets the PCD entry specified by PatchVariable to the value specified by Buffer
1453   and SizeOfBuffer.  Buffer is returned.  If SizeOfBuffer is greater than
1454   MaximumDatumSize, then set SizeOfBuffer to MaximumDatumSize and return
1455   NULL to indicate that the set operation was not actually performed.
1456   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to
1457   MaximumDatumSize and NULL must be returned.
1458 
1459   If PatchVariable is NULL, then ASSERT().
1460   If SizeOfPatchVariable is NULL, then ASSERT().
1461   If SizeOfBuffer is NULL, then ASSERT().
1462   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1463 
1464   @param[out] PatchVariable     A pointer to the global variable in a module that is
1465                                 the target of the set operation.
1466   @param[out] SizeOfPatchVariable A pointer to the size, in bytes, of PatchVariable.
1467   @param[in] MaximumDatumSize   The maximum size allowed for the PCD entry specified by PatchVariable.
1468   @param[in, out] SizeOfBuffer  A pointer to the size, in bytes, of Buffer.
1469   @param[in] Buffer             A pointer to the buffer to used to set the target variable.
1470 
1471   @return Return the pointer to the buffer been set.
1472 
1473 **/
1474 VOID *
1475 EFIAPI
LibPatchPcdSetPtrAndSize(OUT VOID * PatchVariable,OUT UINTN * SizeOfPatchVariable,IN UINTN MaximumDatumSize,IN OUT UINTN * SizeOfBuffer,IN CONST VOID * Buffer)1476 LibPatchPcdSetPtrAndSize (
1477   OUT       VOID        *PatchVariable,
1478   OUT       UINTN       *SizeOfPatchVariable,
1479   IN        UINTN       MaximumDatumSize,
1480   IN OUT    UINTN       *SizeOfBuffer,
1481   IN CONST  VOID        *Buffer
1482   )
1483 {
1484   ASSERT (PatchVariable != NULL);
1485   ASSERT (SizeOfPatchVariable != NULL);
1486   ASSERT (SizeOfBuffer  != NULL);
1487 
1488   if (*SizeOfBuffer > 0) {
1489     ASSERT (Buffer != NULL);
1490   }
1491 
1492   if ((*SizeOfBuffer > MaximumDatumSize) ||
1493       (*SizeOfBuffer == MAX_ADDRESS)) {
1494     *SizeOfBuffer = MaximumDatumSize;
1495     return NULL;
1496   }
1497 
1498   CopyMem (PatchVariable, Buffer, *SizeOfBuffer);
1499   *SizeOfPatchVariable = *SizeOfBuffer;
1500 
1501   return (VOID *) Buffer;
1502 }
1503 
1504 /**
1505   Sets a value and size of a patchable PCD entry that is type pointer.
1506 
1507   Sets the PCD entry specified by PatchVariable to the value specified
1508   by Buffer and SizeOfBuffer. If SizeOfBuffer is greater than MaximumDatumSize,
1509   then set SizeOfBuffer to MaximumDatumSize and return RETURN_INVALID_PARAMETER
1510   to indicate that the set operation was not actually performed.
1511   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to
1512   MaximumDatumSize and RETURN_INVALID_PARAMETER must be returned.
1513 
1514   If PatchVariable is NULL, then ASSERT().
1515   If SizeOfPatchVariable is NULL, then ASSERT().
1516   If SizeOfBuffer is NULL, then ASSERT().
1517   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1518 
1519   @param[out] PatchVariable     A pointer to the global variable in a module that is
1520                                 the target of the set operation.
1521   @param[out] SizeOfPatchVariable A pointer to the size, in bytes, of PatchVariable.
1522   @param[in] MaximumDatumSize   The maximum size allowed for the PCD entry specified by PatchVariable.
1523   @param[in, out] SizeOfBuffer  A pointer to the size, in bytes, of Buffer.
1524   @param[in] Buffer             A pointer to the buffer to used to set the target variable.
1525 
1526   @return The status of the set operation.
1527 
1528 **/
1529 RETURN_STATUS
1530 EFIAPI
LibPatchPcdSetPtrAndSizeS(OUT VOID * PatchVariable,OUT UINTN * SizeOfPatchVariable,IN UINTN MaximumDatumSize,IN OUT UINTN * SizeOfBuffer,IN CONST VOID * Buffer)1531 LibPatchPcdSetPtrAndSizeS (
1532   OUT      VOID     *PatchVariable,
1533   OUT      UINTN    *SizeOfPatchVariable,
1534   IN       UINTN    MaximumDatumSize,
1535   IN OUT   UINTN    *SizeOfBuffer,
1536   IN CONST VOID     *Buffer
1537   )
1538 {
1539   ASSERT (PatchVariable != NULL);
1540   ASSERT (SizeOfPatchVariable != NULL);
1541   ASSERT (SizeOfBuffer  != NULL);
1542 
1543   if (*SizeOfBuffer > 0) {
1544     ASSERT (Buffer != NULL);
1545   }
1546 
1547   if ((*SizeOfBuffer > MaximumDatumSize) ||
1548       (*SizeOfBuffer == MAX_ADDRESS)) {
1549     *SizeOfBuffer = MaximumDatumSize;
1550     return RETURN_INVALID_PARAMETER;
1551   }
1552 
1553   CopyMem (PatchVariable, Buffer, *SizeOfBuffer);
1554   *SizeOfPatchVariable = *SizeOfBuffer;
1555 
1556   return RETURN_SUCCESS;
1557 }
1558 
1559 /**
1560   Retrieve additional information associated with a PCD token.
1561 
1562   This includes information such as the type of value the TokenNumber is associated with as well as possible
1563   human readable name that is associated with the token.
1564 
1565   If TokenNumber is not in the default token space specified, then ASSERT().
1566 
1567   @param[in]    TokenNumber The PCD token number.
1568   @param[out]   PcdInfo     The returned information associated with the requested TokenNumber.
1569                             The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName.
1570 **/
1571 VOID
1572 EFIAPI
LibPcdGetInfo(IN UINTN TokenNumber,OUT PCD_INFO * PcdInfo)1573 LibPcdGetInfo (
1574   IN        UINTN           TokenNumber,
1575   OUT       PCD_INFO        *PcdInfo
1576   )
1577 {
1578   EFI_STATUS Status;
1579 
1580   Status = GetPcdInfoPpiPointer()->GetInfo (TokenNumber, (EFI_PCD_INFO *) PcdInfo);
1581   ASSERT_EFI_ERROR (Status);
1582 }
1583 
1584 /**
1585   Retrieve additional information associated with a PCD token.
1586 
1587   This includes information such as the type of value the TokenNumber is associated with as well as possible
1588   human readable name that is associated with the token.
1589 
1590   If TokenNumber is not in the token space specified by Guid, then ASSERT().
1591 
1592   @param[in]    Guid        The 128-bit unique value that designates the namespace from which to extract the value.
1593   @param[in]    TokenNumber The PCD token number.
1594   @param[out]   PcdInfo     The returned information associated with the requested TokenNumber.
1595                             The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName.
1596 **/
1597 VOID
1598 EFIAPI
LibPcdGetInfoEx(IN CONST GUID * Guid,IN UINTN TokenNumber,OUT PCD_INFO * PcdInfo)1599 LibPcdGetInfoEx (
1600   IN CONST  GUID            *Guid,
1601   IN        UINTN           TokenNumber,
1602   OUT       PCD_INFO        *PcdInfo
1603   )
1604 {
1605   EFI_STATUS Status;
1606 
1607   Status = GetPiPcdInfoPpiPointer()->GetInfo (Guid, TokenNumber, (EFI_PCD_INFO *) PcdInfo);
1608   ASSERT_EFI_ERROR (Status);
1609 }
1610 
1611 /**
1612   Retrieve the currently set SKU Id.
1613 
1614   @return   The currently set SKU Id. If the platform has not set at a SKU Id, then the
1615             default SKU Id value of 0 is returned. If the platform has set a SKU Id, then the currently set SKU
1616             Id is returned.
1617 **/
1618 UINTN
1619 EFIAPI
LibPcdGetSku(VOID)1620 LibPcdGetSku (
1621   VOID
1622   )
1623 {
1624   return GetPiPcdInfoPpiPointer()->GetSku ();
1625 }
1626