Feature PCDs are mainly (only?) used to disable features (ie: removing code)
at build type.
We found that it actually never removes code. Here is an example
(ArmPkg/Drivers/CpuDxe/ArmV6/Exception.c):
--------------
ArmDisableFiq ();
if (FeaturePcdGet(PcdRelocateVectorTable) == TRUE) {
(...)
} else {
// The Vector table must be 32-byte aligned
ASSERT(((UINT32)ExceptionHandlersStart & ((1 << 5)-1)) == 0);
// We do not copy the Exception Table at
PcdGet32(PcdCpuVectorBaseAddress). We just set Vector Base Address to point
into CpuDxe code.
ArmWriteVBar ((UINT32)ExceptionHandlersStart);
}
--------------
If we build it with the upstream UEFI. The C code becomes after
pre-preprocessing:
--------------
ArmDisableFiq ();
if (_gPcd_FixedAtBuild_PcdRelocateVectorTable == ((BOOLEAN)(1==1))) {
(...)
--------------
And the dissassembly:
--------------
bl ArmDisableFiq
.LVL19:
.loc 1 147 0
ldr r3, .L44+4 ; Get the address of
_gPcd_FixedAtBuild_PcdRelocateVectorTable
ldrb r3, [r3] ; Load its value
cmp r3, #1 ; if (_gPcd_FixedAtBuild_PcdRelocateVectorTable ==
((BOOLEAN)(1==1))) {
bne .L19
.loc 1 151 0
ldr r3, .L44+8
--------------
Now, let's have a look at the AutoGen.h for this PCD:
--------------
#define _PCD_TOKEN_PcdRelocateVectorTable 104U
#define _PCD_VALUE_PcdRelocateVectorTable ((BOOLEAN)0U)
extern const BOOLEAN _gPcd_FixedAtBuild_PcdRelocateVectorTable;
#define _PCD_GET_MODE_BOOL_PcdRelocateVectorTable
_gPcd_FixedAtBuild_PcdRelocateVectorTable
//#define _PCD_SET_MODE_BOOL_PcdRelocateVectorTable ASSERT(FALSE) // It is
not allowed to set value for a FIXED_AT_BUILD PCD
--------------
And the definition of FeaturePcdGet() in PcdLib.h:
--------------
#define FeaturePcdGet(TokenName) _PCD_GET_MODE_BOOL_##TokenName
--------------
Workaround:
I hacked PcdLib to used its value instead of accessing the global variable:
--------------
#define FeaturePcdGet(TokenName) _PCD_VALUE_##TokenName
--------------
But this change was not enough because PCDs that were not set in DSC did not
have their _PCD_VALUE_ value.
Example of PcdVerifyNodeInList:
--------------
#define _PCD_TOKEN_PcdVerifyNodeInList 5U
extern const BOOLEAN _gPcd_FixedAtBuild_PcdVerifyNodeInList;
#define _PCD_GET_MODE_BOOL_PcdVerifyNodeInList
_gPcd_FixedAtBuild_PcdVerifyNodeInList
//#define _PCD_SET_MODE_BOOL_PcdVerifyNodeInList ASSERT(FALSE) // It is
not allowed to set value for a FIXED_AT_BUILD PCD
--------------
So, I hacked BaseTools to always add the value of PCDs:
--------------
--- a/BaseTools/Source/Python/AutoGen/GenC.py
+++ b/BaseTools/Source/Python/AutoGen/GenC.py
@@ -1077,6 +1077,8 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH,
Pcd):
if PcdItemType == TAB_PCDS_FIXED_AT_BUILD and key in Info.ConstPcd:
AutoGenH.Append('#define _PCD_VALUE_%s %s\n' %(TokenCName,
Pcd.DefaultValue))
+ else:
+ AutoGenH.Append('#define _PCD_VALUE_%s %s\n' %(TokenCName,
Pcd.DefaultValue)
--------------
After rebuilding my platform
(ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-RTSM-A9x4.dsc) in RELEASE build,
here is the result:
--------------
bl ArmDisableFiq
.LVL19:
.loc 1 215 0
ldr r0, .L25+4
bl ArmWriteVBar
--------------
We can now see the dead code has been removed.
In term of size:
Before:
FVMAIN_SEC [5%Full] 524288 total, 27232 used, 497056 free
FVMAIN_COMPACT [18%Full] 2621440 total, 481760 used, 2139680 free
FVMAIN [99%Full] 1161088 total, 1161056 used, 32 free
After:
FVMAIN_SEC [5%Full] 524288 total, 27232 used, 497056 free
FVMAIN_COMPACT [18%Full] 2621440 total, 478632 used, 2142808 free
FVMAIN [99%Full] 1154432 total, 1154400 used, 32 free
So, it saved 6656 bytes in the non-compressed FV.
------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel