[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH RFC 2/7] xen/x86: Manually build PE header



>>> On 08.07.17 at 23:53, <daniel.kiper@xxxxxxxxxx> wrote:
> This is the first step to get:
>   - one binary which can be loaded by the EFI loader,
>     Multiboot and Multiboot2 protocols,
>   - if we wish, in the future we can drop xen/xen.gz
>     and build xen.efi only,

If anything, generate xen.gz from xen.efi - I see value in the compression,
but the EFI loader requires an uncompressed binary. And of course we'd have
to raise the minimal gcc version requirement.

> --- a/xen/arch/x86/Rules.mk
> +++ b/xen/arch/x86/Rules.mk
> @@ -7,6 +7,8 @@ CFLAGS += -I$(BASEDIR)/include
>  CFLAGS += -I$(BASEDIR)/include/asm-x86/mach-generic
>  CFLAGS += -I$(BASEDIR)/include/asm-x86/mach-default
>  CFLAGS += -DXEN_IMG_OFFSET=$(XEN_IMG_OFFSET)
> +CFLAGS += -DXEN_LOAD_ALIGN=XEN_IMG_OFFSET
> +CFLAGS += -DXEN_FILE_ALIGN=PAGE_SIZE

??? (Sadly your description talks about benefits only, not about what the
patch actually does.)

> --- a/xen/arch/x86/boot/head.S
> +++ b/xen/arch/x86/boot/head.S
> @@ -1,3 +1,4 @@
> +#include <xen/compile.h>
>  #include <xen/multiboot.h>
>  #include <xen/multiboot2.h>
>  #include <public/xen.h>
> @@ -44,6 +45,150 @@
>  .Lmb2ht_init_end\@:
>          .endm
>  
> +        .section .efi.pe.header, "a", @progbits
> +
> +ENTRY(efi_pe_head)

Since you put this in a separate section anyway, why don't you place it in
a C file (perhaps even of its own) with suitably declared structures?

> +        /*
> +         * Legacy EXE header.
> +         *
> +         * Most of it is copied from binutils package, version 2.28,
> +         * 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. */
> +        .short  0                                  /* Overlay number. */
> +        .fill   4, 2, 0                            /* Reserved words. */
> +        .short  0                                  /* OEM identifier. */
> +        .short  0                                  /* OEM information. */
> +        .fill   10, 2, 0                           /* Reserved words. */
> +        .long   pe_header - efi_pe_head            /* File address of the PE 
> header. */
> +
> +        /*
> +         * DOS message.
> +         *
> +         * It is copied from binutils package, version 2.28,
> +         * include/coff/pe.h:struct external_PEI_filehdr and
> +         * bfd/peXXigen.c:_bfd_XXi_only_swap_filehdr_out().
> +         */
> +        .long   0x0eba1f0e
> +        .long   0xcd09b400
> +        .long   0x4c01b821
> +        .long   0x685421cd
> +        .long   0x70207369
> +        .long   0x72676f72
> +        .long   0x63206d61
> +        .long   0x6f6e6e61
> +        .long   0x65622074
> +        .long   0x6e757220
> +        .long   0x206e6920
> +        .long   0x20534f44
> +        .long   0x65646f6d
> +        .long   0x0a0d0d2e
> +        .long   0x24
> +        .long   0

Other than what the comment says, this isn't just a message (or else you
could have used .asciz for the whole thing). I'm not convinced we need
any of this.

> @@ -259,6 +266,8 @@ SECTIONS
>  #endif
>    __2M_rwdata_end = .;
>  
> +  __pe_SizeOfImage = ALIGN(. - __image_base__, XEN_LOAD_ALIGN);

I don't think this is in line with what xen.efi currently has. Any difference
needs explaining (I think there are further fields in this category).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.