From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D48F921A18AAB for ; Tue, 11 Apr 2017 08:24:05 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 473E37AEAA; Tue, 11 Apr 2017 15:24:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 473E37AEAA Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=lersek@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 473E37AEAA Received: from lacos-laptop-7.usersys.redhat.com (ovpn-116-128.phx2.redhat.com [10.3.116.128]) by smtp.corp.redhat.com (Postfix) with ESMTP id 652EE8804C; Tue, 11 Apr 2017 15:24:04 +0000 (UTC) To: Liming Gao , edk2-devel@lists.01.org References: <1491923803-12124-1-git-send-email-liming.gao@intel.com> From: Laszlo Ersek Message-ID: Date: Tue, 11 Apr 2017 17:24:03 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <1491923803-12124-1-git-send-email-liming.gao@intel.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 11 Apr 2017 15:24:05 +0000 (UTC) Subject: Re: [RFC 0/3] Structure PCD value assignment in DEC/DSC X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Apr 2017 15:24:06 -0000 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit On 04/11/17 17:16, Liming Gao wrote: > Requirment: Map VOID* PCD to C structure > 1. When PCD is configured as DynamicHii, it will be map to one EFI variable. If PCD is VOID*, it can map to the > whole EFI variable. Most EFI variable data are defined as C structure. > 2. Some PCDs are designed as C style structure, such as gEfiMdeModulePkgTokenSpaceGuid.PcdPciSerialParameters. > > Current limitation: > 1. VOID* PCD Value must be byte array. Its value is hard to be specified. > 2. If single PCD is defined to map one field in structure, its offset and width will be required when this PCD > is configured as DynamicHii or DynamicVpd. If the structure is big, it will require lots of PCDs to map its > each field. If the structure has the bit field, its bit field can't match PCD. > > Proposal: > Enhance EDKII Build system to support VOID* PCD be mapped to C structure in DEC or DSC. PCD value can be specified > by structure field as C language style in DEC and DSC. Then, its value will be converted to byte array and assigned > to VOID* PCD. This is a pure build enhancement, and no change in PCD driver. > 1. New syntax in DEC and DSC defines PCD with C structure. > a. PCD Data type will be C structure name. > b. C structure header file and the dependent packages are required to be listed. > c. Example in DEC [PcdsFixedAtBuild] section: > gStructuredPcdPkgTokenSpaceGuid.PcdTest|{0xFF}|TEST|0x00010080 { > > Guid/Test.h > > MdePkg/MdePkg.dec > MdeModulePkg/MdeModulePkg.dec > } > 2. Set the value to the structure fields like normal PCD in DEC/DSC/FDF. > a. If the field value is not specified, its default value will be zero. > b. Example in DEC/DSC [PcdsFixedAtBuild] section: > gStructuredPcdPkgTokenSpaceGuid.PcdTest.Bool|TRUE > gStructuredPcdPkgTokenSpaceGuid.PcdTest.Array[1].Foo|"ABC" > gStructuredPcdPkgTokenSpaceGuid.PcdTest.C|0xFEDC > gStructuredPcdPkgTokenSpaceGuid.PcdTest.D|2222 > 3. Pre AutoGen phase, Build tool will prepare the value for structure PCD. > a. Generate C file (name as pcdc file) and its Makefile to include PCD value initialization. > i. Parse PCD field values in DEC/DSC/FDF to generate pcdc file. > ii. Developer provides their pcdc files to customize PCD value in one module INF. > b. Compile C file to the executable tool like BaseTools C tools. > c. Run the executable file to output the byte array PCD value. > d. Build tool gets the byte array PCD value and generate AutoGen code, continue to normal edk2 build process. > 4. Pcdc file will include the different functions to initialize the different PCD value on the different SKU > a. BaseTools CommonLib adds the generic APIs to parse Args, Get/Set PCD value. > b. Pcdc file is compiled and run by Build tool, user doesn't need aware it. > 5. Report > a. Error report will point to the specified value in DEC or DSC when the value can't be assigned to structure field. > b. Build Report will print Structure PCD value with byte array and field value both. > 6. C Structure requirement > a. Structure field data type can't be VOID* or UINTN. its size must be same at the crossing ARCHs. > b. Structure field can be bits, union, nest structure, structure array, enum, pack, unpack. > c. Structure field value can be MACRO, Enum or constant value. My only request at this point is to please file two BZs: - one for the feature itself (apparently the requirement exists already), - another one for the DEC spec, to document the feature. Thank you, Laszlo > > Patch: > This patches add TestPkg to show StructurePcd Value Assignment usage in DEC and DSC. > > Python StructuredPcdValueGenerator.py is added to show structure PCD usage. Its logic will be > integrated into BaseTools later. This script bases on Package dec and Package dsc > to convert structure PCD value to byte array. It depends on BaseTools C source CommonLib. > Before run this script, BaseTools are required to be compiled first. This script will > generate $(WORKSPACE)\Build\PcdValueInit\PcdValueInit.c with the structure PCD field value, > and generate $(WORKSPACE)\Build\PcdValueInit\Makefile to compile it to the executable file. > It also generates $(WORKSPACE)\Build\PcdValueInit\Input.txt to include the initial PCD value > from its declartion in dec file. Last, run the generated executable file with Input.txt, and > output the final PCD value in $(WORKSPACE)\Build\PcdValueInit\Output.txt. > > In Windows: > 1. enter into edk2 > 2. type edksetup.bat --nt32 > 3. nmake -f BaseTools\Makefile > 4. C:\Python27\python.exe TestPkg\StructuredPcdValueGenerator.py -p TestPkg\TestPkg.dec -d TestPkg\TestPkg.dsc > > In Linux: > 1. enter into edk2 > 2. . edksetup.sh BaseTools > 3. cd BaseTools > 4. make > 5. cd edk2 > 6. python TestPkg/StructuredPcdValueGenerator.py -p TestPkg/TestPkg.dec -d TestPkg/TestPkg.dsc > > After run StructuredPcdValueGenerator.py, Structure PCD value will output as byte array. > > Liming Gao (3): > BaseTools: Update Makefile to work at absolute path > BaseTools: Add PcdValueCommon logic into CommonLib > TestPkg: Show Structure PCD value assignment > > BaseTools/Source/C/Common/GNUmakefile | 3 +- > BaseTools/Source/C/Common/Makefile | 3 +- > BaseTools/Source/C/Common/PcdValueCommon.c | 601 ++++++++++++++++++++++++ > BaseTools/Source/C/Common/PcdValueCommon.h | 78 ++++ > BaseTools/Source/C/Makefiles/app.makefile | 2 +- > BaseTools/Source/C/Makefiles/lib.makefile | 2 + > BaseTools/Source/C/Makefiles/ms.app | 4 +- > TestPkg/Include/Guid/Test.h | 31 ++ > TestPkg/StructuredPcdValueGenerator.py | 702 +++++++++++++++++++++++++++++ > TestPkg/TestPkg.dec | 44 ++ > TestPkg/TestPkg.dsc | 69 +++ > 11 files changed, 1534 insertions(+), 5 deletions(-) > create mode 100644 BaseTools/Source/C/Common/PcdValueCommon.c > create mode 100644 BaseTools/Source/C/Common/PcdValueCommon.h > create mode 100644 TestPkg/Include/Guid/Test.h > create mode 100644 TestPkg/StructuredPcdValueGenerator.py > create mode 100644 TestPkg/TestPkg.dec > create mode 100644 TestPkg/TestPkg.dsc >