@@ -195,11 +195,9 @@ static bool encl_add_pages(int dev_fd, unsigned long offset, void *data,
(SGX_SECINFO_REG | SGX_SECINFO_R | SGX_SECINFO_W | SGX_SECINFO_X)
static bool encl_build(int encl_fd, struct sgx_secs *secs, void *bin,
- unsigned long bin_size, struct sgx_sigstruct *sigstruct)
+ unsigned long bin_size)
{
- struct sgx_enclave_init ioc;
void *addr;
- int rc;
if (!encl_add_pages(encl_fd, 0, bin, PAGE_SIZE, SGX_SECINFO_TCS))
return false;
@@ -208,13 +206,6 @@ static bool encl_build(int encl_fd, struct sgx_secs *secs, void *bin,
bin_size - PAGE_SIZE, SGX_REG_PAGE_FLAGS))
return false;
- ioc.sigstruct = (uint64_t)sigstruct;
- rc = ioctl(encl_fd, SGX_IOC_ENCLAVE_INIT, &ioc);
- if (rc) {
- fprintf(stderr, "EINIT failed rc=%d\n", rc);
- return false;
- }
-
addr = mmap((void *)secs->base, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_FIXED, encl_fd, 0);
if (addr == MAP_FAILED) {
@@ -311,11 +302,13 @@ int main(int argc, char *argv[], char *envp[])
{
struct sgx_enclave_exception exception;
struct sgx_sigstruct sigstruct;
+ struct sgx_enclave_init ioc;
struct vdso_symtab symtab;
Elf64_Sym *eenter_sym;
uint64_t result = 0;
struct context ctx;
void *addr;
+ int ret;
context_init(&ctx);
@@ -328,15 +321,21 @@ int main(int argc, char *argv[], char *envp[])
if (!encl_data_map("encl.bin", &ctx.bin, &ctx.bin_size))
goto err;
- if (!encl_create_sigstruct(ctx.bin, ctx.bin_size, &sigstruct))
+ if (!encl_create(ctx.encl_fd, ctx.bin_size, &ctx.secs))
goto err;
- if (!encl_create(ctx.encl_fd, ctx.bin_size, &ctx.secs))
+ if (!encl_build(ctx.encl_fd, &ctx.secs, ctx.bin, ctx.bin_size))
+ goto err;
+
+ if (!encl_create_sigstruct(ctx.bin, ctx.bin_size, &sigstruct))
goto err;
- if (!encl_build(ctx.encl_fd, &ctx.secs, ctx.bin, ctx.bin_size,
- &sigstruct))
+ ioc.sigstruct = (uint64_t)&sigstruct;
+ ret = ioctl(ctx.encl_fd, SGX_IOC_ENCLAVE_INIT, &ioc);
+ if (ret) {
+ fprintf(stderr, "EINIT failed ret=%d, errno=%d\n", ret, errno);
goto err;
+ }
memset(&exception, 0, sizeof(exception));
Take EINIT out of encl_build() and move SIGSTRUCT generation and EINIT right after the encl_build() call. No reason to intertie them as they are fully independent tasks (i.e. could be even done in parallel). Cc: Sean Christopherson <sean.j.christopherson@intel.com> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> --- tools/testing/selftests/sgx/main.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-)