On 25 June 2015 at 05:33, Liu, Yingke D <yingke.d....@intel.com> wrote: > Ard, > > Following is the full GenFw patch, please confirm it: > > BaseTools: Update GenFw to support 4K alignment. > > Get maximum section alignment from ELF sections > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org> > --- > BaseTools/Source/C/GenFw/Elf32Convert.c | 16 +++++++++++++++- > BaseTools/Source/C/GenFw/Elf64Convert.c | 16 +++++++++++++++- > BaseTools/Source/C/GenFw/ElfConvert.c | 4 ++-- > BaseTools/Source/C/GenFw/ElfConvert.h | 1 + > 4 files changed, 33 insertions(+), 4 deletions(-) >
Hello Dennis, The patch looks fine to me. Thanks, Ard. > diff --git a/BaseTools/Source/C/GenFw/Elf32Convert.c > b/BaseTools/Source/C/GenFw/Elf32Convert.c > index 5c7b689..10d9892 100644 > --- a/BaseTools/Source/C/GenFw/Elf32Convert.c > +++ b/BaseTools/Source/C/GenFw/Elf32Convert.c > @@ -96,7 +96,7 @@ STATIC Elf_Phdr *mPhdrBase; > // > // Coff information > // > -STATIC const UINT32 mCoffAlignment = 0x20; > +STATIC UINT32 mCoffAlignment = 0x20; > > // > // PE section alignment. > @@ -292,6 +292,20 @@ ScanSections32 ( > mCoffOffset += mCoffNbrSections * sizeof(EFI_IMAGE_SECTION_HEADER); > > // > + // Set mCoffAlignment to the maximum alignment of the input sections > + // we care about > + // > + for (i = 0; i < mEhdr->e_shnum; i++) { > + Elf_Shdr *shdr = GetShdrByIndex(i); > + if (shdr->sh_addralign <= mCoffAlignment) { > + continue; > + } > + if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr)) { > + mCoffAlignment = (UINT32)shdr->sh_addralign; > + } > + } > + > + // > // First text sections. > // > mCoffOffset = CoffAlign(mCoffOffset); > diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c > b/BaseTools/Source/C/GenFw/Elf64Convert.c > index 25b90e2..d2becf1 100644 > --- a/BaseTools/Source/C/GenFw/Elf64Convert.c > +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c > @@ -97,7 +97,7 @@ STATIC Elf_Phdr *mPhdrBase; > // > // Coff information > // > -STATIC const UINT32 mCoffAlignment = 0x20; > +STATIC UINT32 mCoffAlignment = 0x20; > > // > // PE section alignment. > @@ -286,6 +286,20 @@ ScanSections64 ( > mCoffOffset += mCoffNbrSections * sizeof(EFI_IMAGE_SECTION_HEADER); > > // > + // Set mCoffAlignment to the maximum alignment of the input sections > + // we care about > + // > + for (i = 0; i < mEhdr->e_shnum; i++) { > + Elf_Shdr *shdr = GetShdrByIndex(i); > + if (shdr->sh_addralign <= mCoffAlignment) { > + continue; > + } > + if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr)) { > + mCoffAlignment = (UINT32)shdr->sh_addralign; > + } > + } > + > + // > // First text sections. > // > mCoffOffset = CoffAlign(mCoffOffset); > diff --git a/BaseTools/Source/C/GenFw/ElfConvert.c > b/BaseTools/Source/C/GenFw/ElfConvert.c > index 1a84d3c..6211389 100644 > --- a/BaseTools/Source/C/GenFw/ElfConvert.c > +++ b/BaseTools/Source/C/GenFw/ElfConvert.c > @@ -96,11 +96,11 @@ CoffAddFixup( > > mCoffFile = realloc ( > mCoffFile, > - mCoffOffset + sizeof(EFI_IMAGE_BASE_RELOCATION) + 2*0x1000 > + mCoffOffset + sizeof(EFI_IMAGE_BASE_RELOCATION) + 2 * > MAX_COFF_ALIGNMENT > ); > memset ( > mCoffFile + mCoffOffset, 0, > - sizeof(EFI_IMAGE_BASE_RELOCATION) + 2*0x1000 > + sizeof(EFI_IMAGE_BASE_RELOCATION) + 2 * MAX_COFF_ALIGNMENT > ); > > mCoffBaseRel = (EFI_IMAGE_BASE_RELOCATION*)(mCoffFile + mCoffOffset); > diff --git a/BaseTools/Source/C/GenFw/ElfConvert.h > b/BaseTools/Source/C/GenFw/ElfConvert.h > index b27a2f9..56f165e 100644 > --- a/BaseTools/Source/C/GenFw/ElfConvert.h > +++ b/BaseTools/Source/C/GenFw/ElfConvert.h > @@ -34,6 +34,7 @@ extern UINT32 mOutImageType; > // Common EFI specific data. > // > #define ELF_HII_SECTION_NAME ".hii" > +#define MAX_COFF_ALIGNMENT 0x10000 > > // > // Filter Types > -- > > Dennis > > -----Original Message----- > From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] > Sent: Wednesday, June 24, 2015 18:13 > To: edk2-devel@lists.sourceforge.net > Subject: Re: [edk2] [Patch 2/3] BaseTools: Update GenFw to support 4K > alignment. > > On 24 June 2015 at 10:26, Gao, Liming <liming....@intel.com> wrote: >> Got your point. I agree with this change. We will include it in the patch >> and add you in Signed-off-by list. >> > > OK, thanks. > > There is one additional issue though: when using alignment of > 4 KB, the > GenFw tool may crash, since it tries to pad out the .reloc section up to > section alignment, which may cover unmapped host memory. So something like > below is needed, and MAX_COFF_ALIGNMENT needs to be set to some sensible but > sufficiently high value. Since PE/COFF specifies > 64 KB as the maximum file alignment, and GenFw uses mCoffAlignment for both > SectionAlignment and FileAlignment, I suppose 64 KB would be appropriate here. > > """ > diff --git a/BaseTools/Source/C/GenFw/ElfConvert.c > b/BaseTools/Source/C/GenFw/ElfConvert.c > index 1a84d3c28794..e315d913378d 100644 > --- a/BaseTools/Source/C/GenFw/ElfConvert.c > +++ b/BaseTools/Source/C/GenFw/ElfConvert.c > @@ -96,11 +101,11 @@ CoffAddFixup( > > mCoffFile = realloc ( > mCoffFile, > - mCoffOffset + sizeof(EFI_IMAGE_BASE_RELOCATION) + 2*0x1000 > + mCoffOffset + sizeof(EFI_IMAGE_BASE_RELOCATION) + 2 * > + MAX_COFF_ALIGNMENT > ); > memset ( > mCoffFile + mCoffOffset, 0, > - sizeof(EFI_IMAGE_BASE_RELOCATION) + 2*0x1000 > + sizeof(EFI_IMAGE_BASE_RELOCATION) + 2 * MAX_COFF_ALIGNMENT > ); > > mCoffBaseRel = (EFI_IMAGE_BASE_RELOCATION*)(mCoffFile + mCoffOffset); """ > > -- > Ard. > > >> -----Original Message----- >> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] >> Sent: Wednesday, June 24, 2015 4:19 PM >> To: edk2-devel@lists.sourceforge.net >> Subject: Re: [edk2] [Patch 2/3] BaseTools: Update GenFw to support 4K >> alignment. >> >> On 24 June 2015 at 10:15, Gao, Liming <liming....@intel.com> wrote: >>> Ard: >>> Good suggestion. How about go through every Shdr and choose the max >>> Shdr->sh_addralign? The alignment should be power of 2. >>> >> >> Indeed. Something like this seems to work fine: >> >> """ >> diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c >> b/BaseTools/Source/C/GenFw/Elf64Convert.c >> index 2266e487cec7..4025191e868e 100644 >> --- a/BaseTools/Source/C/GenFw/Elf64Convert.c >> +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c >> @@ -97,7 +97,7 @@ STATIC Elf_Phdr *mPhdrBase; // // Coff information // >> -STATIC const UINT32 mCoffAlignment = 0x20; >> +STATIC UINT32 mCoffAlignment = 0x20; >> >> // >> // PE section alignment. >> @@ -286,6 +286,20 @@ ScanSections64 ( >> mCoffOffset += mCoffNbrSections * sizeof(EFI_IMAGE_SECTION_HEADER); >> >> // >> + // Set mCoffAlignment to the maximum alignment of the input sections >> + // we care about // for (i = 0; i < mEhdr->e_shnum; i++) { >> + Elf_Shdr *shdr = GetShdrByIndex(i); >> + if (shdr->sh_addralign <= mCoffAlignment) { >> + continue; >> + } >> + if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr)) { >> + mCoffAlignment = shdr->sh_addralign; >> + } >> + } >> + >> + // >> // First text sections. >> // >> mCoffOffset = CoffAlign(mCoffOffset); """ >> >> Note that we may want to use 64 KB instead of 4 KB on AArch64, since the OS >> may use 64 KB pages. So we should avoid hardcoding 4 KB values for section >> alignment. >> >> -- >> Ard. >> >> >>> Thanks >>> Liming >>> -----Original Message----- >>> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] >>> Sent: Tuesday, June 23, 2015 5:14 PM >>> To: edk2-devel@lists.sourceforge.net >>> Subject: Re: [edk2] [Patch 2/3] BaseTools: Update GenFw to support 4K >>> alignment. >>> >>> On 23 June 2015 at 10:19, Yingke Liu <yingke.d....@intel.com> wrote: >>>> If current ELF file is 4K aligned, the converted PE should also be 4K >>>> aligned. >>>> >>>> Contributed-under: TianoCore Contribution Agreement 1.0 >>>> Signed-off-by: Yingke Liu <yingke.d....@intel.com> >>>> --- >>>> BaseTools/Source/C/GenFw/Elf32Convert.c | 8 ++++++-- >>>> BaseTools/Source/C/GenFw/Elf64Convert.c | 6 +++++- >>>> 2 files changed, 11 insertions(+), 3 deletions(-) >>>> >>>> diff --git a/BaseTools/Source/C/GenFw/Elf32Convert.c >>>> b/BaseTools/Source/C/GenFw/Elf32Convert.c >>>> index 5c7b689..9245851 100644 >>>> --- a/BaseTools/Source/C/GenFw/Elf32Convert.c >>>> +++ b/BaseTools/Source/C/GenFw/Elf32Convert.c >>>> @@ -96,7 +96,7 @@ STATIC Elf_Phdr *mPhdrBase; // // Coff information >>>> // -STATIC const UINT32 mCoffAlignment = 0x20; >>>> +STATIC UINT32 mCoffAlignment = 0x20; >>>> >>>> // >>>> // PE section alignment. >>>> @@ -154,7 +154,11 @@ InitializeElf32 ( >>>> Error (NULL, 0, 3000, "Unsupported", "ELF e_version (%u) not >>>> EV_CURRENT (%d)", (unsigned) mEhdr->e_version, EV_CURRENT); >>>> return FALSE; >>>> } >>>> - >>>> + >>>> + if ((mEhdr->e_entry & 0xFFF) == 0) { >>>> + mCoffAlignment = 0x1000; >>>> + } >>>> + >>> >>> Can you explain why you are using the alignment of the entry point here? >>> Wouldn't it be much better if mCoffAlignment is simply the max() of the >>> alignments of all the sections? >>> >>>> // >>>> // Update section header pointers >>>> // >>>> diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c >>>> b/BaseTools/Source/C/GenFw/Elf64Convert.c >>>> index 25b90e2..8737e30 100644 >>>> --- a/BaseTools/Source/C/GenFw/Elf64Convert.c >>>> +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c >>>> @@ -97,7 +97,7 @@ STATIC Elf_Phdr *mPhdrBase; // // Coff information >>>> // -STATIC const UINT32 mCoffAlignment = 0x20; >>>> +STATIC UINT32 mCoffAlignment = 0x20; >>>> >>>> // >>>> // PE section alignment. >>>> @@ -158,6 +158,10 @@ InitializeElf64 ( >>>> return FALSE; >>>> } >>>> >>>> + if ((mEhdr->e_entry & 0xFFF) == 0) { >>>> + mCoffAlignment = 0x1000; >>>> + } >>>> + >>>> // >>>> // Update section header pointers >>>> // >>>> -- >>>> 1.9.5.msysgit.0 >>>> >>>> >>>> ---------------------------------------------------------------------- >>>> -------- Monitor 25 network devices or servers for free with >>>> OpManager! >>>> OpManager is web-based network management software that monitors >>>> network devices and physical & virtual servers, alerts via email & sms >>>> for fault. Monitor 25 devices for free with no restriction. Download >>>> now http://ad.doubleclick.net/ddm/clk/292181274;119417398;o >>>> _______________________________________________ >>>> edk2-devel mailing list >>>> edk2-devel@lists.sourceforge.net >>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel >>> >>> ------------------------------------------------------------------------------ >>> Monitor 25 network devices or servers for free with OpManager! >>> OpManager is web-based network management software that monitors network >>> devices and physical & virtual servers, alerts via email & sms for fault. >>> Monitor 25 devices for free with no restriction. Download now >>> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o >>> _______________________________________________ >>> edk2-devel mailing list >>> edk2-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/edk2-devel >>> >>> ------------------------------------------------------------------------------ >>> Monitor 25 network devices or servers for free with OpManager! >>> OpManager is web-based network management software that monitors >>> network devices and physical & virtual servers, alerts via email & sms >>> for fault. Monitor 25 devices for free with no restriction. Download now >>> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o >>> _______________________________________________ >>> edk2-devel mailing list >>> edk2-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/edk2-devel >> >> ------------------------------------------------------------------------------ >> Monitor 25 network devices or servers for free with OpManager! >> OpManager is web-based network management software that monitors >> network devices and physical & virtual servers, alerts via email & sms >> for fault. Monitor 25 devices for free with no restriction. Download now >> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o >> _______________________________________________ >> edk2-devel mailing list >> edk2-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/edk2-devel >> >> ------------------------------------------------------------------------------ >> Monitor 25 network devices or servers for free with OpManager! >> OpManager is web-based network management software that monitors >> network devices and physical & virtual servers, alerts via email & sms >> for fault. Monitor 25 devices for free with no restriction. Download now >> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o >> _______________________________________________ >> edk2-devel mailing list >> edk2-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/edk2-devel > > ------------------------------------------------------------------------------ > Monitor 25 network devices or servers for free with OpManager! > OpManager is web-based network management software that monitors > network devices and physical & virtual servers, alerts via email & sms > for fault. Monitor 25 devices for free with no restriction. Download now > http://ad.doubleclick.net/ddm/clk/292181274;119417398;o > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Monitor 25 network devices or servers for free with OpManager! OpManager is web-based network management software that monitors network devices and physical & virtual servers, alerts via email & sms for fault. Monitor 25 devices for free with no restriction. Download now http://ad.doubleclick.net/ddm/clk/292181274;119417398;o _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel