Hi

I have updated this RFC to V2 that includes a concepts provided by
Tim Lewis that includes extensions to initialize a VOID* PCD that 
cannot be described with a C structure (e.g. UEFI Load Option).

The changes for V2 are:

* Update examples to cover new syntax cases 
* Clarify that this proposal is for PCD values in DEC/INF/DSC/FDF
  files.  Not just DEC/DSC. 
* Add support for multi character ASCII and UCS16 char constants 
  and strings for VOID* PCD byte arrays
* Add support for GUID() macro in VOID* PCD byte arrays
* Add support for DEVICE_PATH() macro in VOID* PCD byte arrays
* Add support for LABEL() and OFFSET_OF() macros in VOID* PCD 
  byte arrays.
* Add support for expressions to compute values.

<proposal>

I would like to propose more flexible value formats for PCDs
in DEC/INF/DSC/FDF files and --pcd command line option.  

This would include the following additions:

* ASCII character values using single quotes(e.g. 'A').
* ASCII multi-character values using single quotes(e.g. 'ABCD').
  No null-terminator.
* UCS16 character values using L and single quotes(e.g. L'A').
* UCS16 multi-character values using L and single quotes(e.g. L'ABCD').
  No null-terminator.
* Support TRUE/FALSE for UINT8/16/32/64 values
* Support TRUE/FALSE in VOID* byte array
* Support decimal values in VOID* byte array
* Support ASCII single quote character values in VOID* byte arrays
* Support byte arrays, ASCII string, Unicode String, 
  ASCII multi-character strings, UCS16 multi-character strings for 
  UINT8/16/32/64 values as long as they fit in the target type.
* Support multi-character values using single quotes(e.g. 'ABCD') in
  VOID* byte arrays that are expanded to a sequence of byte values.
* Support multi-character values using double quotes(e.g. "ABCD") in
  VOID* byte arrays that are expanded to a sequence of byte values.
* Support UCS16 multi-character values using L and single quotes(e.g. L'ABCD') 
  in VOID* byte arrays that are expanded to a sequence of byte values.
* Support UCS16 multi-character values using L and double quotes(e.g. L"ABCD") 
  in VOID* byte arrays that are expanded to a sequence of byte values.
* Support UINT8(), UINT16, UINT32(), and UINT64() macros in 
  VOID* byte arrays that are expanded to a sequence of byte values.
* Support GUID() macro in VOID* byte arrays that are expanded to a 
  sequence of 16 byte values.  The GUID() operand supports Registry 
  format GUIDs, C struct style GUIDs, and GUID C names.
* Support DEVICE_PATH() macro in VOID* byte arrays that are expanded
  to a sequence of byte values.  The DEVICE_PATH() operand is a 
  double quoted string that follow the device path as string format
  defined in UEFI Specification 2.6 Section 9.6.
* Support LABEL() macro in VOID* byte arrays to tag the byte 
  offset of a location in a VOID* byte array.
* Support OFFSET_OF() macro in VOID* byte arrays that returns the
  byte offset of a LABEL() declared in a VOID* byte array.
* Support infix expressions that return an integer result that can
  be used to compute a PCD value with support for 
  (, ), +, -, *, /, %, ~, &, |, ^ operators.

Some examples of this additional flexibility are:
  BOOLEAN TRUE
  BOOLEAN FALSE
  BOOLEAN 0
  BOOLEAN 1
  BOOLEAN {0}
  BOOLEAN {1}
  UINT8   TRUE
  UINT8   FALSE
  UINT8   0x12
  UINT8   12
  UINT8   'A'
  UINT8   {TRUE}
  UINT8   {0x12}  
  UINT8   {'A'}
  UINT8   (6 + 6)
  UINT16  TRUE
  UINT16  0x1234
  UINT16  1234
  UINT16  'AB'
  UINT16  "A"
  UINT16  L'A'
  UINT16  {0x34, TRUE}  
  UINT16  {27, FALSE}
  UINT16  {'A', 'B'}
  UINT16  ('A' - 0x02)
  UINT32  FALSE
  UINT32  0x12345678
  UINT32  12345678
  UINT32  "ABC"
  UINT32  L"A"
  UINT32  'ABCD'
  UINT32  L'AB'
  UINT32  {0x12, 27, TRUE, 'A'}
  UINT32  ((5 * 0x100) / 0x10)
  UINT64  FALSE
  UINT64  0x1234567812345678
  UINT64  1234567812345678
  UINT64  "ABCDEFG"
  UINT64  L"ABC"
  UINT64  'ABCDEFGH'
  UINT64  L'ABCD'
  UINT64  {0x12, 27, TRUE, FALSE, 'A', 'B', 'C', 'D'}
  UINT64  (0x12345678 & 0xff00)
  VOID*   {0x1, 0x2, 0x3}
  VOID*   {10, 11, 12, 13, 14}
  VOID*   {'X', 'Y', 'Z'}
  VOID*   {TRUE, FALSE, FALSE, TRUE}
  VOID*   {0x41, 0x42, 67, 68, 'E', 'F', TRUE, FALSE}
  VOID*   { UINT8(7), UINT16(8), UINT32(0x27), UINT64(0x1234567812345678) }
  VOID*   { 'AB', L'AB', "AB", L"AB" }
  VOID*   { GUID("11E13869-1896-4A07-8B21-D8B23DD2A2B4") }
  VOID*   { GUID({ 0x11e13869, 0x1896, 0x4a07, { 0x8b, 0x21, 0xd8, 0xb2, 0x3d, 
0xd2, 0xa2, 0xb4 } }) }
  VOID*   { GUID(gEfiBlockIoProtocolGuid) }
  VOID*   { DEVICE_PATH("PciRoot(0)/Pci(0,0)") }
  VOID*   { 0, 1, 2, LABEL(Start) 3, 4, 5, LABEL(End) 6, UINT8(OFFSET_OF(End) - 
OFFSET_OF(Start)) }
 
</proposal>

Mike 

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to