2 This file contains the PcdValue structure definition.
4 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 #include "CommonLib.h"
20 #include "PcdValueCommon.h"
33 CHAR8
*DefaultValueName
;
34 CHAR8
*TokenSpaceGuidName
;
38 PCD_DATA_TYPE PcdDataType
;
57 Record new token information
61 FileBuffer File Buffer to be record
62 PcdIndex Index of PCD in database
63 TokenIndex Index of Token
64 TokenStart Start of Token
74 Token
= malloc (TokenEnd
- TokenStart
+ 1);
75 memcpy (Token
, &FileBuffer
[TokenStart
], TokenEnd
- TokenStart
);
76 Token
[TokenEnd
- TokenStart
] = 0;
79 PcdList
[PcdIndex
].SkuName
= Token
;
82 PcdList
[PcdIndex
].DefaultValueName
= Token
;
85 PcdList
[PcdIndex
].TokenSpaceGuidName
= Token
;
88 PcdList
[PcdIndex
].TokenName
= Token
;
91 PcdList
[PcdIndex
].DataType
= Token
;
92 if (strcmp (Token
, "BOOLEAN") == 0) {
93 PcdList
[PcdIndex
].PcdDataType
= PcdDataTypeBoolean
;
94 } else if (strcmp (Token
, "UINT8") == 0) {
95 PcdList
[PcdIndex
].PcdDataType
= PcdDataTypeUint8
;
96 } else if (strcmp (Token
, "UINT16") == 0) {
97 PcdList
[PcdIndex
].PcdDataType
= PcdDataTypeUint16
;
98 } else if (strcmp (Token
, "UINT32") == 0) {
99 PcdList
[PcdIndex
].PcdDataType
= PcdDataTypeUint32
;
100 } else if (strcmp (Token
, "UINT64") == 0) {
101 PcdList
[PcdIndex
].PcdDataType
= PcdDataTypeUint64
;
103 PcdList
[PcdIndex
].PcdDataType
= PcdDataTypePointer
;
107 PcdList
[PcdIndex
].Value
= Token
;
115 CHAR8
*SkuName OPTIONAL
,
116 CHAR8
*DefaultValueName OPTIONAL
,
117 CHAR8
*TokenSpaceGuidName
,
124 Get PCD index in Pcd database
128 SkuName SkuName String
129 DefaultValueName DefaultValueName String
130 TokenSpaceGuidName TokenSpaceGuidName String
131 TokenName TokenName String
135 Index of PCD in Pcd database
140 if (SkuName
== NULL
) {
143 if (DefaultValueName
== NULL
) {
144 DefaultValueName
= "DEFAULT";
146 for (Index
= 0; Index
< PcdListLength
; Index
++) {
147 if (strcmp(PcdList
[Index
].TokenSpaceGuidName
, TokenSpaceGuidName
) != 0) {
150 if (strcmp(PcdList
[Index
].TokenName
, TokenName
) != 0) {
153 if (strcmp(PcdList
[Index
].SkuName
, SkuName
) != 0) {
156 if (strcmp(PcdList
[Index
].DefaultValueName
, DefaultValueName
) != 0) {
166 CHAR8
*SkuName OPTIONAL
,
167 CHAR8
*DefaultValueName OPTIONAL
,
168 CHAR8
*TokenSpaceGuidName
,
179 SkuName SkuName String
180 DefaultValueName DefaultValueName String
181 TokenSpaceGuidName TokenSpaceGuidName String
182 TokenName TokenName String
192 Index
= LookupPcdIndex (SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
194 fprintf (stderr
, "PCD %s.%s.%s.%s is not in database\n", SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
197 switch (PcdList
[Index
].PcdDataType
) {
198 case PcdDataTypeBoolean
:
199 case PcdDataTypeUint8
:
200 case PcdDataTypeUint16
:
201 case PcdDataTypeUint32
:
202 return (UINT64
)strtoul(PcdList
[Index
].Value
, &End
, 16);
204 case PcdDataTypeUint64
:
205 return (UINT64
)strtoul(PcdList
[Index
].Value
, &End
, 16);
207 case PcdDataTypePointer
:
208 fprintf (stderr
, "PCD %s.%s.%s.%s is structure. Use PcdGetPtr()\n", SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
217 CHAR8
*SkuName OPTIONAL
,
218 CHAR8
*DefaultValueName OPTIONAL
,
219 CHAR8
*TokenSpaceGuidName
,
231 SkuName SkuName String
232 DefaultValueName DefaultValueName String
233 TokenSpaceGuidName TokenSpaceGuidName String
234 TokenName TokenName String
235 Value PCD value to be set
244 Index
= LookupPcdIndex (SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
246 fprintf (stderr
, "PCD %s.%s.%s.%s is not in database\n", SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
249 free(PcdList
[Index
].Value
);
250 PcdList
[Index
].Value
= malloc(20);
251 switch (PcdList
[Index
].PcdDataType
) {
252 case PcdDataTypeBoolean
:
254 strcpy (PcdList
[Index
].Value
, "0x00");
256 strcpy (PcdList
[Index
].Value
, "0x01");
259 case PcdDataTypeUint8
:
260 sprintf(PcdList
[Index
].Value
, "0x%02x", (UINT8
)(Value
& 0xff));
262 case PcdDataTypeUint16
:
263 sprintf(PcdList
[Index
].Value
, "0x%04x", (UINT16
)(Value
& 0xffff));
265 case PcdDataTypeUint32
:
266 sprintf(PcdList
[Index
].Value
, "0x%08x", (UINT32
)(Value
& 0xffffffff));
268 case PcdDataTypeUint64
:
269 sprintf(PcdList
[Index
].Value
, "0x%016llx", (unsigned long long)Value
);
271 case PcdDataTypePointer
:
272 fprintf (stderr
, "PCD %s.%s.%s.%s is structure. Use PcdSetPtr()\n", SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
280 CHAR8
*SkuName OPTIONAL
,
281 CHAR8
*DefaultValueName OPTIONAL
,
282 CHAR8
*TokenSpaceGuidName
,
294 SkuName SkuName String
295 DefaultValueName DefaultValueName String
296 TokenSpaceGuidName TokenSpaceGuidName String
297 TokenName TokenName String
298 Size Size of PCD value buffer
311 Index
= LookupPcdIndex (SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
313 fprintf (stderr
, "PCD %s.%s.%s.%s is not in database\n", SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
316 switch (PcdList
[Index
].PcdDataType
) {
317 case PcdDataTypeBoolean
:
318 case PcdDataTypeUint8
:
319 case PcdDataTypeUint16
:
320 case PcdDataTypeUint32
:
321 case PcdDataTypeUint64
:
322 fprintf (stderr
, "PCD %s.%s.%s.%s is a value. Use PcdGet()\n", SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
325 case PcdDataTypePointer
:
326 Value
= &PcdList
[Index
].Value
[1];
327 printf ("Value = %s\n", PcdList
[Index
].Value
);
328 for (*Size
= 0, Byte
= (UINT8
) strtoul(Value
, &End
, 16); Value
!= End
; Byte
= (UINT8
) strtoul(Value
, &End
, 16), *Size
= *Size
+ 1) {
329 printf("%x\n", Byte
);
332 Buffer
= malloc(*Size
);
333 Value
= &PcdList
[Index
].Value
[1];
334 for (*Size
= 0, Buffer
[*Size
] = (UINT8
) strtoul(Value
, &End
, 16); Value
!= End
; *Size
= *Size
+ 1, Buffer
[*Size
] = (UINT8
) strtoul(Value
, &End
, 16)) {
345 CHAR8
*SkuName OPTIONAL
,
346 CHAR8
*DefaultValueName OPTIONAL
,
347 CHAR8
*TokenSpaceGuidName
,
360 SkuName SkuName String
361 DefaultValueName DefaultValueName String
362 TokenSpaceGuidName TokenSpaceGuidName String
363 TokenName TokenName String
364 Size Size of PCD value
365 Value Pointer to the updated PCD value buffer
375 Index
= LookupPcdIndex (SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
377 fprintf (stderr
, "PCD %s.%s.%s.%s is not in database\n", SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
380 switch (PcdList
[Index
].PcdDataType
) {
381 case PcdDataTypeBoolean
:
382 case PcdDataTypeUint8
:
383 case PcdDataTypeUint16
:
384 case PcdDataTypeUint32
:
385 case PcdDataTypeUint64
:
386 fprintf (stderr
, "PCD %s.%s.%s.%s is a value. Use PcdGet()\n", SkuName
, DefaultValueName
, TokenSpaceGuidName
, TokenName
);
389 case PcdDataTypePointer
:
390 free(PcdList
[Index
].Value
);
391 PcdList
[Index
].Value
= malloc(Size
* 5 + 3);
392 PcdList
[Index
].Value
[0] = '{';
393 for (ValueIndex
= 0; ValueIndex
< Size
; ValueIndex
++) {
394 printf("Value[%d] = %02x\n", ValueIndex
, Value
[ValueIndex
]);
395 sprintf(&PcdList
[Index
].Value
[1 + ValueIndex
* 5], "0x%02x,", Value
[ValueIndex
]);
397 PcdList
[Index
].Value
[1 + Size
* 5 - 1] = '}';
398 PcdList
[Index
].Value
[1 + Size
* 5 ] = 0;
406 CHAR8
*InputFileName
,
414 Read the file buffer from the input file.
418 InputFileName Point to the input file name.
419 FileBuffer Point to the input file buffer.
420 FileSize Size of the file buffer.
431 // Open Input file and read file data.
433 InputFile
= fopen (InputFileName
, "rb");
434 if (InputFile
== NULL
) {
435 fprintf (stderr
, "Error opening file %s\n", InputFileName
);
440 // Go to the end so that we can determine the file size
442 if (fseek (InputFile
, 0, SEEK_END
)) {
443 fprintf (stderr
, "Error reading input file %s\n", InputFileName
);
451 *FileSize
= ftell (InputFile
);
452 if (*FileSize
== -1) {
453 fprintf (stderr
, "Error parsing the input file %s\n", InputFileName
);
461 *FileBuffer
= malloc (*FileSize
);
462 if (*FileBuffer
== NULL
) {
463 fprintf (stderr
, "Can not allocate buffer for input input file %s\n", InputFileName
);
469 // Reset to the beginning of the file
471 if (fseek (InputFile
, 0, SEEK_SET
)) {
472 fprintf (stderr
, "Error reading the input file %s\n", InputFileName
);
479 // Read all of the file contents.
481 BytesRead
= fread (*FileBuffer
, sizeof (UINT8
), *FileSize
, InputFile
);
482 if (BytesRead
!= *FileSize
* sizeof (UINT8
)) {
483 fprintf (stderr
, "Error reading the input file %s\n", InputFileName
);
505 Read the initial PCD value from the input file buffer.
509 FileBuffer Point to the input file buffer.
510 FileSize Size of the file buffer.
522 for (Index
= 0, NumLines
= 0; Index
< FileSize
; Index
++) {
523 if (FileBuffer
[Index
] == '\n') {
527 PcdList
= malloc((NumLines
+ 1) * sizeof(PcdList
[0]));
529 for (Index
= 0, TokenIndex
= 0, PcdListLength
= 0, TokenStart
= 0; Index
< FileSize
; Index
++) {
530 if (FileBuffer
[Index
] == ' ') {
533 if (FileBuffer
[Index
] == '|' || FileBuffer
[Index
] == '.' || FileBuffer
[Index
] == '\n' || FileBuffer
[Index
] == '\r') {
534 RecordToken (FileBuffer
, PcdListLength
, TokenIndex
, TokenStart
, Index
);
535 if (FileBuffer
[Index
] == '\n' || FileBuffer
[Index
] == '\r') {
536 if (TokenIndex
!= 0) {
543 TokenStart
= Index
+ 1;
547 if (Index
> TokenStart
) {
548 RecordToken (FileBuffer
, PcdListLength
, TokenIndex
, TokenStart
, Index
);
549 if (TokenIndex
!= 0) {
558 CHAR8
*OutputFileName
564 Write the updated PCD value into the output file name.
568 OutputFileName Point to the output file name.
581 OutputFile
= fopen (OutputFileName
, "wb");
582 if (OutputFile
== NULL
) {
583 fprintf (stderr
, "Error opening file %s\n", OutputFileName
);
587 for (Index
= 0; Index
< PcdListLength
; Index
++) {
590 "%s.%s.%s.%s|%s|%s\n",
591 PcdList
[Index
].SkuName
,
592 PcdList
[Index
].DefaultValueName
,
593 PcdList
[Index
].TokenSpaceGuidName
,
594 PcdList
[Index
].TokenName
,
595 PcdList
[Index
].DataType
,
601 // Done, write output file.
603 if (OutputFile
!= NULL
) {
617 Displays the utility usage syntax to STDOUT
629 fprintf (stdout
, "Usage: -i <input_file> -o <output_file>\n\n");
630 fprintf (stdout
, "optional arguments:\n");
631 fprintf (stdout
, " -h, --help Show this help message and exit\n");
632 fprintf (stdout
, " -i INPUT_FILENAME, --input INPUT_FILENAME\n\
633 PCD Database Input file name\n");
634 fprintf (stdout
, " -o OUTPUT_FILENAME, --output OUTPUT_FILENAME\n\
635 PCD Database Output file name\n");
643 CHAR8
**InputFileName
,
644 CHAR8
**OutputFileName
650 Parse the input parameters to get the input/output file name.
654 argc Number of command line parameters.
655 argv Array of pointers to parameter strings.
656 InputFileName Point to the input file name.
657 OutputFileName Point to the output file name.
665 fprintf (stderr
, "Missing options\n");
670 // Parse command line
675 if ((stricmp (argv
[0], "-h") == 0) || (stricmp (argv
[0], "--help") == 0)) {
681 if ((stricmp (argv
[0], "-i") == 0) || (stricmp (argv
[0], "--input") == 0)) {
682 if (argv
[1] == NULL
|| argv
[1][0] == '-') {
683 fprintf (stderr
, "Invalid option value. Input File name is missing for -i option\n");
686 *InputFileName
= argv
[1];
692 if ((stricmp (argv
[0], "-o") == 0) || (stricmp (argv
[0], "--output") == 0)) {
693 if (argv
[1] == NULL
|| argv
[1][0] == '-') {
694 fprintf (stderr
, "Invalid option value. Output File name is missing for -i option\n");
697 *OutputFileName
= argv
[1];
703 if (argv
[0][0] == '-') {
704 fprintf (stderr
, "Unknown option %s\n", argv
[0]);
712 // Check Input paramters
714 if (*InputFileName
== NULL
) {
715 fprintf (stderr
, "Missing option. Input files is not specified\n");
718 printf ("Input file name is %s\n", *InputFileName
);
721 if (*OutputFileName
== NULL
) {
722 fprintf (stderr
, "Missing option. Output file is not specified\n");
725 printf ("Output file name is %s\n", *OutputFileName
);
738 Main function updates PCD values.
742 argc Number of command line parameters.
743 argv Array of pointers to parameter strings.
749 CHAR8
*InputFileName
;
750 CHAR8
*OutputFileName
;
754 printf ("PCD tool start.\n");
755 InputFileName
= NULL
;
756 OutputFileName
= NULL
;
759 // Parse the input arguments
761 ParseArguments (argc
, argv
, &InputFileName
, &OutputFileName
);
764 // Open Input file and read file data.
766 ReadInputFile (InputFileName
, &FileBuffer
, &FileSize
);
769 // Read the initial Pcd value
771 ParseFile (FileBuffer
, FileSize
);
774 // Customize PCD values in the PCD Database
779 // Save the updated PCD value
781 WriteOutputFile (OutputFileName
);
783 printf ("PCD tool done.\n");