From patchwork Wed Nov 30 13:50:37 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 9454429 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 88B0B60585 for ; Wed, 30 Nov 2016 14:18:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 82AC52842D for ; Wed, 30 Nov 2016 14:18:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7757628443; Wed, 30 Nov 2016 14:18:46 +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 DA4B42842D for ; Wed, 30 Nov 2016 14:18:45 +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 1cC5gY-000450-UJ; Wed, 30 Nov 2016 14:16:34 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cC5gX-00041e-TF for xen-devel@lists.xen.org; Wed, 30 Nov 2016 14:16:33 +0000 Received: from [193.109.254.147] by server-3.bemta-6.messagelabs.com id BF/0F-08948-14FDE385; Wed, 30 Nov 2016 14:16:33 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpikeJIrShJLcpLzFFi42JxWrohUtfhvl2 Ewcr7+hZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa8aVL8IF590rnpxYztLAuNOoi5GTQ0LAX2LL 6x/sIDabgL7E7hefmEBsEQF1idMdF1m7GDk4mAV0JVb91AAJCwskSkz9sIsNxGYRUJVYs2MPI 4jNK+ApMffsX3aIkXIS54//ZAaxOYHip1rbwcYICXhIvHjKCRIWElCTuNZ/iR2iVVDi5MwnLC A2s4CExMEXL5gnMPLOQpKahSS1gJFpFaNGcWpRWWqRrqGRXlJRZnpGSW5iZo6uoYGZXm5qcXF iempOYlKxXnJ+7iZGYNgwAMEOxssbAw4xSnIwKYny8nXaRQjxJeWnVGYkFmfEF5XmpBYfYpTh 4FCS4L11FygnWJSanlqRlpkDDGCYtAQHj5II7yKQNG9xQWJucWY6ROoUo6KUOC/DPaCEAEgio zQPrg0WNZcYZaWEeRmBDhHiKUgtys0sQZV/xSjOwagkDDGFJzOvBG76K6DFTECL3762Bllcko iQkmpgjO3xaput086Y0eRt6vRRaMmvzaWVmxydNlXG7NW7OlE7pe3S151mLkuDNzTEiF/ufRV fc+fH36O5limT32zZ37f19Nn3aaFTy/WsTTlaZr37E+rb80TfTGp5wC4xrz/y8fseyujzd4Yl r//35PvtjEWzbh6TV750W2rRnRvzrgYsT3paeiNMSImlOCPRUIu5qDgRAMsWXMGVAgAA X-Env-Sender: prvs=135e2d9de=Andrew.Cooper3@citrix.com X-Msg-Ref: server-7.tower-27.messagelabs.com!1480515391!70309394!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.0.16; banners=-,-,- X-VirusChecked: Checked Received: (qmail 18160 invoked from network); 30 Nov 2016 14:16:32 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 30 Nov 2016 14:16:32 -0000 X-IronPort-AV: E=Sophos;i="5.31,574,1473120000"; d="scan'208";a="392230984" From: Andrew Cooper To: Xen-devel Date: Wed, 30 Nov 2016 13:50:37 +0000 Message-ID: <1480513841-7565-21-git-send-email-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1480513841-7565-1-git-send-email-andrew.cooper3@citrix.com> References: <1480513841-7565-1-git-send-email-andrew.cooper3@citrix.com> MIME-Version: 1.0 Cc: Andrew Cooper Subject: [Xen-devel] [PATCH v3 20/24] x86/hvm: Reimplement hvm_copy_*_nofault() in terms of no pagefault_info 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 No functional change. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich Acked-by: Tim Deegan Reviewed-by: Paul Durrant --- xen/arch/x86/hvm/emulate.c | 6 ++--- xen/arch/x86/hvm/hvm.c | 56 +++++++++------------------------------ xen/arch/x86/mm/shadow/common.c | 8 +++--- xen/include/asm-x86/hvm/support.h | 11 -------- 4 files changed, 19 insertions(+), 62 deletions(-) diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 41f689e..321c5aa 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -1937,9 +1937,9 @@ void hvm_emulate_init_per_insn( hvm_access_insn_fetch, hvmemul_ctxt->ctxt.addr_size, &addr) && - hvm_fetch_from_guest_virt_nofault(hvmemul_ctxt->insn_buf, addr, - sizeof(hvmemul_ctxt->insn_buf), - pfec) == HVMCOPY_okay) ? + hvm_fetch_from_guest_virt(hvmemul_ctxt->insn_buf, addr, + sizeof(hvmemul_ctxt->insn_buf), + pfec, NULL) == HVMCOPY_okay) ? sizeof(hvmemul_ctxt->insn_buf) : 0; } else diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 390f76d..5eae06a 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -3066,8 +3066,6 @@ void hvm_task_switch( #define HVMCOPY_from_guest (0u<<0) #define HVMCOPY_to_guest (1u<<0) -#define HVMCOPY_no_fault (0u<<1) -#define HVMCOPY_fault (1u<<1) #define HVMCOPY_phys (0u<<2) #define HVMCOPY_virt (1u<<2) static enum hvm_copy_result __hvm_copy( @@ -3112,13 +3110,10 @@ static enum hvm_copy_result __hvm_copy( return HVMCOPY_gfn_paged_out; if ( pfec & PFEC_page_shared ) return HVMCOPY_gfn_shared; - if ( flags & HVMCOPY_fault ) + if ( pfinfo ) { - if ( pfinfo ) - { - pfinfo->linear = addr; - pfinfo->ec = pfec; - } + pfinfo->linear = addr; + pfinfo->ec = pfec; hvm_inject_page_fault(pfec, addr); } @@ -3290,16 +3285,14 @@ enum hvm_copy_result hvm_copy_to_guest_phys( paddr_t paddr, void *buf, int size) { return __hvm_copy(buf, paddr, size, - HVMCOPY_to_guest | HVMCOPY_fault | HVMCOPY_phys, - 0, NULL); + HVMCOPY_to_guest | HVMCOPY_phys, 0, NULL); } enum hvm_copy_result hvm_copy_from_guest_phys( void *buf, paddr_t paddr, int size) { return __hvm_copy(buf, paddr, size, - HVMCOPY_from_guest | HVMCOPY_fault | HVMCOPY_phys, - 0, NULL); + HVMCOPY_from_guest | HVMCOPY_phys, 0, NULL); } enum hvm_copy_result hvm_copy_to_guest_virt( @@ -3307,7 +3300,7 @@ enum hvm_copy_result hvm_copy_to_guest_virt( pagefault_info_t *pfinfo) { return __hvm_copy(buf, vaddr, size, - HVMCOPY_to_guest | HVMCOPY_fault | HVMCOPY_virt, + HVMCOPY_to_guest | HVMCOPY_virt, PFEC_page_present | PFEC_write_access | pfec, pfinfo); } @@ -3316,7 +3309,7 @@ enum hvm_copy_result hvm_copy_from_guest_virt( pagefault_info_t *pfinfo) { return __hvm_copy(buf, vaddr, size, - HVMCOPY_from_guest | HVMCOPY_fault | HVMCOPY_virt, + HVMCOPY_from_guest | HVMCOPY_virt, PFEC_page_present | pfec, pfinfo); } @@ -3325,34 +3318,10 @@ enum hvm_copy_result hvm_fetch_from_guest_virt( pagefault_info_t *pfinfo) { return __hvm_copy(buf, vaddr, size, - HVMCOPY_from_guest | HVMCOPY_fault | HVMCOPY_virt, + HVMCOPY_from_guest | HVMCOPY_virt, PFEC_page_present | PFEC_insn_fetch | pfec, pfinfo); } -enum hvm_copy_result hvm_copy_to_guest_virt_nofault( - unsigned long vaddr, void *buf, int size, uint32_t pfec) -{ - return __hvm_copy(buf, vaddr, size, - HVMCOPY_to_guest | HVMCOPY_no_fault | HVMCOPY_virt, - PFEC_page_present | PFEC_write_access | pfec, NULL); -} - -enum hvm_copy_result hvm_copy_from_guest_virt_nofault( - void *buf, unsigned long vaddr, int size, uint32_t pfec) -{ - return __hvm_copy(buf, vaddr, size, - HVMCOPY_from_guest | HVMCOPY_no_fault | HVMCOPY_virt, - PFEC_page_present | pfec, NULL); -} - -enum hvm_copy_result hvm_fetch_from_guest_virt_nofault( - void *buf, unsigned long vaddr, int size, uint32_t pfec) -{ - return __hvm_copy(buf, vaddr, size, - HVMCOPY_from_guest | HVMCOPY_no_fault | HVMCOPY_virt, - PFEC_page_present | PFEC_insn_fetch | pfec, NULL); -} - unsigned long copy_to_user_hvm(void *to, const void *from, unsigned int len) { int rc; @@ -3364,8 +3333,7 @@ unsigned long copy_to_user_hvm(void *to, const void *from, unsigned int len) return 0; } - rc = hvm_copy_to_guest_virt_nofault((unsigned long)to, (void *)from, - len, 0); + rc = hvm_copy_to_guest_virt((unsigned long)to, (void *)from, len, 0, NULL); return rc ? len : 0; /* fake a copy_to_user() return code */ } @@ -3395,7 +3363,7 @@ unsigned long copy_from_user_hvm(void *to, const void *from, unsigned len) return 0; } - rc = hvm_copy_from_guest_virt_nofault(to, (unsigned long)from, len, 0); + rc = hvm_copy_from_guest_virt(to, (unsigned long)from, len, 0, NULL); return rc ? len : 0; /* fake a copy_from_user() return code */ } @@ -4070,8 +4038,8 @@ void hvm_ud_intercept(struct cpu_user_regs *regs) (hvm_long_mode_enabled(cur) && cs->attr.fields.l) ? 64 : cs->attr.fields.db ? 32 : 16, &addr) && - (hvm_fetch_from_guest_virt_nofault(sig, addr, sizeof(sig), - walk) == HVMCOPY_okay) && + (hvm_fetch_from_guest_virt(sig, addr, sizeof(sig), + walk, NULL) == HVMCOPY_okay) && (memcmp(sig, "\xf\xbxen", sizeof(sig)) == 0) ) { regs->eip += sizeof(sig); diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index e8501ce..b659324 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -419,8 +419,8 @@ const struct x86_emulate_ops *shadow_init_emulation( (!hvm_translate_linear_addr( x86_seg_cs, regs->eip, sizeof(sh_ctxt->insn_buf), hvm_access_insn_fetch, sh_ctxt, &addr) && - !hvm_fetch_from_guest_virt_nofault( - sh_ctxt->insn_buf, addr, sizeof(sh_ctxt->insn_buf), 0)) + !hvm_fetch_from_guest_virt( + sh_ctxt->insn_buf, addr, sizeof(sh_ctxt->insn_buf), 0, NULL)) ? sizeof(sh_ctxt->insn_buf) : 0; return &hvm_shadow_emulator_ops; @@ -447,8 +447,8 @@ void shadow_continue_emulation(struct sh_emulate_ctxt *sh_ctxt, (!hvm_translate_linear_addr( x86_seg_cs, regs->eip, sizeof(sh_ctxt->insn_buf), hvm_access_insn_fetch, sh_ctxt, &addr) && - !hvm_fetch_from_guest_virt_nofault( - sh_ctxt->insn_buf, addr, sizeof(sh_ctxt->insn_buf), 0)) + !hvm_fetch_from_guest_virt( + sh_ctxt->insn_buf, addr, sizeof(sh_ctxt->insn_buf), 0, NULL)) ? sizeof(sh_ctxt->insn_buf) : 0; sh_ctxt->insn_buf_eip = regs->eip; } diff --git a/xen/include/asm-x86/hvm/support.h b/xen/include/asm-x86/hvm/support.h index 4aa5a36..114aa04 100644 --- a/xen/include/asm-x86/hvm/support.h +++ b/xen/include/asm-x86/hvm/support.h @@ -105,17 +105,6 @@ enum hvm_copy_result hvm_fetch_from_guest_virt( void *buf, unsigned long vaddr, int size, uint32_t pfec, pagefault_info_t *pfinfo); -/* - * As above (copy to/from a guest virtual address), but no fault is generated - * when HVMCOPY_bad_gva_to_gfn is returned. - */ -enum hvm_copy_result hvm_copy_to_guest_virt_nofault( - unsigned long vaddr, void *buf, int size, uint32_t pfec); -enum hvm_copy_result hvm_copy_from_guest_virt_nofault( - void *buf, unsigned long vaddr, int size, uint32_t pfec); -enum hvm_copy_result hvm_fetch_from_guest_virt_nofault( - void *buf, unsigned long vaddr, int size, uint32_t pfec); - #define HVM_HCALL_completed 0 /* hypercall completed - no further action */ #define HVM_HCALL_preempted 1 /* hypercall preempted - re-execute VMCALL */ #define HVM_HCALL_invalidate 2 /* invalidate ioemu-dm memory cache */