From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
To: Matthew Wilcox <willy@infradead.org>
Cc: x86@kernel.org, linux-sgx@vger.kernel.org,
linux-kernel@vger.kernel.org,
linux-security-module@vger.kernel.org, linux-mm@kvack.org,
Andrew Morton <akpm@linux-foundation.org>,
Jethro Beekman <jethro@fortanix.com>,
Haitao Huang <haitao.huang@linux.intel.com>,
Chunyang Hui <sanqian.hcy@antfin.com>,
Jordan Hand <jorhand@linux.microsoft.com>,
Nathaniel McCallum <npmccallum@redhat.com>,
Seth Moore <sethmo@google.com>,
Sean Christopherson <sean.j.christopherson@intel.com>,
Suresh Siddha <suresh.b.siddha@intel.com>,
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 v34 11/24] x86/sgx: Add SGX enclave driver
Date: Tue, 7 Jul 2020 07:11:51 +0300 [thread overview]
Message-ID: <20200707041151.GE143804@linux.intel.com> (raw)
In-Reply-To: <20200707033617.GF25523@casper.infradead.org>
On Tue, Jul 07, 2020 at 04:36:17AM +0100, Matthew Wilcox wrote:
> On Tue, Jul 07, 2020 at 06:01:51AM +0300, Jarkko Sakkinen wrote:
> > Intel Software Guard eXtensions (SGX) is a set of CPU instructions that
> > can be used by applications to set aside private regions of code and
> > data. The code outside the SGX hosted software entity is disallowed to
>
> s/disallowed to/prevented from/
>
> > access the memory inside the enclave enforced by the CPU. We call these
>
> s/enforced//
>
> > entities enclaves.
> >
> > Add a driver that provides an ioctl API to construct and run enclaves.
> > Enclaves are constructed from pages residing in reserved physical memory
> > areas. The contents of these pages can only be accessed when they are
> > mapped as part of an enclave, by a hardware thread running inside the
> > enclave.
> >
> > The starting state of an enclave consists of a fixed measured set of
> > pages that are copied to the EPC during the construction process by
> > using ENCLS leaf functions and Software Enclave Control Structure (SECS)
> > that defines the enclave properties.
> >
> > Enclaves are constructed by using ENCLS leaf functions ECREATE, EADD and
> > EINIT. ECREATE initializes SECS, EADD copies pages from system memory to
> > the EPC and EINIT checks a given signed measurement and moves the enclave
> > into a state ready for execution.
>
> What's a leaf function? Is it like a CPU instruction?
Yeah, the opcode is ENCLS for ring-0 (enclave management and
construction) and ENCLU for ring-3 (entrance to the enclave etc).
The leaf function number goes to EAX.
>
> > The mmap() permissions are capped by the contained enclave page
> > permissions. The mapped areas must also be opaque, i.e. each page address
> > must contain a page. This logic is implemented in sgx_encl_may_map().
>
> do you mean "populated" instead of "opaque"?
Yes, that would be a better word to use. I'll change this.
>
> > + atomic_set(&encl->flags, 0);
> > + kref_init(&encl->refcount);
> > + INIT_RADIX_TREE(&encl->page_tree, GFP_KERNEL);
>
> Why are you using a radix tree instead of an xarray?
Because xarray did not exist in 2017 and nobody has pointed out to use
it. Now I know it exists (yet do not know what it is).
>
> > +int sgx_encl_may_map(struct sgx_encl *encl, unsigned long start,
> > + unsigned long end, unsigned long vm_prot_bits)
> > +{
> > + unsigned long idx, idx_start, idx_end;
> > + struct sgx_encl_page *page;
> > +
> > + /*
> > + * Disallow RIE tasks as their VMA permissions might conflict with the
> > + * enclave page permissions.
> > + */
> > + if (!!(current->personality & READ_IMPLIES_EXEC))
> > + return -EACCES;
> > +
> > + idx_start = PFN_DOWN(start);
> > + idx_end = PFN_DOWN(end - 1);
> > +
> > + for (idx = idx_start; idx <= idx_end; ++idx) {
> > + mutex_lock(&encl->lock);
> > + page = radix_tree_lookup(&encl->page_tree, idx);
> > + mutex_unlock(&encl->lock);
> > +
> > + if (!page || (~page->vm_max_prot_bits & vm_prot_bits))
> > + return -EACCES;
>
> You should really use an iterator here instead of repeated lookups.
> xas_for_each() will probably be what you want.
Thank you for your remarks. I'll look into using xarray for this.
/Jarkko
next prev parent reply other threads:[~2020-07-07 4:12 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-07 3:01 [PATCH v34 00/24] Intel SGX foundations Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 01/24] x86/cpufeatures: x86/msr: Add Intel SGX hardware bits Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 02/24] x86/cpufeatures: x86/msr: Add Intel SGX Launch Control " Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 03/24] x86/mm: x86/sgx: Signal SIGSEGV with PF_SGX Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 04/24] x86/sgx: Add SGX microarchitectural data structures Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 05/24] x86/sgx: Add wrappers for ENCLS leaf functions Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 06/24] x86/cpu/intel: Detect SGX support Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 07/24] x86/cpu/intel: Add nosgx kernel parameter Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 08/24] x86/sgx: Initialize metadata for Enclave Page Cache (EPC) sections Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 09/24] x86/sgx: Add __sgx_alloc_epc_page() and sgx_free_epc_page() Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 10/24] mm: Add vm_ops->mprotect() Jarkko Sakkinen
2020-07-07 3:14 ` Matthew Wilcox
2020-07-07 3:22 ` Sean Christopherson
2020-07-07 3:24 ` Matthew Wilcox
2020-07-07 4:01 ` Jarkko Sakkinen
2020-07-07 4:10 ` Matthew Wilcox
2020-07-08 14:33 ` Jarkko Sakkinen
2020-07-08 14:37 ` Matthew Wilcox
2020-07-08 16:10 ` Jarkko Sakkinen
2020-07-08 22:56 ` Jarkko Sakkinen
2020-07-07 4:03 ` Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 11/24] x86/sgx: Add SGX enclave driver Jarkko Sakkinen
2020-07-07 3:36 ` Matthew Wilcox
2020-07-07 4:11 ` Jarkko Sakkinen [this message]
2020-07-07 4:29 ` Sean Christopherson
2020-07-07 4:39 ` Matthew Wilcox
2020-07-07 4:46 ` Sean Christopherson
2020-07-07 3:01 ` [PATCH v34 12/24] x86/sgx: Add SGX_IOC_ENCLAVE_CREATE Jarkko Sakkinen
2020-07-07 3:29 ` Sean Christopherson
2020-07-07 4:04 ` Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 13/24] x86/sgx: Add SGX_IOC_ENCLAVE_ADD_PAGES Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 14/24] x86/sgx: Add SGX_IOC_ENCLAVE_INIT Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 15/24] x86/sgx: Allow a limited use of ATTRIBUTE.PROVISIONKEY for attestation Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 16/24] x86/sgx: Add a page reclaimer Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 17/24] x86/sgx: ptrace() support for the SGX driver Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 18/24] x86/vdso: Add support for exception fixup in vDSO functions Jarkko Sakkinen
2020-07-07 3:01 ` [PATCH v34 19/24] x86/fault: Add helper function to sanitize error code Jarkko Sakkinen
2020-07-07 3:02 ` [PATCH v34 20/24] x86/traps: Attempt to fixup exceptions in vDSO before signaling Jarkko Sakkinen
2020-07-07 3:02 ` [PATCH v34 21/24] x86/vdso: Implement a vDSO for Intel SGX enclave call Jarkko Sakkinen
2020-07-07 3:02 ` [PATCH v34 22/24] selftests/x86: Add a selftest for SGX Jarkko Sakkinen
2020-07-07 3:02 ` [PATCH v34 23/24] docs: x86/sgx: Document SGX micro architecture and kernel internals Jarkko Sakkinen
2020-07-07 3:02 ` [PATCH v34 24/24] x86/sgx: Update MAINTAINERS 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=20200707041151.GE143804@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=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-mm@kvack.org \
--cc=linux-security-module@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=willy@infradead.org \
--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.