On 6/16/20 3:57 AM, Gao, Liming wrote:
This data is great. The change is good. Reviewed-by: Liming Gao <liming....@intel.com>


Submitted as #699 and merged,

Thanks all

*From:*Liu, Zhiguang <zhiguang....@intel.com>
*Sent:* 2020年6月15日15:34
*To:* Ard Biesheuvel <ard.biesheu...@arm.com>; Gao, Liming <liming....@intel.com>; devel@edk2.groups.io
*Cc:* Kinney, Michael D <michael.d.kin...@intel.com>
*Subject:* RE: [edk2-devel] [PATCH v3] MdePkg/BasePrintLib: avoid absolute addresses for error strings

Hi Ard,

I also collected the image size of OVMFX64 size building with VS2015x86.

        

Debug

        

Release

        

before

        

after

        

After-before

        

before

        

after

        

after-before

sec

        

27664

        

27409

        

-255

        

13968

        

13968

        

0

pei

        

223016

        

221000

        

-2016

        

107208

        

106984

        

-224

dxe

        

4507000

        

4481336

        

-25664

        

2987064

        

2979384

        

-7680

compact

        

1179776

        

1172528

        

-7248

        

922664

        

920304

        

-2360

It can reduce the image size in X64.

Reviewed-by: Zhiguang Liu <zhiguang....@intel.com <mailto:zhiguang....@intel.com>>

-----Original Message-----

From: Ard Biesheuvel <ard.biesheu...@arm.com <mailto:ard.biesheu...@arm.com>>

Sent: Friday, June 12, 2020 11:11 PM

To: Gao, Liming <liming....@intel.com <mailto:liming....@intel.com>>;
devel@edk2.groups.io <mailto:devel@edk2.groups.io>

Cc: Kinney, Michael D <michael.d.kin...@intel.com <mailto:michael.d.kin...@intel.com>>; Liu,
Zhiguang

<zhiguang....@intel.com <mailto:zhiguang....@intel.com>>

Subject: Re: [edk2-devel] [PATCH v3] MdePkg/BasePrintLib: avoid absolute

addresses for error strings



On 6/12/20 4:33 PM, Gao, Liming wrote:

> Ard:

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

>



Building OvmfPkgX64.dsc in RELEASE mode using GCC5 profile gives me





Before:

SECFV [5%Full] 212992 total, 11760 used, 201232 free PEIFV [9%Full] 917504

total, 89384 used, 828120 free DXEFV [22%Full] 12582912 total, 2806320 used,

9776592 free FVMAIN_COMPACT [26%Full] 3440640 total, 918760 used,

2521880 free



After:

SECFV [5%Full] 212992 total, 11760 used, 201232 free PEIFV [9%Full] 917504

total, 89192 used, 828312 free DXEFV [22%Full] 12582912 total, 2802928 used,

9779984 free FVMAIN_COMPACT [26%Full] 3440640 total, 916784 used,

2523856 free



So no change for SECFV, -192 bytes for PEIFV, -3392 bytes for DXEFV and

-1976 bytes for the resulting outer FV image.







>> -----Original Message-----

>> From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> <devel@edk2.groups.io
<mailto:devel@edk2.groups.io>> On Behalf Of Ard

Biesheuvel

>> Sent: Friday, June 12, 2020 6:35 AM

>> To: devel@edk2.groups.io <mailto:devel@edk2.groups.io>

>> Cc: Ard Biesheuvel <ard.biesheu...@arm.com <mailto:ard.biesheu...@arm.com>>; 
Kinney, Michael D

<michael.d.kin...@intel.com <mailto:michael.d.kin...@intel.com>>; Gao,
Liming <liming....@intel.com <mailto: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 
<mailto:michael.d.kin...@intel.com>>

>> Cc: "Gao, Liming" <liming....@intel.com <mailto:liming....@intel.com>>

>> Signed-off-by: Ard Biesheuvel <ard.biesheu...@arm.com 
<mailto: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 <mailto: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 (#61326): https://edk2.groups.io/g/devel/message/61326
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