[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] [PATCH v2 10/23] efi: build xen.gz with EFI code
From: |
Konrad Rzeszutek Wilk |
Subject: |
Re: [Xen-devel] [PATCH v2 10/23] efi: build xen.gz with EFI code |
Date: |
Mon, 10 Aug 2015 15:24:28 -0400 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
On Mon, Jul 20, 2015 at 04:29:05PM +0200, Daniel Kiper wrote:
> Build xen.gz with EFI code. We need this to support multiboot2
> protocol on EFI platforms.
>
> If we wish to load not ELF file using multiboot (v1) or multiboot2 then
> it must contain "linear" (or "flat") representation of code and data.
> Currently, PE file contains many sections which are not "linear" (one
> after another without any holes) or even do not have representation
> in a file (e.g. BSS). In theory there is a chance that we could build
> proper PE file using current build system. However, it means that
> xen.efi further diverge from xen ELF file (in terms of contents and
> build method). ELF have all needed properties. So, it means that this
> is good starting point for further development. Additionally, I think
> that this is also good starting point for further xen.efi code and
> build optimizations. It looks that there is a chance that finally we
> can generate xen.efi directly from xen ELF using just simple objcopy.
>
> Signed-off-by: Daniel Kiper <address@hidden>
> ---
> v2 - suggestions/fixes:
> - build EFI code only if it is supported in a given build environment
> (suggested by Jan Beulich).
> ---
> xen/arch/x86/Makefile | 13 +++++--------
> xen/arch/x86/efi/Makefile | 16 +++++++++-------
> xen/arch/x86/mm.c | 3 ++-
> xen/common/efi/runtime.c | 6 ++++++
> 4 files changed, 22 insertions(+), 16 deletions(-)
>
> diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile
> index 5f24951..0335445 100644
> --- a/xen/arch/x86/Makefile
> +++ b/xen/arch/x86/Makefile
> @@ -80,7 +80,7 @@ ALL_OBJS := $(BASEDIR)/arch/x86/boot/built_in.o
> $(BASEDIR)/arch/x86/efi/built_in
>
> ifeq ($(lto),y)
> # Gather all LTO objects together
> -prelink_lto.o: $(ALL_OBJS)
> +prelink_lto.o: $(ALL_OBJS) efi/relocs-dummy.o
> $(LD_LTO) -r -o $@ $^
>
> prelink-efi_lto.o: $(ALL_OBJS) efi/runtime.o efi/compat.o
> @@ -90,14 +90,14 @@ prelink-efi_lto.o: $(ALL_OBJS) efi/runtime.o efi/compat.o
> prelink.o: $(patsubst %/built_in.o,%/built_in_bin.o,$(ALL_OBJS))
> prelink_lto.o
> $(LD) $(LDFLAGS) -r -o $@ $^
>
> -prelink-efi.o: $(patsubst %/built_in.o,%/built_in_bin.o,$(ALL_OBJS))
> prelink-efi_lto.o efi/boot.init.o
> +prelink-efi.o: $(patsubst %/built_in.o,%/built_in_bin.o,$(ALL_OBJS))
> prelink-efi_lto.o
> $(guard) $(LD) $(LDFLAGS) -r -o $@ $^
> else
> -prelink.o: $(ALL_OBJS)
> +prelink.o: $(ALL_OBJS) efi/relocs-dummy.o
> $(LD) $(LDFLAGS) -r -o $@ $^
>
> -prelink-efi.o: $(ALL_OBJS) efi/boot.init.o efi/runtime.o efi/compat.o
> - $(guard) $(LD) $(LDFLAGS) -r -o $@ $(filter-out %/efi/built_in.o,$^)
> +prelink-efi.o: $(ALL_OBJS)
> + $(guard) $(LD) $(LDFLAGS) -r -o $@ $^
> endif
>
> $(BASEDIR)/common/symbols-dummy.o:
> @@ -146,9 +146,6 @@ $(TARGET).efi: prelink-efi.o efi.lds efi/relocs-dummy.o
> $(BASEDIR)/common/symbol
> if $(guard) false; then rm -f $@; echo 'EFI support disabled'; fi
> rm -f $(@D)/.$(@F).[0-9]*
>
> -efi/boot.init.o efi/runtime.o efi/compat.o:
> $(BASEDIR)/arch/x86/efi/built_in.o
> -efi/boot.init.o efi/runtime.o efi/compat.o: ;
> -
> asm-offsets.s: $(TARGET_SUBARCH)/asm-offsets.c
> $(CC) $(filter-out -flto,$(CFLAGS)) -S -o $@ $<
>
> diff --git a/xen/arch/x86/efi/Makefile b/xen/arch/x86/efi/Makefile
> index 1daa7ac..b1e8883 100644
> --- a/xen/arch/x86/efi/Makefile
> +++ b/xen/arch/x86/efi/Makefile
> @@ -1,14 +1,16 @@
> CFLAGS += -fshort-wchar
>
> -obj-y += stub.o
> -
> -create = test -e $(1) || touch -t 199901010000 $(1)
> -
> efi := $(filter y,$(x86_64)$(shell rm -f disabled))
> efi := $(if $(efi),$(shell $(CC) $(filter-out $(CFLAGS-y) .%.d,$(CFLAGS)) -c
> check.c 2>disabled && echo y))
> efi := $(if $(efi),$(shell $(LD) -mi386pep --subsystem=10 -o check.efi
> check.o 2>disabled && echo y))
> -efi := $(if $(efi),$(shell rm disabled)y,$(shell $(call create,boot.init.o);
> $(call create,runtime.o)))
> +efi := $(if $(efi),$(shell rm disabled)y)
>
> -extra-$(efi) += boot.init.o relocs-dummy.o runtime.o compat.o
> +extra-y += relocs-dummy.o
>
> -stub.o: $(extra-y)
> +ifeq ($(efi),y)
> +obj-y += boot.init.o
> +obj-y += compat.o
> +obj-y += runtime.o
> +else
> +obj-y += stub.o
> +endif
That makefile magic I skipped over, but the C code below looks good, so
Half-Reviewed-by: Konrad Rzeszutek Wilk <address@hidden>
> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
> index 342414f..cef2eb6 100644
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -344,7 +344,8 @@ void __init arch_init_memory(void)
>
> subarch_init_memory();
>
> - efi_init_memory();
> + if ( efi_enabled(EFI_PLATFORM) )
> + efi_init_memory();
>
> mem_sharing_init();
>
> diff --git a/xen/common/efi/runtime.c b/xen/common/efi/runtime.c
> index aa064e7..3eb21c1 100644
> --- a/xen/common/efi/runtime.c
> +++ b/xen/common/efi/runtime.c
> @@ -167,6 +167,9 @@ int efi_get_info(uint32_t idx, union xenpf_efi_info *info)
> {
> unsigned int i, n;
>
> + if ( !efi_enabled(EFI_PLATFORM) )
> + return -EOPNOTSUPP;
> +
> switch ( idx )
> {
> case XEN_FW_EFI_VERSION:
> @@ -301,6 +304,9 @@ int efi_runtime_call(struct xenpf_efi_runtime_call *op)
> EFI_STATUS status = EFI_NOT_STARTED;
> int rc = 0;
>
> + if ( !efi_enabled(EFI_PLATFORM) )
> + return -EOPNOTSUPP;
> +
> switch ( op->function )
> {
> case XEN_EFI_get_time:
> --
> 1.7.10.4
>
>
> _______________________________________________
> Xen-devel mailing list
> address@hidden
> http://lists.xen.org/xen-devel
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Xen-devel] [PATCH v2 10/23] efi: build xen.gz with EFI code,
Konrad Rzeszutek Wilk <=