From patchwork Wed Jan 18 14:17:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Douglas Goldstein X-Patchwork-Id: 9523967 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 1433D60449 for ; Wed, 18 Jan 2017 14:19:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0652728534 for ; Wed, 18 Jan 2017 14:19:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EF1C228602; Wed, 18 Jan 2017 14:19:37 +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 377CB285F9 for ; Wed, 18 Jan 2017 14:19:36 +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 1cTr3G-00071w-9B; Wed, 18 Jan 2017 14:17:26 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cTr3E-00071A-KW for xen-devel@lists.xen.org; Wed, 18 Jan 2017 14:17:24 +0000 Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id 47/BA-05987-3F87F785; Wed, 18 Jan 2017 14:17:23 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrHIsWRWlGSWpSXmKPExsVyMXThId3PFfU RBk1PmC2WfFzM4sDocXT3b6YAxijWzLyk/IoE1oz3M7azFizUqvh4ZT5LA+NmhS5GLg4hgYmM Ek8XzWIFcVgE9jNLXNndzQbiSAgsY5X4eLCNuYuRE8iJkdiw7jkjhF0usWXXYRYQW0hAQeL3h ENMEPYyJonNx+1BbDYBDYknv2awgdgiAtIS1z5fZgQZyiywm0liSfdlsGZhAT+J9ovn2UFsFg FViWkL14HZvAJxEl86t7NBLJOXWHj+CNgCToFUic+HtkMtTpG42PMep/gERqEFjAyrGNWLU4v KUot0zfSSijLTM0pyEzNzdA0NTPVyU4uLE9NTcxKTivWS83M3MQJDkQEIdjBObXA+xCjJwaQk yrvcqj5CiC8pP6UyI7E4I76oNCe1+BCjDAeHkgTvgTKgnGBRanpqRVpmDjAqYNISHDxKIrzmI Gne4oLE3OLMdIjUKUZjjp6u0y+ZOPbsuvySSYglLz8vVUqc9xFIqQBIaUZpHtwgWLReYpSVEu ZlBDpNiKcgtSg3swRV/hWjOAejkjBvSTnQFJ7MvBK4fa+ATmECOsVKGeyUkkSElFQDo7jFzug 5HBKXixcbRwfWxNhN+j7zGIPMaVZJf6GgJcnGzIuMo62E3q7X7ZHwm+tZfaaj+Izak/krP91W nlr30q8tysM/8p3lpHf5+nrKwsKMdy2L48s3m+j1P1QtC5/1ju/CUc8lE7YXRzNZL57lW1fga WjP5RAw89PciikzWfisJkhYSccrsRRnJBpqMRcVJwIAvY8phtECAAA= X-Env-Sender: cardoe@cardoe.com X-Msg-Ref: server-12.tower-206.messagelabs.com!1484749042!44275525!1 X-Originating-IP: [209.85.161.194] 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 62705 invoked from network); 18 Jan 2017 14:17:22 -0000 Received: from mail-yw0-f194.google.com (HELO mail-yw0-f194.google.com) (209.85.161.194) by server-12.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 18 Jan 2017 14:17:22 -0000 Received: by mail-yw0-f194.google.com with SMTP id v73so1090596ywg.1 for ; Wed, 18 Jan 2017 06:17:22 -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=B6lgAck9xeumIz3E3iH4Whxbi2v3Urfg0oRerGh0kWk=; b=fJTf60nxTmoPMOcdMJLtrBiBUfgHvjlPh6eeBJbG8vD6PDb5kgBIIz/G3Xfta+Woxy sc+fnvFKPYD0TD9gkVORzY88e7l7OjX19NILqOObCstJLC472Sl7y8MkB+efZuuMExuY g7xZhUzxACLlT4gwsieRLXttg0zysOe519gXw= 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=B6lgAck9xeumIz3E3iH4Whxbi2v3Urfg0oRerGh0kWk=; b=rY/8tvX/s006iSgSUqxVzg2E0uMniX1KRFUJlSD1I2HJHOMoLSZDLLvJjtYIAaBIqF Zknr4m3MtJPPt3y0EN2NP5JlN2wew2m0P3Mg8stqEVe+eArqlbf9Q/3d1g6H64kJbuYI 2D80U66BMrOGTWpca3QI2qfp11spniqdE6xFf/g/a6Fu0aYJP9xlfFWAZV8TGvcF6Nn2 uDm2KgnsDCWQUlfxhr2e19yw1afVXgOviTkZ0+7ATFILOOUTbm/TBDXSekFeEal2K8rl X/2DEpgLqWFCp4wWXHujbnVXD3vL20fejN8IkwDhDFADVnT2GSv8yi4NgTW43U0N1mCI MWAQ== X-Gm-Message-State: AIkVDXKByhLQsf42U6HI/NulQytghKNhWP3lTE8gD3PBmPvKVQ3IoFvCq3XhppNLiW5m3A== X-Received: by 10.13.205.2 with SMTP id p2mr2587771ywd.358.1484749041536; Wed, 18 Jan 2017 06:17:21 -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 d4sm177888ywg.38.2017.01.18.06.17.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 18 Jan 2017 06:17:20 -0800 (PST) From: Doug Goldstein To: xen-devel@lists.xen.org Date: Wed, 18 Jan 2017 08:17:02 -0600 Message-Id: <2bf37d7ba36646f8245fcaabf820c87683cce83e.1484748781.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 , 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 v4 5/5] fix: add multiboot2 protocol support for EFI platforms 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 This should be squashed into the 4/4 patch 'x86: add multiboot2 protocol support for EFI platforms'. - fix incorrect assembly (identified by Andrew Cooper) - fix issue where the trampoline size was left as 0 and the way the memory is allocated for the trampolines we would go to the end of an available section and then subtract off the size to decide where to place it. The end result was that we would always copy the trampolines and the 32-bit stack into some form of reserved memory after the conventional region we wanted to put things into. On some systems this did not manifest as a crash while on others it did. Reworked the changes to always reserve 64kb for both the stack and the size of the trampolines. Added a build time assert to make sure we have enough room always. Signed-off-by: Doug Goldstein Reviewed-by: Jan Beulich --- Doug v4 - change wording around "stack base" (found by Jan Beulich) - added build time assert as suggested by Jan Beulich - added a KB() macro to make our sizes consistent with MB() and GB(). Doug v3 - drop ASSERTs since they are runtime only without any output. This should be completely mitigated by using max() and ensuring we have a sane value. (found by Jan Beulich) - removed extra_mem variable that was incorrectly left behind. (found by Jan Beulich) - fix comment around the "start of stack" (found by Jan Beulich) Doug v2 - new in this version to help show what's changed --- --- xen/arch/x86/boot/head.S | 1 + xen/arch/x86/efi/efi-boot.h | 8 ++++---- xen/arch/x86/efi/stub.c | 2 +- xen/arch/x86/xen.lds.S | 7 +++++++ xen/include/xen/config.h | 1 + 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S index ac93df0..df5fdab 100644 --- a/xen/arch/x86/boot/head.S +++ b/xen/arch/x86/boot/head.S @@ -519,6 +519,7 @@ trampoline_setup: 1: /* Switch to low-memory stack. */ mov sym_phys(trampoline_phys),%edi + /* The stack ends 64kb after the location of trampoline_phys */ lea 0x10000(%edi),%esp lea trampoline_boot_cpu_entry-trampoline_start(%edi),%eax pushl $BOOT_CS32 diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h index dc857d8..d2ebf21 100644 --- a/xen/arch/x86/efi/efi-boot.h +++ b/xen/arch/x86/efi/efi-boot.h @@ -146,8 +146,6 @@ static void __init efi_arch_process_memory_map(EFI_SYSTEM_TABLE *SystemTable, { struct e820entry *e; unsigned int i; - /* Check for extra mem for mbi data if Xen is loaded via multiboot2 protocol. */ - UINTN extra_mem = efi_enabled(EFI_LOADER) ? 0 : (64 << 10); /* Populate E820 table and check trampoline area availability. */ e = e820map - 1; @@ -170,8 +168,7 @@ static void __init efi_arch_process_memory_map(EFI_SYSTEM_TABLE *SystemTable, /* fall through */ case EfiConventionalMemory: if ( !trampoline_phys && desc->PhysicalStart + len <= 0x100000 && - len >= cfg.size + extra_mem && - desc->PhysicalStart + len > cfg.addr ) + len >= cfg.size && desc->PhysicalStart + len > cfg.addr ) cfg.addr = (desc->PhysicalStart + len - cfg.size) & PAGE_MASK; /* fall through */ case EfiLoaderCode: @@ -686,6 +683,9 @@ paddr_t __init efi_multiboot2(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTa setup_efi_pci(); efi_variables(); + /* This is the maximum size of our trampoline + our low memory stack */ + cfg.size = KB(64); + if ( gop ) efi_set_gop_mode(gop, gop_mode); diff --git a/xen/arch/x86/efi/stub.c b/xen/arch/x86/efi/stub.c index 6ea6aa1..b81adc0 100644 --- a/xen/arch/x86/efi/stub.c +++ b/xen/arch/x86/efi/stub.c @@ -33,7 +33,7 @@ paddr_t __init noreturn efi_multiboot2(EFI_HANDLE ImageHandle, * not be directly supported by C compiler. */ asm volatile( - " call %2 \n" + " call *%2 \n" "0: hlt \n" " jmp 0b \n" : "+c" (StdErr), "+d" (err) : "g" (StdErr->OutputString) diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index e0e2529..504348e 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -333,3 +333,10 @@ ASSERT(IS_ALIGNED(trampoline_start, 4), "trampoline_start misaligned") ASSERT(IS_ALIGNED(trampoline_end, 4), "trampoline_end misaligned") ASSERT(IS_ALIGNED(__bss_start, 8), "__bss_start misaligned") ASSERT(IS_ALIGNED(__bss_end, 8), "__bss_end misaligned") + +/* The trampolines and the low memory stack must fit in 64kb. In testing + * the low memory stack never exceeded 1kb so just require that the + * trampolines fit in 63kb, leaving 1kb for the stack. + */ +ASSERT((trampoline_end - trampoline_start) < KB(63), + "not enough room for trampolines and low memory stack") diff --git a/xen/include/xen/config.h b/xen/include/xen/config.h index 473c5e8..04e4da5 100644 --- a/xen/include/xen/config.h +++ b/xen/include/xen/config.h @@ -70,6 +70,7 @@ #define __force #define __bitwise +#define KB(_kb) (_AC(_kb, ULL) << 10) #define MB(_mb) (_AC(_mb, ULL) << 20) #define GB(_gb) (_AC(_gb, ULL) << 30)