From patchwork Thu Oct 26 17:03:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Euan Harris X-Patchwork-Id: 10028647 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 64489601E8 for ; Thu, 26 Oct 2017 17:06:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5063328E75 for ; Thu, 26 Oct 2017 17:06:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4544F28E7F; Thu, 26 Oct 2017 17:06:27 +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 C763B28E75 for ; Thu, 26 Oct 2017 17:06:26 +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 1e7lZU-0002e5-Fi; Thu, 26 Oct 2017 17:03:56 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1e7lZT-0002d3-8U for xen-devel@lists.xenproject.org; Thu, 26 Oct 2017 17:03:55 +0000 Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id C3/C6-19514-B7512F95; Thu, 26 Oct 2017 17:03:55 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprKIsWRWlGSWpSXmKPExsXitHSDvW6V6Kd Ig9tfZS2+b5nM5MDocfjDFZYAxijWzLyk/IoE1oxvD3awFeyQrGj6soq5gfGlcBcjJ4eEgL9E 59E2JhCbTUBLYveHhexdjBwcIgIqErf3GnQxcnEwC/QySix9fwGsRlggVOLVsbnMIDaLgKrE6 3OPwep5Bdwknn0KhBipIDHl4XuwEk4Bd4lDCzexgdhCQCUXv/1ihbCVJT5cWcMOYvMKCEqcnP mEBcRmFpCQOPjiBfMERt5ZSFKzkKQWMDKtYlQvTi0qSy3SNddLKspMzyjJTczM0TU0MNXLTS0 uTkxPzUlMKtZLzs/dxAgMHAYg2MF4bLLzIUZJDiYlUV6GPR8ihfiS8lMqMxKLM+KLSnNSiw8x ynBwKEnwThL5FCkkWJSanlqRlpkDDGGYtAQHj5IIbwdImre4IDG3ODMdInWK0Zij4+bdP0wcz 2a+bmAWYsnLz0uVEuc1BSkVACnNKM2DGwSLrUuMslLCvIxApwnxFKQW5WaWoMq/YhTnYFQS5m 0GmcKTmVcCt+8V0ClMQKc0qX4AOaUkESEl1cCYFr1/7VeZn6JbqpZIJqk+3rGtI89QKD1HizG 1LeX61wXVOxlZn4RY5FV5be/Y7LnURMn7n/uW0it1ZksP2OhGmSgGn7n9luXJea1PUxZ8+8mo NEWFcZ9Neu3Ody+PB6jNdDv4S/F8Dq/voqfC9z68buyNW9pd/5U58NrjYqWp85lfVU0LVlyjx FKckWioxVxUnAgA3PT4/6gCAAA= X-Env-Sender: prvs=465eced58=euan.harris@citrix.com X-Msg-Ref: server-8.tower-206.messagelabs.com!1509037432!108704426!1 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked Received: (qmail 4932 invoked from network); 26 Oct 2017 17:03:54 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 26 Oct 2017 17:03:54 -0000 X-IronPort-AV: E=Sophos;i="5.44,301,1505779200"; d="scan'208";a="456259610" From: Euan Harris To: Date: Thu, 26 Oct 2017 18:03:15 +0100 Message-ID: <1509037399-48926-6-git-send-email-euan.harris@citrix.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1509037399-48926-1-git-send-email-euan.harris@citrix.com> References: <1509037399-48926-1-git-send-email-euan.harris@citrix.com> MIME-Version: 1.0 Cc: andrew.cooper3@citrix.com, kevin.tian@intel.com, Euan Harris , jun.nakajima@intel.com, jbeulich@suse.com Subject: [Xen-devel] [PATCH 5/9] x86/vvmx: Replace direct calls to reg_read() with operand_read() 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 Use operand_read() to read register operands in the following functions: * nvmx_handle_vmread() * nvmx_handle_vmwrite() * nvmx_handle_invept() Direct reading of memory operands will be replaced in a separate patch. Signed-off-by: Euan Harris --- xen/arch/x86/hvm/vmx/vvmx.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c index 32c07eca3d..7cda37b136 100644 --- a/xen/arch/x86/hvm/vmx/vvmx.c +++ b/xen/arch/x86/hvm/vmx/vvmx.c @@ -1877,6 +1877,7 @@ int nvmx_handle_vmread(struct cpu_user_regs *regs) pagefault_info_t pfinfo; u64 value = 0; int rc; + unsigned long vmcs_encoding = 0; rc = decode_vmx_inst(regs, &decode, NULL, 0); if ( rc != X86EMUL_OKAY ) @@ -1888,7 +1889,11 @@ int nvmx_handle_vmread(struct cpu_user_regs *regs) return X86EMUL_OKAY; } - rc = get_vvmcs_safe(v, reg_read(regs, decode.op[1].reg_idx), &value); + rc = operand_read(&vmcs_encoding, &decode.op[1], regs, decode.op[1].len); + if ( rc != X86EMUL_OKAY ) + return rc; + + rc = get_vvmcs_safe(v, vmcs_encoding, &value); if ( rc != VMX_INSN_SUCCEED ) { vmfail(regs, rc); @@ -1918,9 +1923,10 @@ int nvmx_handle_vmwrite(struct cpu_user_regs *regs) struct vcpu *v = current; struct vmx_inst_decoded decode; unsigned long operand; - u64 vmcs_encoding; + unsigned long vmcs_encoding = 0; bool_t okay = 1; enum vmx_insn_errno err; + int rc; if ( decode_vmx_inst(regs, &decode, &operand, 0) != X86EMUL_OKAY ) @@ -1932,7 +1938,10 @@ int nvmx_handle_vmwrite(struct cpu_user_regs *regs) return X86EMUL_OKAY; } - vmcs_encoding = reg_read(regs, decode.op[1].reg_idx); + rc = operand_read(&vmcs_encoding, &decode.op[1], regs, decode.op[1].len); + if ( rc != X86EMUL_OKAY ) + return rc; + err = set_vvmcs_safe(v, vmcs_encoding, operand); if ( err != VMX_INSN_SUCCEED ) { @@ -1965,12 +1974,17 @@ int nvmx_handle_invept(struct cpu_user_regs *regs) { struct vmx_inst_decoded decode; unsigned long eptp; + unsigned long invept_type = 0; int ret; if ( (ret = decode_vmx_inst(regs, &decode, &eptp, 0)) != X86EMUL_OKAY ) return ret; - switch ( reg_read(regs, decode.op[1].reg_idx) ) + ret = operand_read(&invept_type, &decode.op[1], regs, decode.op[1].len); + if ( ret != X86EMUL_OKAY ) + return ret; + + switch ( invept_type ) { case INVEPT_SINGLE_CONTEXT: { @@ -1992,12 +2006,17 @@ int nvmx_handle_invept(struct cpu_user_regs *regs) int nvmx_handle_invvpid(struct cpu_user_regs *regs) { struct vmx_inst_decoded decode; + unsigned long invvpid_type = 0; int ret; if ( (ret = decode_vmx_inst(regs, &decode, NULL, 0)) != X86EMUL_OKAY ) return ret; - switch ( reg_read(regs, decode.op[1].reg_idx) ) + ret = operand_read(&invvpid_type, &decode.op[1], regs, decode.op[1].len); + if ( ret != X86EMUL_OKAY ) + return ret; + + switch ( invvpid_type ) { /* Just invalidate all tlb entries for all types! */ case INVVPID_INDIVIDUAL_ADDR: