[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 8/8] efi: drop original xen.efi code and build mechanism
Then rename xen.mb.efi to xen.efi and drop all related differentiators in the code. Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx> --- xen/Makefile | 16 +- xen/arch/arm/efi/efi-boot.h | 4 - xen/arch/x86/Makefile | 87 +-------- xen/arch/x86/boot/head.S | 2 +- xen/arch/x86/efi/Makefile | 17 +- xen/arch/x86/efi/buildid.ihex | 3 - xen/arch/x86/efi/check.c | 4 - xen/arch/x86/efi/efi-boot.h | 88 +-------- xen/arch/x86/efi/mkreloc.c | 384 --------------------------------------- xen/arch/x86/efi/relocs-dummy.S | 11 -- xen/arch/x86/efi/stub.c | 97 ---------- xen/arch/x86/xen.lds.S | 81 +-------- xen/common/efi/boot.c | 2 - xen/common/version.c | 51 ------ xen/include/xen/efi.h | 1 - 15 files changed, 21 insertions(+), 827 deletions(-) delete mode 100644 xen/arch/x86/efi/buildid.ihex delete mode 100644 xen/arch/x86/efi/check.c delete mode 100644 xen/arch/x86/efi/mkreloc.c delete mode 100644 xen/arch/x86/efi/relocs-dummy.S delete mode 100644 xen/arch/x86/efi/stub.c diff --git a/xen/Makefile b/xen/Makefile index a49b9b7..0c03914 100644 --- a/xen/Makefile +++ b/xen/Makefile @@ -61,20 +61,17 @@ _install: $(TARGET)$(CONFIG_XEN_INSTALL_SUFFIX) ln -f -s $(T)-$(XEN_FULLVERSION)$(Z) $(D)$(BOOT_DIR)/$(T)-$(XEN_VERSION).$(XEN_SUBVERSION)$(Z) ln -f -s $(T)-$(XEN_FULLVERSION)$(Z) $(D)$(BOOT_DIR)/$(T)-$(XEN_VERSION)$(Z) ln -f -s $(T)-$(XEN_FULLVERSION)$(Z) $(D)$(BOOT_DIR)/$(T)$(Z) - $(INSTALL_DATA) $(TARGET).mb.efi $(D)$(BOOT_DIR)/$(T)-$(XEN_FULLVERSION).mb.efi - ln -f -s $(T)-$(XEN_FULLVERSION).mb.efi $(D)$(BOOT_DIR)/$(T)-$(XEN_VERSION).$(XEN_SUBVERSION).mb.efi - ln -f -s $(T)-$(XEN_FULLVERSION).mb.efi $(D)$(BOOT_DIR)/$(T)-$(XEN_VERSION).mb.efi - ln -f -s $(T)-$(XEN_FULLVERSION).mb.efi $(D)$(BOOT_DIR)/$(T).mb.efi + $(INSTALL_DATA) $(TARGET).efi $(D)$(BOOT_DIR)/$(T)-$(XEN_FULLVERSION).efi + ln -f -s $(T)-$(XEN_FULLVERSION).efi $(D)$(BOOT_DIR)/$(T)-$(XEN_VERSION).$(XEN_SUBVERSION).efi + ln -f -s $(T)-$(XEN_FULLVERSION).efi $(D)$(BOOT_DIR)/$(T)-$(XEN_VERSION).efi + ln -f -s $(T)-$(XEN_FULLVERSION).efi $(D)$(BOOT_DIR)/$(T).efi [ -d "$(D)$(DEBUG_DIR)" ] || $(INSTALL_DIR) $(D)$(DEBUG_DIR) $(INSTALL_DATA) $(TARGET)-syms $(D)$(DEBUG_DIR)/$(T)-syms-$(XEN_FULLVERSION) $(INSTALL_DATA) $(TARGET)-syms.map $(D)$(DEBUG_DIR)/$(T)-syms-$(XEN_FULLVERSION).map $(INSTALL_DATA) $(KCONFIG_CONFIG) $(D)$(BOOT_DIR)/$(T)-$(XEN_FULLVERSION).config - if [ -r $(TARGET).efi -a -n '$(EFI_DIR)' ]; then \ + if [ -n '$(EFI_DIR)' ]; then \ [ -d $(D)$(EFI_DIR) ] || $(INSTALL_DIR) $(D)$(EFI_DIR); \ $(INSTALL_DATA) $(TARGET).efi $(D)$(EFI_DIR)/$(T)-$(XEN_FULLVERSION).efi; \ - if [ -e $(TARGET).efi.map ]; then \ - $(INSTALL_DATA) $(TARGET).efi.map $(D)$(DEBUG_DIR)/$(T)-$(XEN_FULLVERSION).efi.map; \ - fi; \ ln -sf $(T)-$(XEN_FULLVERSION).efi $(D)$(EFI_DIR)/$(T)-$(XEN_VERSION).$(XEN_SUBVERSION).efi; \ ln -sf $(T)-$(XEN_FULLVERSION).efi $(D)$(EFI_DIR)/$(T)-$(XEN_VERSION).efi; \ ln -sf $(T)-$(XEN_FULLVERSION).efi $(D)$(EFI_DIR)/$(T).efi; \ @@ -103,7 +100,6 @@ _uninstall: rm -f $(D)$(DEBUG_DIR)/$(T)-syms-$(XEN_FULLVERSION).map rm -f $(D)$(EFI_DIR)/$(T)-$(XEN_FULLVERSION).efi rm -f $(D)$(EFI_DIR)/$(T)-$(XEN_VERSION).$(XEN_SUBVERSION).efi - rm -f $(D)$(DEBUG_DIR)/$(T)-$(XEN_FULLVERSION).efi.map rm -f $(D)$(EFI_DIR)/$(T)-$(XEN_VERSION).efi rm -f $(D)$(EFI_DIR)/$(T).efi rm -f $(D)$(EFI_MOUNTPOINT)/efi/$(EFI_VENDOR)/$(T)-$(XEN_FULLVERSION).efi @@ -125,7 +121,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).mb.efi $(TARGET).efi.map $(TARGET)-syms $(TARGET)-syms.map *~ core + rm -f include/asm $(TARGET) $(TARGET).gz $(TARGET).efi $(TARGET)-syms $(TARGET)-syms.map *~ core rm -f include/asm-*/asm-offsets.h rm -f .banner diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h index ca655ff..0495150 100644 --- a/xen/arch/arm/efi/efi-boot.h +++ b/xen/arch/arm/efi/efi-boot.h @@ -341,10 +341,6 @@ static void __init *fdt_increase_size(struct file *fdtfile, int add_size) return new_fdt; } -static void __init efi_arch_relocate_image(unsigned long delta) -{ -} - static void __init efi_arch_process_memory_map(EFI_SYSTEM_TABLE *SystemTable, void *map, UINTN map_size, diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index ef3fb51..92c38fe 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -74,10 +74,6 @@ obj-y += xstate.o x86_emulate.o: x86_emulate/x86_emulate.c x86_emulate/x86_emulate.h -efi-y := $(shell if [ ! -r $(BASEDIR)/include/xen/compile.h -o \ - -O $(BASEDIR)/include/xen/compile.h ]; then \ - echo '$(TARGET).efi'; fi) - ifneq ($(build_id_linker),) notes_phdrs = --notes else @@ -98,12 +94,12 @@ endif syms-warn-dup-y := --warn-dup syms-warn-dup-$(CONFIG_SUPPRESS_DUPLICATE_SYMBOL_WARNINGS) := -$(TARGET): $(TARGET)-syms $(efi-y) boot/mkelf32 +$(TARGET): $(TARGET)-syms boot/mkelf32 ./boot/mkelf32 $(notes_phdrs) $(TARGET)-syms $(TARGET) $(XEN_IMG_OFFSET) \ `$(NM) $(TARGET)-syms | sed -ne 's/^\([^ ]*\) . __2M_rwdata_end$$/0x\1/p'` $(OBJCOPY) -O binary -S --change-section-address \ ".efi.pe.header-`$(NM) $(TARGET)-syms | sed -ne 's/^\([^ ]*\) . __image_base__$$/0x\1/p'`" \ - $(TARGET)-syms $(TARGET).mb.efi + $(TARGET)-syms $(TARGET).efi ALL_OBJS := $(BASEDIR)/arch/x86/boot/built_in.o $(BASEDIR)/arch/x86/efi/built_in.o $(ALL_OBJS) @@ -112,21 +108,12 @@ ifeq ($(CONFIG_LTO),y) prelink_lto.o: $(ALL_OBJS) $(LD_LTO) -r -o $@ $^ -prelink-efi_lto.o: $(ALL_OBJS) efi/runtime.o efi/compat.o - $(guard) $(LD_LTO) -r -o $@ $(filter-out %/efi/built_in.o,$^) - # Link it with all the binary objects 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 - $(guard) $(LD) $(LDFLAGS) -r -o $@ $^ else prelink.o: $(ALL_OBJS) $(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,$^) endif $(BASEDIR)/common/symbols-dummy.o: @@ -152,66 +139,6 @@ $(TARGET)-syms: prelink.o xen.lds $(BASEDIR)/common/symbols-dummy.o >$(@D)/$(@F).map rm -f $(@D)/.$(@F).[0-9]* -note.o: $(TARGET)-syms - $(OBJCOPY) -O binary --only-section=.note.gnu.build-id $(BASEDIR)/xen-syms $@.bin - $(OBJCOPY) -I binary -O elf64-x86-64 -B i386:x86-64 \ - --rename-section=.data=.note.gnu.build-id -S $@.bin $@ - rm -f $@.bin - -EFI_LDFLAGS = $(patsubst -m%,-mi386pep,$(LDFLAGS)) --subsystem=10 -EFI_LDFLAGS += --image-base=$(1) --stack=0,0 --heap=0,0 --strip-debug -EFI_LDFLAGS += --section-alignment=0x200000 --file-alignment=0x20 -EFI_LDFLAGS += --major-image-version=$(XEN_VERSION) -EFI_LDFLAGS += --minor-image-version=$(XEN_SUBVERSION) -EFI_LDFLAGS += --major-os-version=2 --minor-os-version=0 -EFI_LDFLAGS += --major-subsystem-version=2 --minor-subsystem-version=0 - -$(TARGET).efi: VIRT_BASE = 0x$(shell $(NM) efi/relocs-dummy.o | sed -n 's, A VIRT_START$$,,p') -$(TARGET).efi: ALT_BASE = 0x$(shell $(NM) efi/relocs-dummy.o | sed -n 's, A ALT_START$$,,p') -# Don't use $(wildcard ...) here - at least make 3.80 expands this too early! -$(TARGET).efi: guard = $(if $(shell echo efi/dis* | grep disabled),:) - -ifneq ($(build_id_linker),) -ifeq ($(call ld-ver-build-id,$(LD) $(filter -m%,$(EFI_LDFLAGS))),y) -CFLAGS += -DBUILD_ID_EFI -EFI_LDFLAGS += $(build_id_linker) -note_file := efi/buildid.o -# NB: this must be the last input in the linker call, because inputs following -# the -b option will all be treated as being in the specified format. -note_file_option := -b pe-x86-64 $(note_file) -else -note_file := note.o -endif -else -note_file := -endif -note_file_option ?= $(note_file) - -$(TARGET).efi: prelink-efi.o $(note_file) efi.lds efi/relocs-dummy.o $(BASEDIR)/common/symbols-dummy.o efi/mkreloc - $(foreach base, $(VIRT_BASE) $(ALT_BASE), \ - $(guard) $(LD) $(call EFI_LDFLAGS,$(base)) -T efi.lds -N $< efi/relocs-dummy.o \ - $(BASEDIR)/common/symbols-dummy.o $(note_file_option) -o $(@D)/.$(@F).$(base).0 &&) : - $(guard) efi/mkreloc $(foreach base,$(VIRT_BASE) $(ALT_BASE),$(@D)/.$(@F).$(base).0) >$(@D)/.$(@F).0r.S - $(guard) $(NM) -pa --format=sysv $(@D)/.$(@F).$(VIRT_BASE).0 \ - | $(guard) $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort >$(@D)/.$(@F).0s.S - $(guard) $(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).0r.o $(@D)/.$(@F).0s.o - $(foreach base, $(VIRT_BASE) $(ALT_BASE), \ - $(guard) $(LD) $(call EFI_LDFLAGS,$(base)) -T efi.lds -N $< \ - $(@D)/.$(@F).0r.o $(@D)/.$(@F).0s.o $(note_file_option) -o $(@D)/.$(@F).$(base).1 &&) : - $(guard) efi/mkreloc $(foreach base,$(VIRT_BASE) $(ALT_BASE),$(@D)/.$(@F).$(base).1) >$(@D)/.$(@F).1r.S - $(guard) $(NM) -pa --format=sysv $(@D)/.$(@F).$(VIRT_BASE).1 \ - | $(guard) $(BASEDIR)/tools/symbols $(all_symbols) --sysv --sort >$(@D)/.$(@F).1s.S - $(guard) $(MAKE) -f $(BASEDIR)/Rules.mk $(@D)/.$(@F).1r.o $(@D)/.$(@F).1s.o - $(guard) $(LD) $(call EFI_LDFLAGS,$(VIRT_BASE)) -T efi.lds -N $< \ - $(@D)/.$(@F).1r.o $(@D)/.$(@F).1s.o $(note_file_option) -o $@ - if $(guard) false; then rm -f $@; echo 'EFI support disabled'; \ - else $(NM) -pa --format=sysv $(@D)/$(@F) \ - | $(BASEDIR)/tools/symbols --xensyms --sysv --sort >$(@D)/$(@F).map; fi - rm -f $(@D)/.$(@F).[0-9]* - -efi/boot.init.o efi/runtime.o efi/compat.o efi/buildid.o: $(BASEDIR)/arch/x86/efi/built_in.o -efi/boot.init.o efi/runtime.o efi/compat.o efi/buildid.o: ; - asm-offsets.s: $(TARGET_SUBARCH)/asm-offsets.c $(CC) $(filter-out -Wa$(comma)% -flto,$(CFLAGS)) -S -o $@ $< @@ -220,21 +147,11 @@ xen.lds: xen.lds.S sed -e 's/xen\.lds\.o:/xen\.lds:/g' <.xen.lds.d >.xen.lds.d.new mv -f .xen.lds.d.new .xen.lds.d -efi.lds: xen.lds.S - $(CC) -P -E -Ui386 -DEFI $(filter-out -Wa$(comma)%,$(AFLAGS)) -o $@ $< - sed -e 's/efi\.lds\.o:/efi\.lds:/g' <.$(@F).d >.$(@F).d.new - mv -f .$(@F).d.new .$(@F).d - boot/mkelf32: boot/mkelf32.c $(HOSTCC) $(HOSTCFLAGS) -o $@ $< -efi/mkreloc: efi/mkreloc.c - $(HOSTCC) $(HOSTCFLAGS) -g -o $@ $< - .PHONY: clean 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/*.efi efi/disabled efi/mkreloc rm -f boot/cmdline.S boot/reloc.S boot/*.lnk boot/*.bin - rm -f note.o diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S index 48f1b00..578461b 100644 --- a/xen/arch/x86/boot/head.S +++ b/xen/arch/x86/boot/head.S @@ -139,7 +139,7 @@ optional_header: .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(efi_start) /* AddressOfEntryPoint. */ .long sym_offs(start) /* BaseOfCode. */ .quad sym_offs(__image_base__) /* ImageBase. */ .long XEN_LOAD_ALIGN /* SectionAlignment. */ diff --git a/xen/arch/x86/efi/Makefile b/xen/arch/x86/efi/Makefile index 3be9661..61cb8f6 100644 --- a/xen/arch/x86/efi/Makefile +++ b/xen/arch/x86/efi/Makefile @@ -1,16 +1,5 @@ CFLAGS += -fshort-wchar -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) - -%.o: %.ihex - $(OBJCOPY) -I ihex -O binary $< $@ - -boot.init.o: buildid.o - -obj-y := stub.o -obj-$(efi) := boot.init.o compat.o relocs-dummy.o runtime.o -extra-$(efi) += buildid.o -nocov-$(efi) += stub.o +obj-y += boot.init.o +obj-y += compat.o +obj-y += runtime.o diff --git a/xen/arch/x86/efi/buildid.ihex b/xen/arch/x86/efi/buildid.ihex deleted file mode 100644 index a89046d..0000000 --- a/xen/arch/x86/efi/buildid.ihex +++ /dev/null @@ -1,3 +0,0 @@ -:10000000648600004D8DAD57140000000000000014 -:0400100000000000EC -:00000001FF diff --git a/xen/arch/x86/efi/check.c b/xen/arch/x86/efi/check.c deleted file mode 100644 index 7fedd5a..0000000 --- a/xen/arch/x86/efi/check.c +++ /dev/null @@ -1,4 +0,0 @@ -int __attribute__((__ms_abi__)) test(int i) -{ - return i; -} diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h index f8aaa37..25a82f4 100644 --- a/xen/arch/x86/efi/efi-boot.h +++ b/xen/arch/x86/efi/efi-boot.h @@ -35,75 +35,6 @@ static void __init edd_put_string(u8 *dst, size_t n, const char *src) extern intpte_t __page_tables_start[], __page_tables_end[]; -#define in_page_tables(v) ((intpte_t *)(v) >= __page_tables_start && \ - (intpte_t *)(v) < __page_tables_end) - -#define PE_BASE_RELOC_ABS 0 -#define PE_BASE_RELOC_HIGHLOW 3 -#define PE_BASE_RELOC_DIR64 10 - -extern const struct pe_base_relocs { - u32 rva; - u32 size; - u16 entries[]; -} __base_relocs_start[], __base_relocs_end[]; - -static void __init efi_arch_relocate_image(unsigned long delta) -{ - const struct pe_base_relocs *base_relocs; - - if ( efi_enabled(EFI_MB_LOADER) ) - return; - - for ( base_relocs = __base_relocs_start; base_relocs < __base_relocs_end; ) - { - unsigned int i = 0, n; - - n = (base_relocs->size - sizeof(*base_relocs)) / - sizeof(*base_relocs->entries); - - /* - * Relevant l{2,3}_bootmap entries get initialized explicitly in - * efi_arch_memory_setup(), so we must not apply relocations there. - * l2_identmap's first slot, otoh, should be handled normally, as - * efi_arch_memory_setup() won't touch it (xen_phys_start should - * never be zero). - */ - if ( xen_phys_start + base_relocs->rva == (unsigned long)l3_bootmap || - xen_phys_start + base_relocs->rva == (unsigned long)l2_bootmap ) - i = n; - - for ( ; i < n; ++i ) - { - unsigned long addr = xen_phys_start + base_relocs->rva + - (base_relocs->entries[i] & 0xfff); - - switch ( base_relocs->entries[i] >> 12 ) - { - case PE_BASE_RELOC_ABS: - break; - case PE_BASE_RELOC_HIGHLOW: - if ( delta ) - { - *(u32 *)addr += delta; - if ( in_page_tables(addr) ) - *(u32 *)addr += xen_phys_start; - } - break; - case PE_BASE_RELOC_DIR64: - if ( in_page_tables(addr) ) - blexit(L"Unexpected relocation type"); - if ( delta ) - *(u64 *)addr += delta; - break; - default: - blexit(L"Unsupported relocation type"); - } - } - base_relocs = (const void *)(base_relocs->entries + i + (i & 1)); - } -} - extern const s32 __trampoline_rel_start[], __trampoline_rel_stop[]; extern const s32 __trampoline_seg_start[], __trampoline_seg_stop[]; @@ -237,7 +168,6 @@ static void __init noreturn efi_arch_post_exit_boot(void) { u64 cr4 = XEN_MINIMAL_CR4 & ~X86_CR4_PGE, efer; - efi_arch_relocate_image(__XEN_VIRT_START - xen_phys_start); memcpy((void *)trampoline_phys, trampoline_start, cfg.size); /* Set system registers and transfer control. */ @@ -589,11 +519,10 @@ 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 ) - if ( get_pte_flags(*pte) & _PAGE_PRESENT ) - *pte += xen_phys_start; + for ( pte = __page_tables_start; pte < __page_tables_end; + pte += ( pte != (intpte_t *)l2_identmap ) ? 1 : 4 * L2_PAGETABLE_ENTRIES ) + if ( get_pte_flags(*pte) & _PAGE_PRESENT ) + *pte += xen_phys_start; /* Initialise L2 identity-map and boot-map page table entries (16MB). */ for ( i = 0; i < 8; ++i ) @@ -687,15 +616,6 @@ static bool __init efi_arch_use_config_file(EFI_SYSTEM_TABLE *SystemTable) static void __init efi_arch_flush_dcache_area(const void *vaddr, UINTN size) { } -void EFIAPI efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable); - -void EFIAPI __init noreturn -efi_mb_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) -{ - __set_bit(EFI_MB_LOADER, &efi_flags); - efi_start(ImageHandle, SystemTable); -} - void __init efi_multiboot2(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable, const multiboot2_tag_module_t *dom0_kernel) diff --git a/xen/arch/x86/efi/mkreloc.c b/xen/arch/x86/efi/mkreloc.c deleted file mode 100644 index 1aca796..0000000 --- a/xen/arch/x86/efi/mkreloc.c +++ /dev/null @@ -1,384 +0,0 @@ -#include <fcntl.h> -#include <inttypes.h> -#include <limits.h> -#include <stddef.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/mman.h> -#include <unistd.h> - -struct mz_hdr { - uint16_t signature; -#define MZ_SIGNATURE 0x5a4d - uint16_t last_page_size; - uint16_t page_count; - uint16_t relocation_count; - uint16_t header_paras; - uint16_t min_paras; - uint16_t max_paras; - uint16_t entry_ss; - uint16_t entry_sp; - uint16_t checksum; - uint16_t entry_ip; - uint16_t entry_cs; - uint16_t relocations; - uint16_t overlay; - uint8_t reserved[32]; - uint32_t extended_header_base; -}; - -struct pe_hdr { - uint32_t signature; -#define PE_SIGNATURE 0x00004550 - uint16_t cpu; - uint16_t section_count; - int32_t timestamp; - uint32_t symbols_file_offset; - uint32_t symbol_count; - uint16_t opt_hdr_size; - uint16_t flags; - struct { - uint16_t magic; -#define PE_MAGIC_EXE32 0x010b -#define PE_MAGIC_EXE32PLUS 0x020b - uint8_t linker_major, linker_minor; - uint32_t code_size, data_size, bss_size; - uint32_t entry_rva, code_rva, data_rva; - } opt_hdr; -}; - -#define PE_PAGE_SIZE 0x1000 - -#define PE_BASE_RELOC_ABS 0 -#define PE_BASE_RELOC_HIGHLOW 3 -#define PE_BASE_RELOC_DIR64 10 - -struct coff_section { - char name[8]; - uint32_t size; - uint32_t rva; - uint32_t file_size; - uint32_t file_offset; - uint32_t relocation_file_offset; - uint32_t line_number_file_offset; - uint16_t relocation_count; - uint16_t line_number_count; - uint32_t flags; -#define COFF_SECTION_BSS 0x00000080U -#define COFF_SECTION_DISCARDABLE 0x02000000U -#define COFF_SECTION_WRITEABLE 0x80000000U -}; - -static void usage(const char *cmd, int rc) -{ - fprintf(rc ? stderr : stdout, - "Usage: %s <image1> <image2>\n", - cmd); - exit(rc); -} - -static unsigned int load(const char *name, int *handle, - struct coff_section **sections, - uint_fast64_t *image_base, - uint32_t *image_size, - unsigned int *width) -{ - int in = open(name, O_RDONLY); - struct mz_hdr mz_hdr; - struct pe_hdr pe_hdr; - uint32_t base; - - if ( in < 0 || - read(in, &mz_hdr, sizeof(mz_hdr)) != sizeof(mz_hdr) ) - { - perror(name); - exit(2); - } - if ( mz_hdr.signature != MZ_SIGNATURE || - mz_hdr.relocations < sizeof(mz_hdr) || - !mz_hdr.extended_header_base ) - { - fprintf(stderr, "%s: Wrong DOS file format\n", name); - exit(2); - } - - if ( lseek(in, mz_hdr.extended_header_base, SEEK_SET) < 0 || - read(in, &pe_hdr, sizeof(pe_hdr)) != sizeof(pe_hdr) || - read(in, &base, sizeof(base)) != sizeof(base) || - /* - * Luckily the image size field lives at the - * same offset for both formats. - */ - lseek(in, 24, SEEK_CUR) < 0 || - read(in, image_size, sizeof(*image_size)) != sizeof(*image_size) ) - { - perror(name); - exit(3); - } - switch ( (pe_hdr.signature == PE_SIGNATURE && - pe_hdr.opt_hdr_size > sizeof(pe_hdr.opt_hdr)) * - pe_hdr.opt_hdr.magic ) - { - case PE_MAGIC_EXE32: - *width = 32; - *image_base = base; - break; - case PE_MAGIC_EXE32PLUS: - *width = 64; - *image_base = ((uint64_t)base << 32) | pe_hdr.opt_hdr.data_rva; - break; - default: - fprintf(stderr, "%s: Wrong PE file format\n", name); - exit(3); - } - - *sections = malloc(pe_hdr.section_count * sizeof(**sections)); - if ( !*sections ) - { - perror(NULL); - exit(4); - } - if ( lseek(in, - mz_hdr.extended_header_base + offsetof(struct pe_hdr, opt_hdr) + - pe_hdr.opt_hdr_size, - SEEK_SET) < 0 || - read(in, *sections, pe_hdr.section_count * sizeof(**sections)) != - pe_hdr.section_count * sizeof(**sections) ) - { - perror(name); - exit(4); - } - - *handle = in; - - return pe_hdr.section_count; -} - -static long page_size; - -static const void *map_section(const struct coff_section *sec, int in, - const char *name) -{ - const char *ptr; - unsigned long offs; - - if ( !page_size ) - page_size = sysconf(_SC_PAGESIZE); - offs = sec->file_offset & (page_size - 1); - - ptr = mmap(0, offs + sec->file_size, PROT_READ, MAP_PRIVATE, in, - sec->file_offset - offs); - if ( ptr == MAP_FAILED ) - { - perror(name); - exit(6); - } - - return ptr + offs; -} - -static void unmap_section(const void *ptr, const struct coff_section *sec) -{ - unsigned long offs = sec->file_offset & (page_size - 1); - - munmap((char *)ptr - offs, offs + sec->file_size); -} - -static void diff_sections(const unsigned char *ptr1, const unsigned char *ptr2, - const struct coff_section *sec, - int_fast64_t diff, unsigned int width, - uint_fast64_t base, uint_fast64_t end) -{ - static uint_fast32_t cur_rva, reloc_size; - unsigned int disp = 0; - uint_fast32_t i; - - if ( !sec ) - { - reloc_size += reloc_size & 2; - if ( reloc_size ) - printf("\t.balign 4\n" - "\t.equ rva_%08" PRIxFAST32 "_relocs, %#08" PRIxFAST32 "\n", - cur_rva, reloc_size); - return; - } - - while ( !(diff & (((int_fast64_t)1 << ((disp + 1) * CHAR_BIT)) - 1)) ) - ++disp; - - for ( i = 0; i < sec->file_size; ++i ) - { - uint_fast32_t rva; - union { - uint32_t u32; - uint64_t u64; - } val1, val2; - int_fast64_t delta; - unsigned int reloc = (width == 4 ? PE_BASE_RELOC_HIGHLOW : - PE_BASE_RELOC_DIR64); - - if ( ptr1[i] == ptr2[i] ) - continue; - - if ( i < disp || i + width - disp > sec->file_size ) - { - fprintf(stderr, - "Bogus difference at %.8s:%08" PRIxFAST32 "\n", - sec->name, i); - exit(3); - } - - memcpy(&val1, ptr1 + i - disp, width); - memcpy(&val2, ptr2 + i - disp, width); - delta = width == 4 ? val2.u32 - val1.u32 : val2.u64 - val1.u64; - if ( delta != diff ) - { - fprintf(stderr, - "Difference at %.8s:%08" PRIxFAST32 " is %#" PRIxFAST64 - " (expected %#" PRIxFAST64 ")\n", - sec->name, i, delta, diff); - continue; - } - if ( width == 8 && (val1.u64 < base || val1.u64 > end) ) - reloc = PE_BASE_RELOC_HIGHLOW; - - rva = (sec->rva + i - disp) & ~(PE_PAGE_SIZE - 1); - if ( rva > cur_rva ) - { - reloc_size += reloc_size & 2; - if ( reloc_size ) - printf("\t.equ rva_%08" PRIxFAST32 "_relocs," - " %#08" PRIxFAST32 "\n", - cur_rva, reloc_size); - printf("\t.balign 4\n" - "\t.long %#08" PRIxFAST32 "," - " rva_%08" PRIxFAST32 "_relocs\n", - rva, rva); - cur_rva = rva; - reloc_size = 8; - } - else if ( rva != cur_rva ) - { - fprintf(stderr, - "Cannot handle decreasing RVA (at %.8s:%08" PRIxFAST32 ")\n", - sec->name, i); - exit(3); - } - - if ( !(sec->flags & COFF_SECTION_WRITEABLE) ) - fprintf(stderr, - "Warning: relocation to r/o section %.8s:%08" PRIxFAST32 "\n", - sec->name, i); - - printf("\t.word (%u << 12) | 0x%03" PRIxFAST32 "\n", - reloc, sec->rva + i - disp - rva); - reloc_size += 2; - i += width - disp - 1; - } -} - -int main(int argc, char *argv[]) -{ - int in1, in2; - unsigned int i, nsec, width1, width2; - uint_fast64_t base1, base2; - uint32_t size1, size2; - struct coff_section *sec1, *sec2; - - if ( argc == 1 || - !strcmp(argv[1], "-?") || - !strcmp(argv[1], "-h") || - !strcmp(argv[1], "--help") ) - usage(*argv, argc == 1); - - if ( argc != 3 ) - usage(*argv, 1); - - nsec = load(argv[1], &in1, &sec1, &base1, &size1, &width1); - if ( nsec != load(argv[2], &in2, &sec2, &base2, &size2, &width2) ) - { - fputs("Mismatched section counts\n", stderr); - return 5; - } - if ( width1 != width2 ) - { - fputs("Mismatched image types\n", stderr); - return 5; - } - width1 >>= 3; - if ( base1 == base2 ) - { - fputs("Images must have different base addresses\n", stderr); - return 5; - } - if ( size1 != size2 ) - { - fputs("Images must have identical sizes\n", stderr); - return 5; - } - - puts("\t.section .reloc, \"a\", @progbits\n" - "\t.balign 4\n" - "\t.globl __base_relocs_start, __base_relocs_end\n" - "__base_relocs_start:"); - - for ( i = 0; i < nsec; ++i ) - { - const void *ptr1, *ptr2; - - if ( memcmp(sec1[i].name, sec2[i].name, sizeof(sec1[i].name)) || - sec1[i].rva != sec2[i].rva || - sec1[i].size != sec2[i].size || - sec1[i].file_size != sec2[i].file_size || - sec1[i].flags != sec2[i].flags ) - { - fprintf(stderr, "Mismatched section %u parameters\n", i); - return 5; - } - - if ( !sec1[i].size || - (sec1[i].flags & (COFF_SECTION_DISCARDABLE|COFF_SECTION_BSS)) ) - continue; - - /* - * Don't generate relocations for sections that definitely - * aren't used by the boot loader code. - */ - if ( memcmp(sec1[i].name, ".initcal", sizeof(sec1[i].name)) == 0 || - memcmp(sec1[i].name, ".init.se", sizeof(sec1[i].name)) == 0 || - memcmp(sec1[i].name, ".buildid", sizeof(sec1[i].name)) == 0 || - memcmp(sec1[i].name, ".lockpro", sizeof(sec1[i].name)) == 0 ) - continue; - - if ( !sec1[i].rva ) - { - fprintf(stderr, "Can't handle section %u with zero RVA\n", i); - return 3; - } - - if ( sec1[i].file_size > sec1[i].size ) - { - sec1[i].file_size = sec1[i].size; - sec2[i].file_size = sec2[i].size; - } - ptr1 = map_section(sec1 + i, in1, argv[1]); - ptr2 = map_section(sec2 + i, in2, argv[2]); - - diff_sections(ptr1, ptr2, sec1 + i, base2 - base1, width1, - base1, base1 + size1); - - unmap_section(ptr1, sec1 + i); - unmap_section(ptr2, sec2 + i); - } - - diff_sections(NULL, NULL, NULL, 0, 0, 0, 0); - - puts("__base_relocs_end:"); - - close(in1); - close(in2); - - return 0; -} diff --git a/xen/arch/x86/efi/relocs-dummy.S b/xen/arch/x86/efi/relocs-dummy.S deleted file mode 100644 index d928a82..0000000 --- a/xen/arch/x86/efi/relocs-dummy.S +++ /dev/null @@ -1,11 +0,0 @@ - - .section .reloc, "a", @progbits - .balign 4 -GLOBAL(__base_relocs_start) - .long 0 - .long 8 -GLOBAL(__base_relocs_end) - - .globl VIRT_START, ALT_START - .equ VIRT_START, XEN_VIRT_START - .equ ALT_START, XEN_VIRT_END diff --git a/xen/arch/x86/efi/stub.c b/xen/arch/x86/efi/stub.c deleted file mode 100644 index 5918536..0000000 --- a/xen/arch/x86/efi/stub.c +++ /dev/null @@ -1,97 +0,0 @@ -#include <xen/types.h> -#include <xen/efi.h> -#include <xen/errno.h> -#include <xen/init.h> -#include <xen/lib.h> -#include <xen/multiboot2.h> -#include <asm/page.h> -#include <asm/efibind.h> -#include <efi/efidef.h> -#include <efi/eficapsule.h> -#include <efi/eficon.h> -#include <efi/efidevp.h> -#include <efi/efiapi.h> - -/* - * Here we are in EFI stub. EFI calls are not supported due to lack - * of relevant functionality in compiler and/or linker. - * - * efi_mb_start() and efi_multiboot2() are the exceptions. - * Please look below for more details. - */ - -asm ( - " .text \n" - " .globl efi_mb_start \n" - "efi_mb_start: \n" - " mov %rcx,%rdi \n" - " mov %rdx,%rsi \n" - " xor %rdx,%rdx \n" - " call efi_multiboot2 \n" - ); - -void __init noreturn efi_multiboot2(EFI_HANDLE ImageHandle, - EFI_SYSTEM_TABLE *SystemTable, - const multiboot2_tag_module_t *dom0_kernel) -{ - static const CHAR16 __initconst err[] = - L"Xen does not have EFI code build in!\r\nSystem halted!\r\n"; - SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr; - - StdErr = SystemTable->StdErr ? SystemTable->StdErr : SystemTable->ConOut; - - /* - * Print error message and halt the system. - * - * We have to open code MS x64 calling convention - * in assembly because here this convention may - * not be directly supported by C compiler. - */ - asm volatile( - " call *%3 \n" - "0: hlt \n" - " jmp 0b \n" - : "+c" (StdErr), "=d" (StdErr) : "1" (err), "rm" (StdErr->OutputString) - : "rax", "r8", "r9", "r10", "r11", "memory"); - - unreachable(); -} - -bool efi_enabled(unsigned int feature) -{ - return false; -} - -void __init efi_init_memory(void) { } - -void efi_update_l4_pgtable(unsigned int l4idx, l4_pgentry_t l4e) { } - -bool efi_rs_using_pgtables(void) -{ - return false; -} - -unsigned long efi_get_time(void) -{ - BUG(); - return 0; -} - -void efi_halt_system(void) { } -void efi_reset_system(bool warm) { } - -int efi_get_info(uint32_t idx, union xenpf_efi_info *info) -{ - return -ENOSYS; -} - -int efi_compat_get_info(uint32_t idx, union compat_pf_efi_info *) - __attribute__((__alias__("efi_get_info"))); - -int efi_runtime_call(struct xenpf_efi_runtime_call *op) -{ - return -ENOSYS; -} - -int efi_compat_runtime_call(struct compat_pf_efi_runtime_call *) - __attribute__((__alias__("efi_runtime_call"))); diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 1e5233a..43e0799 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -7,26 +7,12 @@ #undef ENTRY #undef ALIGN -#ifdef EFI - -#define FORMAT "pei-x86-64" -#undef __XEN_VIRT_START -#define __XEN_VIRT_START __image_base__ -#define SECTION_ALIGN MB(2) -#define DECL_SECTION(x) x : - -ENTRY(efi_start) - -#else /* !EFI */ - #define FORMAT "elf64-x86-64" #define SECTION_ALIGN PAGE_SIZE #define DECL_SECTION(x) x : AT(ADDR(x) - __XEN_VIRT_START) ENTRY(start_pa) -#endif /* EFI */ - OUTPUT_FORMAT(FORMAT, FORMAT, FORMAT) OUTPUT_ARCH(i386:x86-64) @@ -34,18 +20,14 @@ OUTPUT_ARCH(i386:x86-64) PHDRS { text PT_LOAD ; -#if (defined(BUILD_ID) || defined (CONFIG_PVH_GUEST)) && !defined(EFI) +#if defined(BUILD_ID) || defined (CONFIG_PVH_GUEST) note PT_NOTE ; #endif } SECTIONS { -#if !defined(EFI) . = __XEN_VIRT_START; __image_base__ = .; -#else - . = __image_base__; -#endif #if 0 /* @@ -60,9 +42,6 @@ SECTIONS start_pa = ABSOLUTE(start - __XEN_VIRT_START); -#ifdef EFI - . = __XEN_VIRT_START + XEN_IMG_OFFSET; -#else /* * The PE header must be followed by .text section which * starts at __XEN_VIRT_START + XEN_IMG_OFFSET address. @@ -72,7 +51,6 @@ SECTIONS DECL_SECTION(.efi.pe.header) { *(.efi.pe.header) } :NONE -#endif _start = .; DECL_SECTION(.text) { @@ -117,16 +95,6 @@ SECTIONS *(.data.rel.ro) *(.data.rel.ro.*) -#if defined(BUILD_ID) && defined(EFI) && !defined(BUILD_ID_EFI) -/* - * No mechanism to put an PT_NOTE in the EFI file - so put - * it in .rodata section. (notes.o supplies us with .note.gnu.build-id). - */ - . = ALIGN(4); - __note_gnu_build_id_start = .; - *(.note.gnu.build-id) - __note_gnu_build_id_end = .; -#endif . = ALIGN(8); /* Exception table */ __start___ex_table = .; @@ -157,32 +125,23 @@ SECTIONS #endif } :text -#if defined(CONFIG_PVH_GUEST) && !defined(EFI) +#if defined(CONFIG_PVH_GUEST) DECL_SECTION(.note.Xen) { *(.note.Xen) } :note :text #endif #if defined(BUILD_ID) -#if !defined(EFI) /* - * What a strange section name. The reason is that on ELF builds this section - * is extracted to notes.o (which then is ingested in the EFI file). But the - * compiler may want to inject other things in the .note which we don't care - * about - hence this unique name. + * What a strange section name. The reason is that the compiler may want to + * inject other things in the .note which we don't care about - hence this + * unique name. */ DECL_SECTION(.note.gnu.build-id) { __note_gnu_build_id_start = .; *(.note.gnu.build-id) __note_gnu_build_id_end = .; } :note :text -#elif defined(BUILD_ID_EFI) - DECL_SECTION(.buildid) { - __note_gnu_build_id_start = .; - *(.buildid) - __note_gnu_build_id_end = .; - } :text -#endif #endif _erodata = .; @@ -192,11 +151,7 @@ SECTIONS __2M_init_start = .; /* Start of 2M superpages, mapped RWX (boot only). */ . = ALIGN(PAGE_SIZE); /* Init code and data */ __init_begin = .; -#ifdef EFI /* EFI wants to merge all of .init.* ELF doesn't. */ - DECL_SECTION(.init) { -#else DECL_SECTION(.init.text) { -#endif _sinittext = .; *(.init.text) /* @@ -207,12 +162,8 @@ SECTIONS *(.altinstr_replacement) _einittext = .; -#ifdef EFI /* EFI wants to merge all of .init.* ELF doesn't. */ - . = ALIGN(SMP_CACHE_BYTES); -#else } :text DECL_SECTION(.init.data) { -#endif *(.init.rodata) *(.init.rodata.rel) @@ -310,20 +261,6 @@ SECTIONS __pe_SizeOfImage = ALIGN(. - __image_base__, MB(16)); -#ifdef EFI - . = ALIGN(4); - .reloc : { - *(.reloc) - } :text - /* Trick the linker into setting the image size to exactly 16Mb. */ - . = ALIGN(__section_alignment__); - .pad : { - . = ALIGN(MB(16)); - } :text -#endif - - efi = DEFINED(efi) ? efi : .; - /* Sections to be discarded */ /DISCARD/ : { *(.exit.text) @@ -332,12 +269,6 @@ SECTIONS *(.discard) *(.discard.*) *(.eh_frame) -#ifdef EFI - *(.efi.pe.header) - *(.comment) - *(.comment.*) - *(.note.Xen) -#endif } /* Stabs debugging sections. */ @@ -381,11 +312,9 @@ ASSERT((trampoline_end - trampoline_start) < TRAMPOLINE_SPACE - MBI_SPACE_MIN, ASSERT((wakeup_stack - wakeup_stack_start) >= WAKEUP_STACK_MIN, "wakeup stack too small") -#ifndef EFI ASSERT(efi_pe_head_end == _start, "PE header does not end at the beginning of .text section") ASSERT(_start == __XEN_VIRT_START + XEN_IMG_OFFSET, ".text section begins at wrong address") ASSERT(IS_ALIGNED(_start, XEN_FILE_ALIGN), "_start misaligned") ASSERT(IS_ALIGNED(__bss_start, XEN_FILE_ALIGN), "__bss_start misaligned") ASSERT(IS_ALIGNED(__pe_SizeOfImage, XEN_LOAD_ALIGN), "__pe_SizeOfImage is not multiple of XEN_LOAD_ALIGN") ASSERT(XEN_LOAD_ALIGN >= XEN_FILE_ALIGN, "XEN_LOAD_ALIGN < XEN_FILE_ALIGN") -#endif diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c index 06bfadc..a11f97b 100644 --- a/xen/common/efi/boot.c +++ b/xen/common/efi/boot.c @@ -1160,8 +1160,6 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) PrintStr(L"Xen " __stringify(XEN_VERSION) "." __stringify(XEN_SUBVERSION) XEN_EXTRAVERSION " (c/s " XEN_CHANGESET ") EFI loader\r\n"); - efi_arch_relocate_image(0); - if ( use_cfg_file ) { EFI_FILE_HANDLE dir_handle; diff --git a/xen/common/version.c b/xen/common/version.c index 223cb52..3b4ff9a 100644 --- a/xen/common/version.c +++ b/xen/common/version.c @@ -4,7 +4,6 @@ #include <xen/lib.h> #include <xen/string.h> #include <xen/types.h> -#include <xen/efi.h> #include <xen/elf.h> #include <xen/version.h> @@ -118,28 +117,6 @@ int xen_build_id_check(const Elf_Note *n, unsigned int n_sz, return 0; } -struct pe_external_debug_directory -{ - uint32_t characteristics; - uint32_t time_stamp; - uint16_t major_version; - uint16_t minor_version; -#define PE_IMAGE_DEBUG_TYPE_CODEVIEW 2 - uint32_t type; - uint32_t size; - uint32_t rva_of_data; - uint32_t filepos_of_data; -}; - -struct cv_info_pdb70 -{ -#define CVINFO_PDB70_CVSIGNATURE 0x53445352 /* "RSDS" */ - uint32_t cv_signature; - unsigned char signature[16]; - uint32_t age; - char pdb_filename[]; -}; - static int __init xen_build_init(void) { const Elf_Note *n = __note_gnu_build_id_start; @@ -158,34 +135,6 @@ static int __init xen_build_init(void) rc = xen_build_id_check(n, sz, &build_id_p, &build_id_len); -#ifdef CONFIG_X86 - /* Alternatively we may have a CodeView record from an EFI build. */ - if ( rc && efi_enabled(EFI_LOADER) ) - { - const struct pe_external_debug_directory *dir = (const void *)n; - - /* - * Validate that the full-note-header check above won't prevent - * fall-through to the CodeView case here. - */ - BUILD_BUG_ON(sizeof(*n) > sizeof(*dir)); - - if ( sz > sizeof(*dir) + sizeof(struct cv_info_pdb70) && - dir->type == PE_IMAGE_DEBUG_TYPE_CODEVIEW && - dir->size > sizeof(struct cv_info_pdb70) && - XEN_VIRT_START + dir->rva_of_data == (unsigned long)(dir + 1) ) - { - const struct cv_info_pdb70 *info = (const void *)(dir + 1); - - if ( info->cv_signature == CVINFO_PDB70_CVSIGNATURE ) - { - build_id_p = info->signature; - build_id_len = sizeof(info->signature); - rc = 0; - } - } - } -#endif if ( !rc ) printk(XENLOG_INFO "build-id: %*phN\n", build_id_len, build_id_p); diff --git a/xen/include/xen/efi.h b/xen/include/xen/efi.h index 73f83c1..44b7d3e 100644 --- a/xen/include/xen/efi.h +++ b/xen/include/xen/efi.h @@ -11,7 +11,6 @@ extern unsigned int efi_flags; #define EFI_BOOT 0 /* Were we booted from EFI? */ #define EFI_LOADER 1 /* Were we booted directly from EFI loader? */ #define EFI_RS 2 /* Can we use runtime services? */ -#define EFI_MB_LOADER 4 /* xen.mb.efi booted directly from EFI loader? */ /* Add fields here only if they need to be referenced from non-EFI code. */ struct efi { -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |