[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 3/8] xen/x86: manually build xen.mb.efi binary
On Wed, Jul 04, 2018 at 09:27:43AM -0600, Jan Beulich wrote: > >>> On 04.07.18 at 16:01, <daniel.kiper@xxxxxxxxxx> wrote: > > On Mon, Jun 25, 2018 at 09:36:07AM -0600, Jan Beulich wrote: > >> >>> On 19.06.18 at 16:35, <daniel.kiper@xxxxxxxxxx> wrote: > >> > - DOS stub code reduction; experiments showed that DOS stub code size > >> > cannot be changed due to some bugs in applications playing with PE > >> > files, e.g. objdump (more about the issue can be found in the patch > >> > itself); so, I think that if it is not possible to reduce the size > >> > of code then it does make sens change the code itself; hence, it > >> > pays to leave common DOS stub code as is. > >> > >> Even more so here: I'm not sure I care about buggy tools. Did you > >> at least enter a bug report (which you would want to reference in the > >> code comment)? For all of my Win32 life I've been doing fine shrinking > >> DLL/EXE file sizes by moving the PE header to offset 0x40. No tool > >> has even complained. I've just tried objdump 2.25.0 on one of these > >> DLLs - no problem afaics. Did the tool perhaps choke on something > >> other than the non-"standard" offset of the PE header? > > > > I have tried objdump from binutils 2.22. It fails. OK, this is fixed > > in later versions but Xen README says that we support at least binutils > > 2.16.91.0.5. > > And objdump is needed again in which step of the build process? It is not needed by the build process. However, if somebody builds Xen with old binutils then he/she will not be able to do PE analysis with objdump on the same machine. Nothing scary but a bit annoying... [...] > >> > $(D)$(DEBUG_DIR)/$(T)-syms-$(XEN_FULLVERSION).map > >> > @@ -121,7 +125,7 @@ _clean: delete-unfresh-files > >> > $(MAKE) -f $(BASEDIR)/Rules.mk -C test clean > >> > $(MAKE) -f $(BASEDIR)/tools/kconfig/Makefile.kconfig > >> > ARCH=$(ARCH) > >> > SRCARCH=$(SRCARCH) clean > >> > find . \( -name "*.o" -o -name ".*.d" -o -name "*.gcno" \) > >> > -exec rm -f {} \; > >> > - rm -f include/asm $(TARGET) $(TARGET).gz $(TARGET).efi > >> > $(TARGET).efi.map $(TARGET)-syms $(TARGET)-syms.map *~ core > >> > + rm -f include/asm $(TARGET) $(TARGET).gz $(TARGET).efi > >> > $(TARGET).mb.efi $(TARGET).efi.map $(TARGET)-syms $(TARGET)-syms.map *~ > >> > core > >> > >> Perhaps simply $(TARGET)*.efi? I don't think we're at risk deleting > > something > >> precious that way. > > > > Ditto. > > No exactly - you leave this line alone in the later patch then. Last patch touches this line and drops "$(TARGET).mb.efi $(TARGET).efi.map". > >> > +GLOBAL(efi_pe_head) > >> > + /* > >> > + * Legacy EXE header. > >> > + * > >> > + * Most of it is copied from binutils package, version 2.30, > >> > + * include/coff/pe.h:struct external_PEI_filehdr and > >> > + * bfd/peXXigen.c:_bfd_XXi_only_swap_filehdr_out(). > >> > + * > >> > + * Page is equal 512 bytes here. > >> > + * Paragraph is equal 16 bytes here. > >> > + */ > >> > + .short 0x5a4d /* EXE magic > >> > number. */ > >> > + .short 0x90 /* Bytes on last > >> > page of file. */ > >> > + .short 0x3 /* Pages in file. > >> > */ > >> > + .short 0 /* Relocations. */ > >> > + .short 0x4 /* Size of header > >> > in paragraphs. */ > >> > + .short 0 /* Minimum extra > >> > paragraphs needed. */ > >> > + .short 0xffff /* Maximum extra > >> > paragraphs needed. */ > >> > + .short 0 /* Initial > >> > (relative) SS value. */ > >> > + .short 0xb8 /* Initial SP > >> > value. */ > >> > + .short 0 /* Checksum. */ > >> > + .short 0 /* Initial IP > >> > value. */ > >> > + .short 0 /* Initial > >> > (relative) CS value. */ > >> > + .short 0x40 /* File address of > >> > relocation table. */ > >> > >> This is just the most prominent example: Why is this a hard coded > > > > Example of what? > > Example of questionable uses of plain numbers. > > >> number, while ... > > > > This is standard DOS stub. Additionally, this is not real relocation > > table. Just fake one. The pointer points to the DOS stub code. Of > > course we can change that but does it pays? > > Put yourself in the position of a reader not knowing all the details. > The first question on any of these plain numbers will be: Why is it > this number, and not some arbitrary other one. Something like > "number of sections" can still be derived if necessary, but I'd > prefer if you used calculations instead of raw numbers wherever > possible. OK, will do. > >> > + .long __2M_rwdata_end - efi_pe_head_end /* SizeOfCode. */ > >> > + .long 0 /* > >> > SizeOfInitializedData. */ > >> > + .long 0 /* > >> > SizeOfUninitializedData. */ > >> > + .long sym_offs(efi_mb_start) /* > >> > AddressOfEntryPoint. */ > >> > + .long sym_offs(start) /* BaseOfCode. */ > >> > + .quad sym_offs(__image_base__) /* ImageBase. */ > >> > >> The sym_offs() here is certainly different from what xen.efi > >> currently has. With the plan being to have a drop-in replacement, > >> such differences need to be explained to be benign (which here > >> I doubt it is). > > > > We share the code with ELF file, so, both have the same __image_base__ > > address. > > But the question wasn't about __image_base__, but the use of sym_offs() > on it. Again - for this new binary to be a drop-in replacement for the > current xen.efi, all such differences need to be explained. OK. Do you wish this particular thing in the code or in the commit message? > >> > + .align XEN_FILE_ALIGN > >> > +GLOBAL(efi_pe_head_end) > >> > + > >> > + .text > >> > + .code32 > >> > >> Why the .code32 here? Perhaps this comes back to the question of > > > > It looks that I have just copied this from the beginning of the file > > during initial work on this patch. However, there is a chance that it > > can be dropped. > > > >> whether this whole header should really be lumped into this file. > > > > I can move it to separate S file if you wish. > > This would help readability quite a bit, I think. OK. > >> > @@ -582,6 +587,12 @@ static void __init efi_arch_memory_setup(void) > >> > if ( !efi_enabled(EFI_LOADER) ) > >> > return; > >> > > >> > + if ( efi_enabled(EFI_MB_LOADER) ) > >> > + for ( pte = __page_tables_start; pte < __page_tables_end; > >> > + pte += ( pte != (intpte_t *)l2_identmap ) ? 1 : 4 * > >> > L2_PAGETABLE_ENTRIES ) > >> > >> Please avoid explicit casts - &l2e_get_intpte(l2_identmap[0]) or > >> something along those lines ought to work here. Same for > >> 4 * L2_PAGETABLE_ENTRIES - you mean ARRAY_SIZE() there. > > > > OK. > > > >> Also this whole code block needs a comment, to explain what it > >> does and also why l2_identmap needs skipping. > >> > >> Furthermore - isn't this off by one, and you process l2_identmap[0] > >> this way, skipping the rest _plus_ the first following entry? I think > > > > The code mimics similar code in head.S. > > I can't see a similar off-by-1 in head.S. 662 /* 663 * Update frame addresses in page tables excluding l2_identmap 664 * without its first entry which points to l1_identmap. 665 */ 666 mov $((__page_tables_end-__page_tables_start)/8),%ecx 667 mov $(((l2_identmap-__page_tables_start)/8)+1),%edx 668 1: cmp $((l2_identmap+l2_identmap_sizeof-__page_tables_start)/8),%ecx 669 cmove %edx,%ecx 670 testl $_PAGE_PRESENT,sym_fs(__page_tables_start)-8(,%ecx,8) 671 jz 2f 672 add %esi,sym_fs(__page_tables_start)-8(,%ecx,8) 673 2: loop 1b Anyway, I will add the comment in both places that they should be kept in sync. > >> > @@ -271,6 +284,9 @@ SECTIONS > >> > *(.data.rel) > >> > *(.data.rel.*) > >> > CONSTRUCTORS > >> > + /* PE file must end at XEN_FILE_ALIGN boundary. */ > >> > + . = ALIGN(XEN_FILE_ALIGN); > >> > + __pe_text_raw_end = .; > >> > >> Is this really a requirement on the file, or just on the label? > > > > File, so, probably it can be moved behind the label. Though it means > > that __pe_text_raw_end will not point to the real end of .text section. > > This is an answer contradicting itself: If the requirement indeed > is on the file, then things need to remain as is. I'm wondering > though what entity would enforce this requirement (if such > exists in the first place). I am not sure what kind of entity you think about. > >> > @@ -292,6 +308,8 @@ SECTIONS > >> > . = ALIGN(SECTION_ALIGN); > >> > __2M_rwdata_end = .; > >> > > >> > + __pe_SizeOfImage = ALIGN(. - __image_base__, MB(16)); > >> > + > >> > #ifdef EFI > >> > . = ALIGN(4); > >> > .reloc : { > >> > >> Considering the respective code and comment inside the #ifdef, does > >> your addition really belong ahead of it? > > > > Yes, so, it looks that it requires some comment as code above. > > I'm afraid I don't understand. Yes, __pe_SizeOfImage ... code belongs ahead of #ifdef EFI. Looking at your question it seems to me that I should put a few words of comment here to clarify why I do that thing. Daniel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |