Message ID | 1471646606-28519-12-git-send-email-daniel.kiper@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
>>> On 20.08.16 at 00:43, <daniel.kiper@oracle.com> wrote: > Build xen.gz with EFI code. We need this to support multiboot2 > protocol on EFI platforms. > > If we wish to load non-ELF file using multiboot (v1) or multiboot2 then > it must contain "linear" (or "flat") representation of code and data. > This is requirement of both boot protocols. 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). From EFI point > of view everything is OK and works. However, this file layout cannot be > properly interpreted by multiboot protocols family. In theory there is > a chance that we could build proper PE file (from multiboot protocols POV) > using current build system. However, it means that xen.efi further diverge > from Xen ELF file (in terms of contents and build method). On the other > hand ELF has 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 or other tool. This way we will have one > Xen binary which can be loaded by three boot protocols: EFI native loader, > multiboot (v1) and multiboot2. > > Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com> > Acked-by: Jan Beulich <jbeulich@suse.com> > --- > v5 - suggestions/fixes: > - properly calculate efi symbol address in > xen/arch/x86/xen.lds.S (I hope that this > change does not invalidate Jan's ACK). Looks okay. But there's one more thing: > @@ -309,6 +312,9 @@ int efi_runtime_call(struct xenpf_efi_runtime_call *op) > EFI_STATUS status = EFI_NOT_STARTED; > int rc = 0; > > + if ( !efi_enabled(EFI_RS) ) > + return -ENOSYS; I think this should be two checks: if ( !efi_enabled(EFI_BOOT) ) return -ENOSYS; if ( !efi_enabled(EFI_RS) ) return -EOPNOTSUPP; Jan
diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index b18f033..71ec34e 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -211,7 +211,7 @@ efi/mkreloc: efi/mkreloc.c clean:: rm -f asm-offsets.s *.lds boot/*.o boot/*~ boot/core boot/mkelf32 rm -f $(BASEDIR)/.xen-syms.[0-9]* boot/.*.d - rm -f $(BASEDIR)/.xen.efi.[0-9]* efi/*.o efi/.*.d efi/*.efi efi/disabled efi/mkreloc + rm -f $(BASEDIR)/.xen.efi.[0-9]* efi/*.efi efi/disabled efi/mkreloc rm -f boot/reloc.S boot/reloc.lnk boot/reloc.bin rm -f note.o $(MAKE) -f $(BASEDIR)/Rules.mk -C test clean diff --git a/xen/arch/x86/efi/Makefile b/xen/arch/x86/efi/Makefile index 5099430..2a7d3e5 100644 --- a/xen/arch/x86/efi/Makefile +++ b/xen/arch/x86/efi/Makefile @@ -1,14 +1,9 @@ CFLAGS += -fshort-wchar -obj-y += stub.o - -create = test -e $(1) || touch -t 199901010000 $(1) - efi := y$(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 - -stub.o: $(extra-y) +obj-y := stub.o +obj-$(efi) := boot.init.o compat.o relocs-dummy.o runtime.o diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 2d1d43d..40eb4c5 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -262,10 +262,10 @@ SECTIONS .pad : { . = ALIGN(MB(16)); } :text -#else - efi = .; #endif + efi = DEFINED(efi) ? efi : .; + /* Sections to be discarded */ /DISCARD/ : { *(.exit.text) diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c index d7c484e..48ef8ad 100644 --- a/xen/common/efi/boot.c +++ b/xen/common/efi/boot.c @@ -1249,6 +1249,9 @@ void __init efi_init_memory(void) } *extra, *extra_head = NULL; #endif + if ( !efi_enabled(EFI_BOOT) ) + return; + printk(XENLOG_INFO "EFI memory map:%s\n", map_bs ? " (mapping BootServices)" : ""); for ( i = 0; i < efi_memmap_size; i += efi_mdesc_size ) diff --git a/xen/common/efi/runtime.c b/xen/common/efi/runtime.c index 6bffda0..64c632c 100644 --- a/xen/common/efi/runtime.c +++ b/xen/common/efi/runtime.c @@ -175,6 +175,9 @@ int efi_get_info(uint32_t idx, union xenpf_efi_info *info) { unsigned int i, n; + if ( !efi_enabled(EFI_BOOT) ) + return -ENOSYS; + switch ( idx ) { case XEN_FW_EFI_VERSION: @@ -309,6 +312,9 @@ int efi_runtime_call(struct xenpf_efi_runtime_call *op) EFI_STATUS status = EFI_NOT_STARTED; int rc = 0; + if ( !efi_enabled(EFI_RS) ) + return -ENOSYS; + switch ( op->function ) { case XEN_EFI_get_time: