From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
To: Haitao Huang <haitao.huang@linux.intel.com>
Cc: x86@kernel.org, linux-sgx@vger.kernel.org,
linux-kernel@vger.kernel.org,
Jethro Beekman <jethro@fortanix.com>,
Chunyang Hui <sanqian.hcy@antfin.com>,
Jordan Hand <jorhand@linux.microsoft.com>,
Nathaniel McCallum <npmccallum@redhat.com>,
Seth Moore <sethmo@google.com>,
Darren Kenny <darren.kenny@oracle.com>,
Sean Christopherson <sean.j.christopherson@intel.com>,
Suresh Siddha <suresh.b.siddha@intel.com>,
akpm@linux-foundation.org, andriy.shevchenko@linux.intel.com,
asapek@google.com, bp@alien8.de, cedric.xing@intel.com,
chenalexchen@google.com, conradparker@google.com,
cyhanish@google.com, dave.hansen@intel.com,
haitao.huang@intel.com, josh@joshtriplett.org,
kai.huang@intel.com, kai.svahn@intel.com, kmoy@google.com,
ludloff@google.com, luto@kernel.org, nhorman@redhat.com,
puiterwijk@redhat.com, rientjes@google.com, tglx@linutronix.de,
yaozhangx@google.com
Subject: Re: [PATCH v38 13/24] x86/sgx: Add SGX_IOC_ENCLAVE_ADD_PAGES
Date: Thu, 17 Sep 2020 19:02:06 +0300 [thread overview]
Message-ID: <20200917160206.GF8530@linux.intel.com> (raw)
In-Reply-To: <op.0q2prldowjvjmi@mqcpg7oapc828.gar.corp.intel.com>
On Thu, Sep 17, 2020 at 12:34:18AM -0500, Haitao Huang wrote:
> On Tue, 15 Sep 2020 06:05:11 -0500, Jarkko Sakkinen
> <jarkko.sakkinen@linux.intel.com> wrote:
> ...
>
> > +static int __sgx_encl_add_page(struct sgx_encl *encl,
> > + struct sgx_encl_page *encl_page,
> > + struct sgx_epc_page *epc_page,
> > + struct sgx_secinfo *secinfo, unsigned long src)
> > +{
> > + struct sgx_pageinfo pginfo;
> > + struct vm_area_struct *vma;
> > + struct page *src_page;
> > + int ret;
> > +
> > + /* Query vma's VM_MAYEXEC as an indirect path_noexec() check. */
> > + if (encl_page->vm_max_prot_bits & VM_EXEC) {
> > + vma = find_vma(current->mm, src);
> > + if (!vma)
> > + return -EFAULT;
> > +
> > + if (!(vma->vm_flags & VM_MAYEXEC))
> > + return -EACCES;
> > + }
> > +
> > + ret = get_user_pages(src, 1, 0, &src_page, NULL);
> > + if (ret < 1)
> > + return ret;
> > +
> > + pginfo.secs = (unsigned long)sgx_get_epc_addr(encl->secs.epc_page);
> > + pginfo.addr = SGX_ENCL_PAGE_ADDR(encl_page);
> > + pginfo.metadata = (unsigned long)secinfo;
> > + pginfo.contents = (unsigned long)kmap_atomic(src_page);
> > +
> > + ret = __eadd(&pginfo, sgx_get_epc_addr(epc_page));
> > +
> > + kunmap_atomic((void *)pginfo.contents);
> > + put_page(src_page);
> > +
> > + return ret ? -EIO : 0;
> > +}
> > +
> > +/*
> > + * If the caller requires measurement of the page as a proof for the
> > content,
> > + * use EEXTEND to add a measurement for 256 bytes of the page. Repeat
> > this
> > + * operation until the entire page is measured."
> > + */
> > +static int __sgx_encl_extend(struct sgx_encl *encl,
> > + struct sgx_epc_page *epc_page)
> > +{
> > + int ret;
> > + int i;
> > +
> > + for (i = 0; i < 16; i++) {
> > + ret = __eextend(sgx_get_epc_addr(encl->secs.epc_page),
> > + sgx_get_epc_addr(epc_page) + (i * 0x100));
> > + if (ret) {
> > + if (encls_failed(ret))
> > + ENCLS_WARN(ret, "EEXTEND");
> > + return -EIO;
> > + }
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +static int sgx_encl_add_page(struct sgx_encl *encl, unsigned long src,
> > + unsigned long offset, struct sgx_secinfo *secinfo,
> > + unsigned long flags)
> > +{
> > + struct sgx_encl_page *encl_page;
> > + struct sgx_epc_page *epc_page;
> > + int ret;
> > +
> > + encl_page = sgx_encl_page_alloc(encl, offset, secinfo->flags);
> > + if (IS_ERR(encl_page))
> > + return PTR_ERR(encl_page);
> > +
> > + epc_page = __sgx_alloc_epc_page();
> > + if (IS_ERR(epc_page)) {
> > + kfree(encl_page);
> > + return PTR_ERR(epc_page);
> > + }
> > +
> > + mmap_read_lock(current->mm);
> > + mutex_lock(&encl->lock);
> > +
> > + /*
> > + * Insert prior to EADD in case of OOM. EADD modifies MRENCLAVE, i.e.
> > + * can't be gracefully unwound, while failure on EADD/EXTEND is limited
> > + * to userspace errors (or kernel/hardware bugs).
> > + */
> > + ret = xa_insert(&encl->page_array, PFN_DOWN(encl_page->desc),
> > + encl_page, GFP_KERNEL);
> > + if (ret)
> > + goto err_out_unlock;
> > +
> > + ret = __sgx_encl_add_page(encl, encl_page, epc_page, secinfo,
> > + src);
> > + if (ret)
> > + goto err_out;
> > +
> > + /*
> > + * Complete the "add" before doing the "extend" so that the "add"
> > + * isn't in a half-baked state in the extremely unlikely scenario
> > + * the enclave will be destroyed in response to EEXTEND failure.
> > + */
> > + encl_page->encl = encl;
> > + encl_page->epc_page = epc_page;
> > + encl->secs_child_cnt++;
> > +
> > + if (flags & SGX_PAGE_MEASURE) {
> > + ret = __sgx_encl_extend(encl, epc_page);
> > + if (ret)
> > + goto err_out;
> > + }
> > +
> > + mutex_unlock(&encl->lock);
> > + mmap_read_unlock(current->mm);
> > + return ret;
> > +
> > +err_out:
> > + xa_erase(&encl->page_array, PFN_DOWN(encl_page->desc));
> > +
> > +err_out_unlock:
> > + mutex_unlock(&encl->lock);
> > + mmap_read_unlock(current->mm);
> > +
> > + sgx_free_epc_page(epc_page);
> > + kfree(encl_page);
> > +
> > + /*
> > + * Destroy enclave on ENCLS failure as this means that EPC has been
> > + * invalidated.
> > + */
> > + if (ret == -EIO) {
> > + mutex_lock(&encl->lock);
> > + sgx_encl_destroy(encl);
> > + mutex_unlock(&encl->lock);
> > + }
> > +
>
> I think originally we return both count of succeeded EADDs and the errors.
> So we only destroy enclaves in cases of fatal ENCLS failures.
>
> Now we only return errors in all failures other than interrupted operations
> or SGX_MAX_ADD_PAGES_LENGTH is reached.
>
> So, for the new design we should destroy enclaves in all cases here, not
> just for -EIO.
>
> On the other hand, I do like the old way returning both the count and error
> better. It helps greatly for debugging any issues in enclave image or user
> space code, and also keeps flexibility for user space to recover in certain
> errors, such as out of EPC.
Right, I do get the OOM case but wouldn't in that case the reasonable
thing to do destroy the enclave that is not even running? I mean that
means that we are globally out of EPC.
/Jarkko
next prev parent reply other threads:[~2020-09-17 16:03 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-15 11:04 [PATCH v38 00/24] Intel SGX foundations Jarkko Sakkinen
2020-09-15 11:04 ` [PATCH v38 01/24] x86/cpufeatures: x86/msr: Add Intel SGX hardware bits Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 02/24] x86/cpufeatures: x86/msr: Add Intel SGX Launch Control " Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 03/24] x86/mm: x86/sgx: Signal SIGSEGV with PF_SGX Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 04/24] x86/sgx: Add SGX microarchitectural data structures Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 05/24] x86/sgx: Add wrappers for ENCLS leaf functions Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 06/24] x86/cpu/intel: Detect SGX support Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 07/24] x86/cpu/intel: Add nosgx kernel parameter Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 08/24] x86/sgx: Initialize metadata for Enclave Page Cache (EPC) sections Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 09/24] x86/sgx: Add __sgx_alloc_epc_page() and sgx_free_epc_page() Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 10/24] mm: Add vm_ops->mprotect() Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 11/24] x86/sgx: Add SGX enclave driver Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 12/24] x86/sgx: Add SGX_IOC_ENCLAVE_CREATE Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 13/24] x86/sgx: Add SGX_IOC_ENCLAVE_ADD_PAGES Jarkko Sakkinen
[not found] ` <op.0q2prldowjvjmi@mqcpg7oapc828.gar.corp.intel.com>
2020-09-17 16:02 ` Jarkko Sakkinen [this message]
2020-09-17 18:35 ` Haitao Huang
2020-09-18 2:09 ` Sean Christopherson
2020-09-18 12:20 ` Jarkko Sakkinen
2020-09-18 12:39 ` Jarkko Sakkinen
[not found] ` <20200919000918.GB21189@sjchrist-ice>
2020-09-21 11:41 ` Jarkko Sakkinen
2020-09-21 16:46 ` Sean Christopherson
2020-09-21 18:49 ` Jarkko Sakkinen
2020-09-21 19:44 ` Jarkko Sakkinen
2020-09-21 19:57 ` Sean Christopherson
2020-09-21 21:24 ` Jarkko Sakkinen
2020-09-21 19:58 ` Jarkko Sakkinen
2020-09-17 16:03 ` Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 14/24] x86/sgx: Add SGX_IOC_ENCLAVE_INIT Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 15/24] x86/sgx: Enable provisioning for remote attestation Jarkko Sakkinen
2020-10-01 17:17 ` Sean Christopherson
2020-09-15 11:05 ` [PATCH v38 16/24] x86/sgx: Add a page reclaimer Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 17/24] x86/sgx: ptrace() support for the SGX driver Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 18/24] x86/vdso: Add support for exception fixup in vDSO functions Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 19/24] x86/fault: Add helper function to sanitize error code Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 20/24] x86/traps: Attempt to fixup exceptions in vDSO before signaling Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 21/24] x86/vdso: Implement a vDSO for Intel SGX enclave call Jarkko Sakkinen
2020-09-28 1:32 ` Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 22/24] selftests/x86: Add a selftest for SGX Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 23/24] docs: x86/sgx: Document SGX micro architecture and kernel internals Jarkko Sakkinen
2020-09-15 11:05 ` [PATCH v38 24/24] x86/sgx: Update MAINTAINERS Jarkko Sakkinen
-- strict thread matches above, loose matches on Subject: below --
2020-09-15 11:28 [PATCH v38 00/24] Intel SGX foundations Jarkko Sakkinen
2020-09-15 11:28 ` [PATCH v38 13/24] x86/sgx: Add SGX_IOC_ENCLAVE_ADD_PAGES 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=20200917160206.GF8530@linux.intel.com \
--to=jarkko.sakkinen@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=asapek@google.com \
--cc=bp@alien8.de \
--cc=cedric.xing@intel.com \
--cc=chenalexchen@google.com \
--cc=conradparker@google.com \
--cc=cyhanish@google.com \
--cc=darren.kenny@oracle.com \
--cc=dave.hansen@intel.com \
--cc=haitao.huang@intel.com \
--cc=haitao.huang@linux.intel.com \
--cc=jethro@fortanix.com \
--cc=jorhand@linux.microsoft.com \
--cc=josh@joshtriplett.org \
--cc=kai.huang@intel.com \
--cc=kai.svahn@intel.com \
--cc=kmoy@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sgx@vger.kernel.org \
--cc=ludloff@google.com \
--cc=luto@kernel.org \
--cc=nhorman@redhat.com \
--cc=npmccallum@redhat.com \
--cc=puiterwijk@redhat.com \
--cc=rientjes@google.com \
--cc=sanqian.hcy@antfin.com \
--cc=sean.j.christopherson@intel.com \
--cc=sethmo@google.com \
--cc=suresh.b.siddha@intel.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=yaozhangx@google.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.