From patchwork Sun Jul 9 08:09:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai Huang X-Patchwork-Id: 9831687 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 0863C603B5 for ; Sun, 9 Jul 2017 08:11:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F2D0B237A5 for ; Sun, 9 Jul 2017 08:11:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E420E24151; Sun, 9 Jul 2017 08:11:48 +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_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, 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 8012F27F82 for ; Sun, 9 Jul 2017 08:11:48 +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 1dU7Hm-0004jX-UW; Sun, 09 Jul 2017 08:09:46 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dU7Hm-0004ij-4m for xen-devel@lists.xen.org; Sun, 09 Jul 2017 08:09:46 +0000 Received: from [193.109.254.147] by server-8.bemta-6.messagelabs.com id CB/2A-09901-9C4E1695; Sun, 09 Jul 2017 08:09:45 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrBIsWRWlGSWpSXmKPExsXiVRvsrHviSWK kwcnpZhZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa8brq+kFHQoV195eZGxg/CfRxcjFISQwgVFi 8YrDjCAOi0AXq8TyD2eZQRwJgWWsEh8b/wM5nEBOnMS2+7PYIOwKia0PD4LZQgLKEl3fjrJDj FrEJHF6Yg8rSIJNQE1i65J2FogGW4kF576ADRIRkJa49vkyI4jNLOAh8fHjUjBbWMBe4tathW A1LAKqEnPfHWHqYuTg4BWIl3ixtBZijLzErraLrCBhToEEieYLERAnxEv8uvgT7BxOoE1f9i9 ghojbSPw6tp5pAqPwAkaGVYwaxalFZalFukaGeklFmekZJbmJmTm6hgZmermpxcWJ6ak5iUnF esn5uZsYgeHJAAQ7GP8sCzjEKMnBpCTKK9abECnEl5SfUpmRWJwRX1Sak1p8iFGGg0NJglf4c WKkkGBRanpqRVpmDjBSYNISHDxKIrzO04HSvMUFibnFmekQqVOMxhyTDmz/wsTxasL/b0xCLH n5ealS4rypIJMEQEozSvPgBsEi+BKjrJQwLyPQaUI8BalFuZklqPKvGMU5GJWEecVBpvBk5pX A7XsFdAoT0ClsdQkgp5QkIqSkGhjNnu56+PHWXr3Y45eTl3wwcZ0Uc1C0eOFG30tbk386L1Oa VCx1Xi3xaIu7r2RZ3QnxRc9kX3Xt71xf3f+5isl7y+8QpeAz4jNZZxyZnpcgEDN1U4uvw8x5x 5+cKNA4LzW7zvNnyT3DnSfc1/qUnW9dlhIlu+xHcX9wZ7dNU+HWz5t14iIKDLSVWIozEg21mI uKEwFhN4oe2wIAAA== X-Env-Sender: kaih.linux@gmail.com X-Msg-Ref: server-14.tower-27.messagelabs.com!1499587783!93828132!1 X-Originating-IP: [74.125.83.67] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.4.25; banners=-,-,- X-VirusChecked: Checked Received: (qmail 48579 invoked from network); 9 Jul 2017 08:09:44 -0000 Received: from mail-pg0-f67.google.com (HELO mail-pg0-f67.google.com) (74.125.83.67) by server-14.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 9 Jul 2017 08:09:44 -0000 Received: by mail-pg0-f67.google.com with SMTP id u62so9088915pgb.0 for ; Sun, 09 Jul 2017 01:09:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=rbyAbmCAI3Ze5MANMcptSjLEF2Rmbmou88GmVSWB2ys=; b=Wx66bw49RE+hEMq1EOTbh3cVpLizrU3iPhpbzEGfeh7Sh+ME2aNIP3FZUE+ZReZ1d5 /j0+ILuRtly32ZW1XIg0BaWU5F1KQrcrPZ3ilo6c5UxnYCVljkvNQo9cITIvH+tsJPGv HZT9L6Fqd//6Wnur2KysWlQRwunPrkPQKhx5NWkP8Olo9J4Uv3bDjnn4QnBZwqgc3z/V 0HO5wC/4SSLOioOfuVIhAMbitO2izh/Of0o3edkZMx6XuJuzKs/fU0UoknkkiofKhvuC 9NhbB9HhG6njsqnHlmy5uf62KQoQNmR1JGJn5BrFz5xyV6nKkujBTekSfr5P8gzAts9I xqfg== 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=rbyAbmCAI3Ze5MANMcptSjLEF2Rmbmou88GmVSWB2ys=; b=tSG32fseLaen6FZsI72Y+3aVnGD5jMx66O5VT0fmEoy9vrt5bLfVe8D+9zUvanmCRA bs5+dSvDMLw93/y/msTkl4zKieLNI2upok4811QNExCNGLNkG8+MpxMDoyXFHzjhbxc4 bSroZNU7cwdSTHiQhlhLanIgpz28UnEfjMs20HWIE7UDKPzyGdmWv6L3NxiuHN9ydq2q 0k21i1r4fanl2YKqCWLPvpp/m5pufE/QRIlAbkd0wQapgiZbqDPi85+uLCnC6Haf7naA 5IS6YyacCjZ+HURBE88M9fwGN3cuPYBPPeR5zPYwJxzaEzR0V2YWS/GATb7mcNB0Kcvo CFHg== X-Gm-Message-State: AIVw110bvkOc0ianYQrp/vszz1Rm8xIWnYRj0uKg34Bq3K+kF5v543Gr SIF42VzsxpRt/K9H X-Received: by 10.99.0.213 with SMTP id 204mr4032956pga.144.1499587782990; Sun, 09 Jul 2017 01:09:42 -0700 (PDT) Received: from localhost.localdomain (118-92-234-57.dsl.dyn.ihug.co.nz. [118.92.234.57]) by smtp.gmail.com with ESMTPSA id d70sm22148172pga.49.2017.07.09.01.09.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 09 Jul 2017 01:09:42 -0700 (PDT) From: Kai Huang X-Google-Original-From: Kai Huang To: xen-devel@lists.xen.org Date: Sun, 9 Jul 2017 20:09:09 +1200 Message-Id: <7f123e4c5b3f007d7e617e11507dda786741f7df.1499586046.git.kai.huang@linux.intel.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <4b8baf9779038897e6ba2ed4ac0a3e9663db2756.1499586046.git.kai.huang@linux.intel.com> References: <4b8baf9779038897e6ba2ed4ac0a3e9663db2756.1499586046.git.kai.huang@linux.intel.com> In-Reply-To: References: Cc: andrew.cooper3@citrix.com, kevin.tian@intel.com, jbeulich@suse.com Subject: [Xen-devel] [PATCH 11/15] xen: vmx: handle VMEXIT from SGX enclave 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 VMX adds new bit to both exit_reason and GUEST_INTERRUPT_STATE to indicate whether VMEXIT happens in Enclave. Several instructions are also invalid or behave differently in enclave according to SDM. This patch handles those cases. Signed-off-by: Kai Huang --- xen/arch/x86/hvm/vmx/vmx.c | 29 +++++++++++++++++++++++++++++ xen/include/asm-x86/hvm/vmx/vmcs.h | 2 ++ xen/include/asm-x86/hvm/vmx/vmx.h | 2 ++ 3 files changed, 33 insertions(+) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index ea3d468bb0..d0c43ea0c8 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -57,6 +57,7 @@ #include #include #include +#include static bool_t __initdata opt_force_ept; boolean_param("force-ept", opt_force_ept); @@ -3544,6 +3545,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) unsigned long exit_qualification, exit_reason, idtv_info, intr_info = 0; unsigned int vector = 0, mode; struct vcpu *v = current; + bool_t exit_from_sgx_enclave; __vmread(GUEST_RIP, ®s->rip); __vmread(GUEST_RSP, ®s->rsp); @@ -3569,6 +3571,11 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) perfc_incra(vmexits, exit_reason); + /* We need to handle several VMEXITs if VMEXIT is from enclave. Also clear + * bit 27 as it is further useless. */ + exit_from_sgx_enclave = !!(exit_reason & VMX_EXIT_REASONS_FROM_ENCLAVE); + exit_reason &= ~VMX_EXIT_REASONS_FROM_ENCLAVE; + /* Handle the interrupt we missed before allowing any more in. */ switch ( (uint16_t)exit_reason ) { @@ -4070,6 +4077,18 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) break; case EXIT_REASON_INVD: + /* + * SDM 39.6.5 INVD Handling when Enclave Are Enabled + * + * INVD cause #GP if EPC is enabled. + * FIXME: WBINVD?? + */ + if ( exit_from_sgx_enclave ) + { + hvm_inject_hw_exception(TRAP_gp_fault, 0); + break; + } + /* Otherwise passthrough */ case EXIT_REASON_WBINVD: { update_guest_eip(); /* Safe: INVD, WBINVD */ @@ -4081,6 +4100,16 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) { paddr_t gpa; + /* + * Currently EPT violation from enclave is not possible as all EPC pages + * are statically allocated to guest when guest is created. We simply + * crash guest in this case. + */ + if ( exit_from_sgx_enclave ) + { + domain_crash(v->domain); + break; + } __vmread(GUEST_PHYSICAL_ADDRESS, &gpa); __vmread(EXIT_QUALIFICATION, &exit_qualification); ept_handle_violation(exit_qualification, gpa); diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h index 1350b7bc81..bbbc3d0d78 100644 --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -327,6 +327,8 @@ extern u64 vmx_ept_vpid_cap; #define VMX_INTR_SHADOW_MOV_SS 0x00000002 #define VMX_INTR_SHADOW_SMI 0x00000004 #define VMX_INTR_SHADOW_NMI 0x00000008 +#define VMX_INTR_ENCLAVE_INTR 0x00000010 /* VMEXIT was incident to + enclave mode */ #define VMX_BASIC_REVISION_MASK 0x7fffffff #define VMX_BASIC_VMCS_SIZE_MASK (0x1fffULL << 32) diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h b/xen/include/asm-x86/hvm/vmx/vmx.h index 211f5c8058..2184d35246 100644 --- a/xen/include/asm-x86/hvm/vmx/vmx.h +++ b/xen/include/asm-x86/hvm/vmx/vmx.h @@ -153,6 +153,8 @@ static inline void pi_clear_sn(struct pi_desc *pi_desc) * Exit Reasons */ #define VMX_EXIT_REASONS_FAILED_VMENTRY 0x80000000 +/* Bit 27 is also set if VMEXIT is from SGX enclave mode */ +#define VMX_EXIT_REASONS_FROM_ENCLAVE 0x08000000 #define EXIT_REASON_EXCEPTION_NMI 0 #define EXIT_REASON_EXTERNAL_INTERRUPT 1