linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Reinette Chatre <reinette.chatre@intel.com>
To: dave.hansen@linux.intel.com, jarkko@kernel.org,
	tglx@linutronix.de, bp@alien8.de, luto@kernel.org,
	mingo@redhat.com, linux-sgx@vger.kernel.org, x86@kernel.org,
	shuah@kernel.org, linux-kselftest@vger.kernel.org
Cc: seanjc@google.com, kai.huang@intel.com, cathy.zhang@intel.com,
	cedric.xing@intel.com, haitao.huang@intel.com,
	mark.shanahan@intel.com, vijay.dhanraj@intel.com, hpa@zytor.com,
	linux-kernel@vger.kernel.org
Subject: [PATCH V4 05/31] x86/sgx: Support loading enclave page without VMA permissions check
Date: Wed, 13 Apr 2022 14:10:05 -0700	[thread overview]
Message-ID: <db3a14f2d2df7678dec23375d48c96b603f8cfb5.1649878359.git.reinette.chatre@intel.com> (raw)
In-Reply-To: <cover.1649878359.git.reinette.chatre@intel.com>

sgx_encl_load_page() is used to find and load an enclave page into
enclave (EPC) memory, potentially loading it from the backing storage.
Both usages of sgx_encl_load_page() are during an access to the
enclave page from a VMA and thus the permissions of the VMA are
considered before the enclave page is loaded.

SGX2 functions operating on enclave pages belonging to an initialized
enclave requiring the page to be in EPC. It is thus required to
support loading enclave pages into the EPC independent from a VMA.

Split the current sgx_encl_load_page() to support the two usages:
A new call, sgx_encl_load_page_in_vma(), behaves exactly like the
current sgx_encl_load_page() that takes VMA permissions into account,
while sgx_encl_load_page() just loads an enclave page into EPC.

VMA, PTE, and EPCM permissions continue to dictate whether
the pages can be accessed from within an enclave.

Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
---
Changes since V3:
- Add Jarkko's Reviewed-by tag.

Changes since V2:
- New patch

 arch/x86/kernel/cpu/sgx/encl.c | 57 ++++++++++++++++++++++------------
 arch/x86/kernel/cpu/sgx/encl.h |  2 ++
 2 files changed, 40 insertions(+), 19 deletions(-)

diff --git a/arch/x86/kernel/cpu/sgx/encl.c b/arch/x86/kernel/cpu/sgx/encl.c
index 7c63a1911fae..05ae1168391c 100644
--- a/arch/x86/kernel/cpu/sgx/encl.c
+++ b/arch/x86/kernel/cpu/sgx/encl.c
@@ -131,25 +131,10 @@ static struct sgx_epc_page *sgx_encl_eldu(struct sgx_encl_page *encl_page,
 	return epc_page;
 }
 
-static struct sgx_encl_page *sgx_encl_load_page(struct sgx_encl *encl,
-						unsigned long addr,
-						unsigned long vm_flags)
+static struct sgx_encl_page *__sgx_encl_load_page(struct sgx_encl *encl,
+						  struct sgx_encl_page *entry)
 {
-	unsigned long vm_prot_bits = vm_flags & (VM_READ | VM_WRITE | VM_EXEC);
 	struct sgx_epc_page *epc_page;
-	struct sgx_encl_page *entry;
-
-	entry = xa_load(&encl->page_array, PFN_DOWN(addr));
-	if (!entry)
-		return ERR_PTR(-EFAULT);
-
-	/*
-	 * Verify that the faulted page has equal or higher build time
-	 * permissions than the VMA permissions (i.e. the subset of {VM_READ,
-	 * VM_WRITE, VM_EXECUTE} in vma->vm_flags).
-	 */
-	if ((entry->vm_max_prot_bits & vm_prot_bits) != vm_prot_bits)
-		return ERR_PTR(-EFAULT);
 
 	/* Entry successfully located. */
 	if (entry->epc_page) {
@@ -175,6 +160,40 @@ static struct sgx_encl_page *sgx_encl_load_page(struct sgx_encl *encl,
 	return entry;
 }
 
+static struct sgx_encl_page *sgx_encl_load_page_in_vma(struct sgx_encl *encl,
+						       unsigned long addr,
+						       unsigned long vm_flags)
+{
+	unsigned long vm_prot_bits = vm_flags & (VM_READ | VM_WRITE | VM_EXEC);
+	struct sgx_encl_page *entry;
+
+	entry = xa_load(&encl->page_array, PFN_DOWN(addr));
+	if (!entry)
+		return ERR_PTR(-EFAULT);
+
+	/*
+	 * Verify that the page has equal or higher build time
+	 * permissions than the VMA permissions (i.e. the subset of {VM_READ,
+	 * VM_WRITE, VM_EXECUTE} in vma->vm_flags).
+	 */
+	if ((entry->vm_max_prot_bits & vm_prot_bits) != vm_prot_bits)
+		return ERR_PTR(-EFAULT);
+
+	return __sgx_encl_load_page(encl, entry);
+}
+
+struct sgx_encl_page *sgx_encl_load_page(struct sgx_encl *encl,
+					 unsigned long addr)
+{
+	struct sgx_encl_page *entry;
+
+	entry = xa_load(&encl->page_array, PFN_DOWN(addr));
+	if (!entry)
+		return ERR_PTR(-EFAULT);
+
+	return __sgx_encl_load_page(encl, entry);
+}
+
 static vm_fault_t sgx_vma_fault(struct vm_fault *vmf)
 {
 	unsigned long addr = (unsigned long)vmf->address;
@@ -196,7 +215,7 @@ static vm_fault_t sgx_vma_fault(struct vm_fault *vmf)
 
 	mutex_lock(&encl->lock);
 
-	entry = sgx_encl_load_page(encl, addr, vma->vm_flags);
+	entry = sgx_encl_load_page_in_vma(encl, addr, vma->vm_flags);
 	if (IS_ERR(entry)) {
 		mutex_unlock(&encl->lock);
 
@@ -344,7 +363,7 @@ static struct sgx_encl_page *sgx_encl_reserve_page(struct sgx_encl *encl,
 	for ( ; ; ) {
 		mutex_lock(&encl->lock);
 
-		entry = sgx_encl_load_page(encl, addr, vm_flags);
+		entry = sgx_encl_load_page_in_vma(encl, addr, vm_flags);
 		if (PTR_ERR(entry) != -EBUSY)
 			break;
 
diff --git a/arch/x86/kernel/cpu/sgx/encl.h b/arch/x86/kernel/cpu/sgx/encl.h
index fec43ca65065..6b34efba1602 100644
--- a/arch/x86/kernel/cpu/sgx/encl.h
+++ b/arch/x86/kernel/cpu/sgx/encl.h
@@ -116,5 +116,7 @@ unsigned int sgx_alloc_va_slot(struct sgx_va_page *va_page);
 void sgx_free_va_slot(struct sgx_va_page *va_page, unsigned int offset);
 bool sgx_va_page_full(struct sgx_va_page *va_page);
 void sgx_encl_free_epc_page(struct sgx_epc_page *page);
+struct sgx_encl_page *sgx_encl_load_page(struct sgx_encl *encl,
+					 unsigned long addr);
 
 #endif /* _X86_ENCL_H */
-- 
2.25.1


  parent reply	other threads:[~2022-04-13 21:12 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-13 21:10 [PATCH V4 00/31] x86/sgx and selftests/sgx: Support SGX2 Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 01/31] x86/sgx: Add short descriptions to ENCLS wrappers Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 02/31] x86/sgx: Add wrapper for SGX2 EMODPR function Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 03/31] x86/sgx: Add wrapper for SGX2 EMODT function Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 04/31] x86/sgx: Add wrapper for SGX2 EAUG function Reinette Chatre
2022-04-13 21:10 ` Reinette Chatre [this message]
2022-04-13 21:10 ` [PATCH V4 06/31] x86/sgx: Export sgx_encl_ewb_cpumask() Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 07/31] x86/sgx: Rename sgx_encl_ewb_cpumask() as sgx_encl_cpumask() Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 08/31] x86/sgx: Move PTE zap code to new sgx_zap_enclave_ptes() Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 09/31] x86/sgx: Make sgx_ipi_cb() available internally Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 10/31] x86/sgx: Create utility to validate user provided offset and length Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 11/31] x86/sgx: Keep record of SGX page type Reinette Chatre
2022-04-14 11:12   ` Jarkko Sakkinen
2022-04-14 16:27     ` Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 12/31] x86/sgx: Export sgx_encl_{grow,shrink}() Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 13/31] x86/sgx: Export sgx_encl_page_alloc() Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 14/31] x86/sgx: Support VA page allocation without reclaiming Reinette Chatre
2022-04-14 11:18   ` Jarkko Sakkinen
2022-04-14 16:30     ` Reinette Chatre
2022-04-15 13:54       ` Haitao Huang
2022-04-15 15:22         ` Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 15/31] x86/sgx: Support restricting of enclave page permissions Reinette Chatre
2022-04-14 11:19   ` Jarkko Sakkinen
2022-04-14 11:19     ` Jarkko Sakkinen
2022-04-14 16:31       ` Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 16/31] x86/sgx: Support adding of pages to an initialized enclave Reinette Chatre
2022-04-14 11:20   ` Jarkko Sakkinen
2022-04-14 16:31     ` Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 17/31] x86/sgx: Tighten accessible memory range after enclave initialization Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 18/31] x86/sgx: Support modifying SGX page type Reinette Chatre
2022-04-14 11:11   ` Jarkko Sakkinen
2022-04-14 16:32     ` Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 19/31] x86/sgx: Support complete page removal Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 20/31] x86/sgx: Free up EPC pages directly to support large page ranges Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 21/31] Documentation/x86: Introduce enclave runtime management section Reinette Chatre
2022-04-14 11:21   ` Jarkko Sakkinen
2022-04-14 16:32     ` Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 22/31] selftests/sgx: Add test for EPCM permission changes Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 23/31] selftests/sgx: Add test for TCS page " Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 24/31] selftests/sgx: Test two different SGX2 EAUG flows Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 25/31] selftests/sgx: Introduce dynamic entry point Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 26/31] selftests/sgx: Introduce TCS initialization enclave operation Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 27/31] selftests/sgx: Test complete changing of page type flow Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 28/31] selftests/sgx: Test faulty enclave behavior Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 29/31] selftests/sgx: Test invalid access to removed enclave page Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 30/31] selftests/sgx: Test reclaiming of untouched page Reinette Chatre
2022-04-13 21:10 ` [PATCH V4 31/31] selftests/sgx: Page removal stress test Reinette Chatre
2022-04-14 11:25 ` [PATCH V4 00/31] x86/sgx and selftests/sgx: Support SGX2 Jarkko Sakkinen
2022-04-14 16:34   ` Reinette Chatre
2022-04-14 16:55     ` Jarkko Sakkinen
2022-04-14 18:35       ` Dhanraj, Vijay
2022-04-17 14:58         ` Jarkko Sakkinen
2022-04-21 23:46           ` Dhanraj, Vijay
2022-04-22  3:29             ` Reinette Chatre
2022-04-22  9:16               ` Jarkko Sakkinen
2022-04-22 13:17                 ` Jarkko Sakkinen
2022-04-25 20:17                 ` Dhanraj, Vijay
2022-04-25 23:56                   ` Reinette Chatre
2022-04-26  4:10                     ` Jarkko Sakkinen
2022-04-22  9:14             ` Jarkko Sakkinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=db3a14f2d2df7678dec23375d48c96b603f8cfb5.1649878359.git.reinette.chatre@intel.com \
    --to=reinette.chatre@intel.com \
    --cc=bp@alien8.de \
    --cc=cathy.zhang@intel.com \
    --cc=cedric.xing@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=haitao.huang@intel.com \
    --cc=hpa@zytor.com \
    --cc=jarkko@kernel.org \
    --cc=kai.huang@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-sgx@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mark.shanahan@intel.com \
    --cc=mingo@redhat.com \
    --cc=seanjc@google.com \
    --cc=shuah@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=vijay.dhanraj@intel.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).