Ard:
  I will collect the image size on OVMF X64 platform with this patch. 

Thanks
Liming
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ard Biesheuvel
> Sent: Friday, June 12, 2020 6:35 AM
> To: devel@edk2.groups.io
> Cc: Ard Biesheuvel <ard.biesheu...@arm.com>; Kinney, Michael D 
> <michael.d.kin...@intel.com>; Gao, Liming <liming....@intel.com>
> Subject: [edk2-devel] [PATCH v3] MdePkg/BasePrintLib: avoid absolute 
> addresses for error strings
> 
> The mStatusString[] array is constructed as an array of pointer-to-char,
> which means that on X64 or AARCH64, it is emitted as a single linear list
> of 64-bit quantities, each containing the absolute address of one of the
> string literals in memory.
> 
> This means that each string takes up 8 bytes of additional space, along
> with 2 bytes of relocation data. It also means that extra work needs to
> be done at runtime to process these relocations, every time a module is
> loaded that incorporates this library.
> 
> So fix both issues, by splitting mStatusString into two arrays of char
> arrays. The memory footprint decreases from 955 to 843 bytes, and given
> that in the latter case, the overhead consists of 278 NUL characters rather
> than 390 bytes worth of absolute addresses and relocation records, the size
> of a compressed image is reduced even further. For example, when building
> ArmVirtQemu.dsc in RELEASE mode for AARCH64 with the GCC5 profile, I get:
> 
>   Before
> 
>   FV Space Information
>   FVMAIN [100%Full] 5329920 total, 5329920 used, 0 free
>   FVMAIN_COMPACT [38%Full] 2093056 total, 811840 used, 1281216 free
> 
>   After
> 
>   FV Space Information
>   FVMAIN [100%Full] 5321728 total, 5321728 used, 0 free
>   FVMAIN_COMPACT [38%Full] 2093056 total, 809696 used, 1283360 free
> 
> So the uncompressed contents of the compressed image are 8 KB smaller,
> whereas the resulting flash image (consisting of the compressed image
> along with SEC, PEI_CORE and a set of PEIMs that execute in place) is
> 2 KB smaller.
> 
> Cc: "Kinney, Michael D" <michael.d.kin...@intel.com>
> Cc: "Gao, Liming" <liming....@intel.com>
> Signed-off-by: Ard Biesheuvel <ard.biesheu...@arm.com>
> ---
> v3:
> - add code comments to explain what the inner dimension of each array is
>   based on
> 
> v2:
> - split off this patch from the StandaloneMmPkg series, since they are not
>   interdependent anyway, and so they can be discussed separately
> - remove mention of StandaloneMmPkg from the commit log - the space savings
>   by themselves are sufficient justification
> - update the before/after numbers with the current results
> - split the warnings and errors into a separate array, so that the latter
>   can use smaller entries
> - clarify the commit log to explain the effect on compressed as well as
>   XIP images (which both get smaller)
> 
>  MdePkg/Library/BasePrintLib/PrintLibInternal.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/MdePkg/Library/BasePrintLib/PrintLibInternal.c 
> b/MdePkg/Library/BasePrintLib/PrintLibInternal.c
> index b6ec5ac4fbb9..50c6e8559c43 100644
> --- a/MdePkg/Library/BasePrintLib/PrintLibInternal.c
> +++ b/MdePkg/Library/BasePrintLib/PrintLibInternal.c
> @@ -27,13 +27,22 @@
> 
> 
>  GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mHexStr[] = 
> {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
> 
> 
> 
> -GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 * CONST mStatusString[] = {
> 
> +//
> 
> +// Longest string: RETURN_WARN_BUFFER_TOO_SMALL => 24 characters plus NUL 
> byte
> 
> +//
> 
> +GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mWarningString[][24+1] = {
> 
>    "Success",                      //  RETURN_SUCCESS                = 0
> 
>    "Warning Unknown Glyph",        //  RETURN_WARN_UNKNOWN_GLYPH     = 1
> 
>    "Warning Delete Failure",       //  RETURN_WARN_DELETE_FAILURE    = 2
> 
>    "Warning Write Failure",        //  RETURN_WARN_WRITE_FAILURE     = 3
> 
>    "Warning Buffer Too Small",     //  RETURN_WARN_BUFFER_TOO_SMALL  = 4
> 
>    "Warning Stale Data",           //  RETURN_WARN_STALE_DATA        = 5
> 
> +};
> 
> +
> 
> +//
> 
> +// Longest string: RETURN_INCOMPATIBLE_VERSION => 20 characters plus NUL byte
> 
> +//
> 
> +GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mErrorString[][20+1] = {
> 
>    "Load Error",                   //  RETURN_LOAD_ERROR             = 1  | 
> MAX_BIT
> 
>    "Invalid Parameter",            //  RETURN_INVALID_PARAMETER      = 2  | 
> MAX_BIT
> 
>    "Unsupported",                  //  RETURN_UNSUPPORTED            = 3  | 
> MAX_BIT
> 
> @@ -996,12 +1005,12 @@ BasePrintLibSPrintMarker (
>            //
> 
>            Index = Status & ~MAX_BIT;
> 
>            if (Index > 0 && Index <= ERROR_STATUS_NUMBER) {
> 
> -            ArgumentString = mStatusString [Index + WARNING_STATUS_NUMBER];
> 
> +            ArgumentString = mErrorString [Index - 1];
> 
>            }
> 
>          } else {
> 
>            Index = Status;
> 
>            if (Index <= WARNING_STATUS_NUMBER) {
> 
> -            ArgumentString = mStatusString [Index];
> 
> +            ArgumentString = mWarningString [Index];
> 
>            }
> 
>          }
> 
>          if (ArgumentString == ValueBuffer) {
> 
> --
> 2.26.2
> 
> 
> -=-=-=-=-=-=
> Groups.io Links: You receive all messages sent to this group.
> 
> View/Reply Online (#61170): https://edk2.groups.io/g/devel/message/61170
> Mute This Topic: https://groups.io/mt/74829004/1759384
> Group Owner: devel+ow...@edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub  [liming....@intel.com]
> -=-=-=-=-=-=


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#61213): https://edk2.groups.io/g/devel/message/61213
Mute This Topic: https://groups.io/mt/74829004/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to