From patchwork Thu Jan 19 03:52:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Douglas Goldstein X-Patchwork-Id: 9525135 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 27BD160459 for ; Thu, 19 Jan 2017 03:55:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 050382854A for ; Thu, 19 Jan 2017 03:55:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EDAE028657; Thu, 19 Jan 2017 03:55:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.6 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RCVD_IN_SORBS_SPAM,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5F9462861C for ; Thu, 19 Jan 2017 03:55:14 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cU3mZ-00053o-59; Thu, 19 Jan 2017 03:53:03 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cU3mX-00053A-Ge for xen-devel@lists.xen.org; Thu, 19 Jan 2017 03:53:01 +0000 Received: from [85.158.143.35] by server-9.bemta-6.messagelabs.com id F6/B5-27165-C1830885; Thu, 19 Jan 2017 03:53:00 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrPIsWRWlGSWpSXmKPExsVyMXThQV0Zi4Y Ig+dXWCyWfFzM4sDocXT3b6YAxijWzLyk/IoE1oynKyexFSzWqejZfYGtgXGhShcjF4eQwERG iUtzXjCDOCwC+5klGrv3s3cxcnJICCxjlTh4LATCjpG4e3o9I4RdJdGw+jIriC0koCDxe8IhJ ohJK5kkejbtZAFJsAloSDz5NYMNxBYRkJa49vkyI0gRs8BVJomNN24ygSSEBcwlGuedBZvEIq AqMevTArBmXoE4iWtzl7NAbJOXWHj+CFg9p0CqRF9rHwvE5hSJjTtus+MSn8AotICRYRWjRnF qUVlqka6RgV5SUWZ6RkluYmaOrqGBmV5uanFxYnpqTmJSsV5yfu4mRmAwMgDBDsZfywIOMUpy MCmJ8p7Tb4gQ4kvKT6nMSCzOiC8qzUktPsQow8GhJMHbbw6UEyxKTU+tSMvMAcYFTFqCg0dJh JcNJM1bXJCYW5yZDpE6xWjM0dN1+iUTx55dl18yCbHk5eelSonzsoCUCoCUZpTmwQ2CxeslRl kpYV5GoNOEeApSi3IzS1DlXzGKczAqCfOeMwOawpOZVwK37xXQKUxAp1gp14OcUpKIkJJqYCw 4evDAeuPUSMPfqy79uLjiyhyVgo47LDaRdwzLDQVu8IVJPLZiM13533PSduf43ZtvG/ceXMi8 JX/20Zh/mQoBKl/yWSbPfhJ9g3/b/MJAm7AXcf6O3Eu+py5aez05NVT/+8l9iu9tOq2LrmjsD z76UsEz67t76YdDX5fv/GnxbOKR/Mb462ZKLMUZiYZazEXFiQD43NjC0gIAAA== X-Env-Sender: cardoe@cardoe.com X-Msg-Ref: server-5.tower-21.messagelabs.com!1484797979!45427643!1 X-Originating-IP: [209.85.161.193] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.1.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 780 invoked from network); 19 Jan 2017 03:52:59 -0000 Received: from mail-yw0-f193.google.com (HELO mail-yw0-f193.google.com) (209.85.161.193) by server-5.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 19 Jan 2017 03:52:59 -0000 Received: by mail-yw0-f193.google.com with SMTP id u68so2871139ywg.0 for ; Wed, 18 Jan 2017 19:52:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cardoe.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=RRKOV3xd8sKPOJq/Co9jRv9M6sNvoAGuUTdRMoSXIKk=; b=cYdsg4pmgRjVYnHV1gel1Vg8AXEIo5BNhSx8W9/51+W/nrpSmHQAE3B4e0VYb1KavV RwjNw6OjfUKqSx3YJ4EWHCokHCKK2JJJgpCauPfTHeFDEAwuJX/IgPBj4GPd5Jjmfikz WTyKOY0d6ihXUVcclwy9eKCYvjmABqHc0PH+w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=RRKOV3xd8sKPOJq/Co9jRv9M6sNvoAGuUTdRMoSXIKk=; b=KpD0oboxYYrSR9wvHLRxWcmrqvjefdn67r1bVZnvzCXBPWJCzFrqg7/5iSHa4225Vz BVmqdhRRaD9Ui0Srm2oc3QCRUV/xGEEFiUdMTV+T/YSrM8Kd/6Zys5eQskYc4mk4DKs5 7jgqKPD7gUQbbB/NJVBnGHT/YEMvUx+FtUwLQb8HGhDU/CqSRK+MK6pN9kwsfI8dmRl3 VRMS1RFqiTDbxVpDbO0uwqYWVOMu3onUzaWxJMx+4mYKkrJpqLWOWYU2v6ck1IUohGOg ws0gqgKZRdseSZsJS1o6W+X+wpWfqIJcYu+vFJb4I4z410mK82cgxpLKqxGAKWP6sXzB 44WA== X-Gm-Message-State: AIkVDXL7o0ivcdBWyMPt+JeM5mfDxkj+r5mJUx609wQCtyNTgdIx3r+0E/ghH694ifoXEA== X-Received: by 10.129.182.20 with SMTP id u20mr5709694ywh.264.1484797978658; Wed, 18 Jan 2017 19:52:58 -0800 (PST) Received: from swanson.attlocal.net (104-179-196-18.lightspeed.brhmal.sbcglobal.net. [104.179.196.18]) by smtp.gmail.com with ESMTPSA id g133sm1203373ywe.19.2017.01.18.19.52.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 18 Jan 2017 19:52:58 -0800 (PST) From: Doug Goldstein To: xen-devel@lists.xen.org Date: Wed, 18 Jan 2017 21:52:42 -0600 Message-Id: <6d0733a6d4e6e5663945c9b001405fe9a06c106f.1484797961.git-series.cardoe@cardoe.com> X-Mailer: git-send-email 2.10.2 In-Reply-To: References: In-Reply-To: References: Cc: jgross@suse.com, sstabellini@kernel.org, konrad.wilk@oracle.com, Andrew Cooper , daniel.kiper@oracle.com, Doug Goldstein , pgnet.dev@gmail.com, ning.sun@intel.com, julien.grall@arm.com, Jan Beulich , qiaowei.ren@intel.com, gang.wei@intel.com, fu.wei@linaro.org Subject: [Xen-devel] [PATCH v5 2/5] efi: build xen.gz with EFI code X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Daniel Kiper 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 Acked-by: Jan Beulich Reviewed-by: Doug Goldstein --- v6 - suggestions/fixes: - improve efi_enabled() checks in efi_runtime_call() (suggested by Jan Beulich). 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). v4 - suggestions/fixes: - functions should return -ENOSYS instead of -EOPNOTSUPP if EFI runtime services are not available (suggested by Jan Beulich), - remove stale bits from xen/arch/x86/Makefile (suggested by Jan Beulich). v3 - suggestions/fixes: - check for EFI platform in EFI code (suggested by Jan Beulich), - fix Makefiles (suggested by Jan Beulich), - improve commit message (suggested by Jan Beulich). v2 - suggestions/fixes: - build EFI code only if it is supported in a given build environment (suggested by Jan Beulich). --- --- xen/arch/x86/Makefile | 2 +- xen/arch/x86/efi/Makefile | 12 ++++-------- xen/arch/x86/xen.lds.S | 4 ++-- xen/common/efi/boot.c | 3 +++ xen/common/efi/runtime.c | 9 +++++++++ 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index 7f6b5d7..2e22cdf 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -219,6 +219,6 @@ 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 diff --git a/xen/arch/x86/efi/Makefile b/xen/arch/x86/efi/Makefile index ad3fdf7..442f3fc 100644 --- a/xen/arch/x86/efi/Makefile +++ b/xen/arch/x86/efi/Makefile @@ -1,18 +1,14 @@ 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))) - -extra-$(efi) += boot.init.o relocs-dummy.o runtime.o compat.o buildid.o +efi := $(if $(efi),$(shell rm disabled)y) %.o: %.ihex $(OBJCOPY) -I ihex -O binary $< $@ -stub.o: $(extra-y) +obj-y := stub.o +obj-$(efi) := boot.init.o compat.o relocs-dummy.o runtime.o +extra-$(efi) += buildid.o nogcov-$(efi) += stub.o diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 7676de9..b0b1c9b 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -270,10 +270,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 3e5e4ab..df8c702 100644 --- a/xen/common/efi/boot.c +++ b/xen/common/efi/boot.c @@ -1251,6 +1251,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 8c44835..25323de 100644 --- a/xen/common/efi/runtime.c +++ b/xen/common/efi/runtime.c @@ -196,6 +196,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: @@ -331,6 +334,12 @@ int efi_runtime_call(struct xenpf_efi_runtime_call *op) EFI_STATUS status = EFI_NOT_STARTED; int rc = 0; + if ( !efi_enabled(EFI_BOOT) ) + return -ENOSYS; + + if ( !efi_enabled(EFI_RS) ) + return -EOPNOTSUPP; + switch ( op->function ) { case XEN_EFI_get_time: