From: Jarkko Sakkinen <jarkko@kernel.org>
To: Borislav Petkov <bp@alien8.de>
Cc: x86@kernel.org, linux-sgx@vger.kernel.org,
linux-kernel@vger.kernel.org, Shuah Khan <shuah@kernel.org>,
linux-kselftest@vger.kernel.org,
Jethro Beekman <jethro@fortanix.com>,
akpm@linux-foundation.org, andriy.shevchenko@linux.intel.com,
asapek@google.com, cedric.xing@intel.com,
chenalexchen@google.com, conradparker@google.com,
cyhanish@google.com, dave.hansen@intel.com,
haitao.huang@intel.com, kai.huang@intel.com, kai.svahn@intel.com,
kmoy@google.com, ludloff@google.com, luto@kernel.org,
nhorman@redhat.com, npmccallum@redhat.com, puiterwijk@redhat.com,
rientjes@google.com, sean.j.christopherson@intel.com,
tglx@linutronix.de, yaozhangx@google.com, mikko.ylinen@intel.com
Subject: Re: [PATCH v41 20/24] selftests/x86: Add a selftest for SGX
Date: Tue, 17 Nov 2020 23:27:42 +0200 [thread overview]
Message-ID: <20201117212742.GA14833@kernel.org> (raw)
In-Reply-To: <20201117172650.GI5719@zn.tnic>
On Tue, Nov 17, 2020 at 06:26:50PM +0100, Borislav Petkov wrote:
> On Fri, Nov 13, 2020 at 12:01:31AM +0200, Jarkko Sakkinen wrote:
> > +bool encl_load(const char *path, struct encl *encl)
> > +{
> > + Elf64_Phdr *phdr_tbl;
> > + off_t src_offset;
> > + Elf64_Ehdr *ehdr;
> > + int i, j;
> > + int ret;
> > +
> > + memset(encl, 0, sizeof(*encl));
> > +
> > + ret = open("/dev/sgx_enclave", O_RDWR);
> > + if (ret < 0) {
> > + fprintf(stderr, "Unable to open /dev/sgx_enclave\n");
> > + goto err;
> > + }
> > +
> > + encl->fd = ret;
> > +
> > + if (!encl_map_bin(path, encl))
> > + goto err;
> > +
> > + ehdr = encl->bin;
> > + phdr_tbl = encl->bin + ehdr->e_phoff;
> > +
> > + for (i = 0; i < ehdr->e_phnum; i++) {
> > + Elf64_Phdr *phdr = &phdr_tbl[i];
> > +
> > + if (phdr->p_type == PT_LOAD)
> > + encl->nr_segments++;
> > + }
> > +
> > + encl->segment_tbl = calloc(encl->nr_segments,
> > + sizeof(struct encl_segment));
> > + if (!encl->segment_tbl)
> > + goto err;
> > +
> > + for (i = 0, j = 0; i < ehdr->e_phnum; i++) {
> > + Elf64_Phdr *phdr = &phdr_tbl[i];
> > + unsigned int flags = phdr->p_flags;
> > + struct encl_segment *seg;
> > +
> > + if (phdr->p_type != PT_LOAD)
> > + continue;
> > +
> > + seg = &encl->segment_tbl[j];
> > +
> > + if (!!(flags & ~(PF_R | PF_W | PF_X))) {
> > + fprintf(stderr,
> > + "%d has invalid segment flags 0x%02x.\n", i,
> > + phdr->p_flags);
> > + goto err;
> > + }
> > +
> > + if (j == 0 && flags != (PF_R | PF_W)) {
> > + fprintf(stderr,
> > + "TCS has invalid segment flags 0x%02x.\n",
> > + phdr->p_flags);
> > + goto err;
> > + }
> > +
> > + if (j == 0) {
> > + src_offset = (phdr->p_offset & PAGE_MASK) - src_offset;
> > +
> > + seg->prot = PROT_READ | PROT_WRITE;
> > + seg->flags = SGX_PAGE_TYPE_TCS << 8;
> > + } else {
> > + seg->prot = (phdr->p_flags & PF_R) ? PROT_READ : 0;
> > + seg->prot |= (phdr->p_flags & PF_W) ? PROT_WRITE : 0;
> > + seg->prot |= (phdr->p_flags & PF_X) ? PROT_EXEC : 0;
> > + seg->flags = (SGX_PAGE_TYPE_REG << 8) | seg->prot;
> > + }
> > +
> > + seg->offset = (phdr->p_offset & PAGE_MASK) - src_offset;
> > + seg->size = (phdr->p_filesz + PAGE_SIZE - 1) & PAGE_MASK;
> > +
> > + printf("0x%016lx 0x%016lx 0x%02x\n", seg->offset, seg->size,
> > + seg->prot);
> > +
> > + j++;
> > + }
> > +
> > + assert(j == encl->nr_segments);
> > +
> > + encl->src = encl->bin + src_offset;
> > + encl->src_size = encl->segment_tbl[j - 1].offset +
> > + encl->segment_tbl[j - 1].size;
> > +
> > + for (encl->encl_size = 4096; encl->encl_size < encl->src_size; )
> > + encl->encl_size <<= 1;
>
> Something's fishy. That selftest fails with
>
> mmap: Cannot allocate memory
>
> I sprinkled some printfs at this size computation above and here's what
> it says:
>
> 0x00007fdd3b4ca190 0x0000000000002000 0x03
> 0x00007fdd3b4cc190 0x0000000000001000 0x05
> 0x00007fdd3b4cd190 0x0000000000003000 0x03
> encl_load: encl->nr_segments: 3
> encl_load: seg2 offset: 0x7fdd3b4cd190, seg2 size: 12288
> encl_load: encl_size: 140737488355328, src_size: 140588159402384
> encl_map_area: encl_size: 140737488355328
> mmap: Cannot allocate memory
>
> src_size is computed by adding the offset and size of the last segment
> which is at index 2.
src_size does not look right. I'll debug.
> The loop computes encl_size to 0x0000800000000000 then and mmap tries to
> map double that in encl_map_area(). Looks like too much to me too.
The enclave base must be naturally aligned in relative to its size.
> What's up?
>
> --
> Regards/Gruss,
> Boris.
>
> https://people.kernel.org/tglx/notes-about-netiquette
/Jarkko
next prev parent reply other threads:[~2020-11-17 21:28 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-12 22:01 [PATCH v41 00/24] Intel SGX foundations Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 01/24] x86/sgx: Add SGX architectural data structures Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 02/24] x86/sgx: Add wrappers for ENCLS functions Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 03/24] x86/cpufeatures: x86/msr: Add Intel SGX hardware bits Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 04/24] x86/cpufeatures: x86/msr: Add Intel SGX Launch Control " Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 05/24] x86/sgx: Initialize metadata for Enclave Page Cache (EPC) sections Jarkko Sakkinen
2020-11-16 22:25 ` [PATCH] x86/sgx: clarify 'laundry_list' locking Dave Hansen
2020-11-17 19:29 ` Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 06/24] x86/mm: x86/sgx: Signal SIGSEGV with PF_SGX Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 07/24] x86/cpu/intel: Detect SGX support Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 08/24] x86/cpu/intel: Add nosgx kernel parameter Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 09/24] x86/sgx: Add SGX page allocator functions Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 10/24] mm: Add 'mprotect' hook to struct vm_operations_struct Jarkko Sakkinen
2020-11-13 10:25 ` Mel Gorman
2020-11-17 18:16 ` Jarkko Sakkinen
2020-11-15 17:08 ` Dr. Greg
2020-11-15 17:32 ` Matthew Wilcox
2020-11-15 18:36 ` Dave Hansen
2020-11-16 10:09 ` Mel Gorman
2020-11-17 19:15 ` Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 11/24] x86/sgx: Add SGX misc driver interface Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 12/24] x86/sgx: Add SGX_IOC_ENCLAVE_CREATE Jarkko Sakkinen
[not found] ` <20201115044044.11040-1-hdanton@sina.com>
2020-11-17 17:35 ` Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 13/24] x86/sgx: Add SGX_IOC_ENCLAVE_ADD_PAGES Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 14/24] x86/sgx: Add SGX_IOC_ENCLAVE_INIT Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 15/24] x86/sgx: Add SGX_IOC_ENCLAVE_PROVISION Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 16/24] x86/vdso: Add support for exception fixup in vDSO functions Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 17/24] x86/fault: Add helper function to sanitize error code Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 18/24] x86/traps: Attempt to fixup exceptions in vDSO before signaling Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 19/24] x86/vdso: Implement a vDSO for Intel SGX enclave call Jarkko Sakkinen
2020-11-17 13:14 ` Borislav Petkov
2020-11-17 19:41 ` Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 20/24] selftests/x86: Add a selftest for SGX Jarkko Sakkinen
2020-11-16 18:19 ` Shuah Khan
2020-11-17 13:22 ` Borislav Petkov
2020-11-17 19:42 ` Jarkko Sakkinen
2020-11-17 17:26 ` Borislav Petkov
2020-11-17 21:27 ` Jarkko Sakkinen [this message]
2020-11-17 21:38 ` Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 21/24] x86/sgx: Add a page reclaimer Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 22/24] x86/sgx: Add ptrace() support for the SGX driver Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 23/24] docs: x86/sgx: Document SGX kernel architecture Jarkko Sakkinen
2020-11-12 22:01 ` [PATCH v41 24/24] x86/sgx: Update MAINTAINERS Jarkko Sakkinen
2020-11-16 16:55 ` [PATCH v41 00/24] Intel SGX foundations Borislav Petkov
2020-11-16 17:21 ` Dave Hansen
2020-11-16 17:28 ` Borislav Petkov
2020-11-17 19:20 ` Jarkko Sakkinen
[not found] ` <20201114084211.5284-1-hdanton@sina.com>
2020-11-16 18:33 ` [PATCH v41 05/24] x86/sgx: Initialize metadata for Enclave Page Cache (EPC) sections Dave Hansen
[not found] ` <20201115040127.7804-1-hdanton@sina.com>
2020-11-16 21:11 ` [PATCH v41 11/24] x86/sgx: Add SGX misc driver interface Dave Hansen
[not found] ` <20201114090708.8684-1-hdanton@sina.com>
2020-11-17 18:12 ` [PATCH v41 06/24] x86/mm: x86/sgx: Signal SIGSEGV with PF_SGX Jarkko Sakkinen
[not found] ` <20201114093256.7800-1-hdanton@sina.com>
2020-11-17 18:14 ` [PATCH v41 09/24] x86/sgx: Add SGX page allocator functions Jarkko Sakkinen
[not found] ` <20201115030548.1572-1-hdanton@sina.com>
2020-11-17 18:22 ` [PATCH v41 10/24] mm: Add 'mprotect' hook to struct vm_operations_struct Jarkko Sakkinen
2020-12-15 5:38 ` [PATCH v41 00/24] Intel SGX foundations Hui, Chunyang
2020-12-15 5:43 ` Hui, Chunyang
2020-12-15 15:58 ` 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=20201117212742.GA14833@kernel.org \
--to=jarkko@kernel.org \
--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=jethro@fortanix.com \
--cc=kai.huang@intel.com \
--cc=kai.svahn@intel.com \
--cc=kmoy@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-sgx@vger.kernel.org \
--cc=ludloff@google.com \
--cc=luto@kernel.org \
--cc=mikko.ylinen@intel.com \
--cc=nhorman@redhat.com \
--cc=npmccallum@redhat.com \
--cc=puiterwijk@redhat.com \
--cc=rientjes@google.com \
--cc=sean.j.christopherson@intel.com \
--cc=shuah@kernel.org \
--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 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).