From patchwork Wed Feb 22 14:24:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Roger_Pau_Monn=C3=A9?= X-Patchwork-Id: 9586919 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 2A37E600CA for ; Wed, 22 Feb 2017 14:27:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0AFBF286B5 for ; Wed, 22 Feb 2017 14:27:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F2466286C2; Wed, 22 Feb 2017 14:27:35 +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=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED 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 90C0D286B5 for ; Wed, 22 Feb 2017 14:27:35 +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 1cgXr1-0008RL-NF; Wed, 22 Feb 2017 14:25:15 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cgXr0-0008Qa-7p for xen-devel@lists.xenproject.org; Wed, 22 Feb 2017 14:25:14 +0000 Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id 8D/C2-08534-94F9DA85; Wed, 22 Feb 2017 14:25:13 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrEIsWRWlGSWpSXmKPExsXitHRDpK7n/LU RBkd/Mlp83zKZyYHR4/CHKywBjFGsmXlJ+RUJrBmr21azFPyTrpjw7RR7A2OHWBcjJ4eEgL9E /4xZjCA2m4COxMW5O9m6GDk4RARUJG7vNehi5OJgFrjJKPG6cTIjSFxYIExibrcpiMkioCrxd q4FSCevgKXEjsW7WSEm6knsOvIbzOYUsJJY1fcdrFMIqObqmmiIckGJkzOfsIDYzAKaEq3bf7 ND2PISzVtnM4PYQgKKEv3zHrBNYOSbhaRlFpKWWUhaFjAyr2LUKE4tKkst0jWy1EsqykzPKMl NzMzRNTQw1stNLS5OTE/NSUwq1kvOz93ECAyzegYGxh2MTXv9DjFKcjApifI+zF4bIcSXlJ9S mZFYnBFfVJqTWnyIUYODQ2Dz2tUXGKVY8vLzUpUkeGfMBaoTLEpNT61Iy8wBRgJMqQQHj5IIb 9ocoDRvcUFibnFmOkTqFKMux5edZ14yCYHNkBLnfQAyQwCkKKM0D24ELCovMcpKCfMyMjAwCP EUpBblZpagyr9iFOdgVBLmfQ0yhSczrwRu0yugI5iAjrB0BjuiJBEhJdXA6Jngb1t660eQ8SH ZnccuiCnJFEcd1TfhW36LIyJCIp+Z+/vDuRsrLdNTJCS3+99ZohiU8CxmdsPZ8xfagpnOGkTV tHdfK23MEZrVZfDfOd7+h/+tg7O+qjf8elK3ULyuRoKB42DfWWdHl57Nr60LquJM5vcZz5e/+ uONxPxnndFVk5pKn/5SYinOSDTUYi4qTgQA4l0CUcUCAAA= X-Env-Sender: prvs=219821433=roger.pau@citrix.com X-Msg-Ref: server-10.tower-31.messagelabs.com!1487773511!86223271!1 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 5394 invoked from network); 22 Feb 2017 14:25:12 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-10.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 22 Feb 2017 14:25:12 -0000 X-IronPort-AV: E=Sophos;i="5.35,194,1484006400"; d="scan'208";a="408869276" From: Roger Pau Monne To: Date: Wed, 22 Feb 2017 14:24:56 +0000 Message-ID: <20170222142459.28199-5-roger.pau@citrix.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20170222142459.28199-1-roger.pau@citrix.com> References: <20170222142459.28199-1-roger.pau@citrix.com> MIME-Version: 1.0 Cc: Andrew Cooper , Ian Jackson , Jan Beulich , boris.ostrovsky@oracle.com, Roger Pau Monne Subject: [Xen-devel] [PATCH v7 4/7] x86/libelf: pass the destination vCPU to libelf for Dom0 build 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: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Allow setting the destination vCPU for libelf, so that elf_load_image can take it into account when loading the kernel for Dom0. This is needed for PVHv2 Dom0 build, so that hvm_copy_to_guest_phys can be called with a Dom0 vCPU instead of current (that contains the idle vCPU at this point). Signed-off-by: Roger Pau Monné Reviewed-by: Jan Beulich --- Cc: Jan Beulich Cc: Andrew Cooper Cc: Ian Jackson --- Changes since v6: - New in this version. --- xen/arch/x86/domain_build.c | 1 + xen/common/libelf/libelf-loader.c | 25 +++++++++++++++++++++++-- xen/include/xen/libelf.h | 6 ++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index aa1625a..d2a1105 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -1462,6 +1462,7 @@ static int __init construct_dom0_pv( /* Copy the OS image and free temporary buffer. */ elf.dest_base = (void*)vkern_start; elf.dest_size = vkern_end - vkern_start; + elf_set_vcpu(&elf, v); rc = elf_load_binary(&elf); if ( rc < 0 ) { diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c index 1644f16..371061c 100644 --- a/xen/common/libelf/libelf-loader.c +++ b/xen/common/libelf/libelf-loader.c @@ -146,6 +146,25 @@ void elf_set_verbose(struct elf_binary *elf) elf->verbose = 1; } +static elf_errorstatus elf_memcpy(struct vcpu *v, void *dst, void *src, + uint64_t size) +{ + int rc = 0; + +#ifdef CONFIG_X86 + if ( is_hvm_vcpu(v) ) + { + rc = hvm_copy_to_guest_phys((paddr_t)dst, src, size, v); + rc = rc != HVMCOPY_okay ? -1 : 0; + } + else +#endif + rc = src == NULL ? raw_clear_guest(dst, size) : + raw_copy_to_guest(dst, src, size); + + return rc; +} + static elf_errorstatus elf_load_image(struct elf_binary *elf, elf_ptrval dst, elf_ptrval src, uint64_t filesz, uint64_t memsz) { elf_errorstatus rc; @@ -153,10 +172,12 @@ static elf_errorstatus elf_load_image(struct elf_binary *elf, elf_ptrval dst, el return -1; /* We trust the dom0 kernel image completely, so we don't care * about overruns etc. here. */ - rc = raw_copy_to_guest(ELF_UNSAFE_PTR(dst), ELF_UNSAFE_PTR(src), filesz); + rc = elf_memcpy(elf->vcpu, ELF_UNSAFE_PTR(dst), ELF_UNSAFE_PTR(src), + filesz); if ( rc != 0 ) return -1; - rc = raw_clear_guest(ELF_UNSAFE_PTR(dst + filesz), memsz - filesz); + rc = elf_memcpy(elf->vcpu, ELF_UNSAFE_PTR(dst + filesz), NULL, + memsz - filesz); if ( rc != 0 ) return -1; return 0; diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h index 1b763f3..b739981 100644 --- a/xen/include/xen/libelf.h +++ b/xen/include/xen/libelf.h @@ -212,6 +212,8 @@ struct elf_binary { /* misc */ elf_log_callback *log_callback; void *log_caller_data; +#else + struct vcpu *vcpu; #endif bool verbose; const char *broken; @@ -351,6 +353,10 @@ elf_errorstatus elf_init(struct elf_binary *elf, const char *image, size_t size) */ #ifdef __XEN__ void elf_set_verbose(struct elf_binary *elf); +static inline void elf_set_vcpu(struct elf_binary *elf, struct vcpu *v) +{ + elf->vcpu = v; +} #else void elf_set_log(struct elf_binary *elf, elf_log_callback*, void *log_caller_pointer, bool verbose);