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

Reply via email to