@@ -16,7 +16,7 @@ HOST_CFLAGS := -Wall -Werror -g $(INCLUDES) -fPIC -z noexecstack
ENCL_CFLAGS := -Wall -Werror -static -nostdlib -nostartfiles -fPIC \
-fno-stack-protector -mrdrnd $(INCLUDES)
-TEST_CUSTOM_PROGS := $(OUTPUT)/test_sgx $(OUTPUT)/encl.bin
+TEST_CUSTOM_PROGS := $(OUTPUT)/test_sgx $(OUTPUT)/encl.elf
ifeq ($(CAN_BUILD_X86_64), 1)
all: $(TEST_CUSTOM_PROGS)
@@ -34,16 +34,13 @@ $(OUTPUT)/sign.o: sign.c
$(OUTPUT)/call.o: call.S
$(CC) $(HOST_CFLAGS) -c $< -o $@
-$(OUTPUT)/encl.bin: $(OUTPUT)/encl.elf
- $(OBJCOPY) -O binary $< $@
-
$(OUTPUT)/encl.elf: encl.lds encl.c encl_bootstrap.S
$(CC) $(ENCL_CFLAGS) -T $^ -o $@
EXTRA_CLEAN := \
- $(OUTPUT)/encl.bin \
$(OUTPUT)/encl.elf \
- $(OUTPUT)/sgx_call.o \
+ $(OUTPUT)/call.o \
+ $(OUTPUT)/main.o \
+ $(OUTPUT)/sign.o \
$(OUTPUT)/test_sgx \
$(OUTPUT)/test_sgx.o \
-
@@ -9,6 +9,7 @@
#include <stdint.h>
#define PAGE_SIZE 4096
+#define PAGE_MASK (~(PAGE_SIZE - 1))
#define __aligned(x) __attribute__((__aligned__(x)))
#define __packed __attribute__((packed))
@@ -223,11 +223,6 @@ bool get_file_size(const char *path, off_t *bin_size)
return false;
}
- if (!sb.st_size || sb.st_size & 0xfff) {
- fprintf(stderr, "Invalid blob size %lu\n", sb.st_size);
- return false;
- }
-
*bin_size = sb.st_size;
return true;
}
@@ -291,12 +286,17 @@ int main(int argc, char *argv[], char *envp[])
struct sgx_enclave_exception exception;
struct sgx_sigstruct sigstruct;
struct sgx_enclave_init ioc;
+ Elf64_Phdr *phdr, *phdr_tbl;
+ unsigned long start_offset;
struct vdso_symtab symtab;
+ unsigned long encl_size;
Elf64_Sym *eenter_sym;
uint64_t result = 0;
struct context ctx;
+ Elf64_Ehdr *ehdr;
void *addr;
int ret;
+ int i;
context_init(&ctx);
@@ -306,25 +306,49 @@ int main(int argc, char *argv[], char *envp[])
goto err;
}
- if (!encl_data_map("encl.bin", &ctx.bin, &ctx.bin_size))
+ if (!encl_data_map("encl.elf", &ctx.bin, &ctx.bin_size))
goto err;
- if (!encl_create(ctx.encl_fd, ctx.bin_size, &ctx.secs))
+ ehdr = ctx.bin;
+ phdr_tbl = ctx.bin + ehdr->e_phoff;
+ start_offset = 0;
+ encl_size = 0;
+
+ for (i = 0; i < ehdr->e_phnum; i++) {
+ unsigned long offset, size;
+
+ phdr = &phdr_tbl[i];
+ if (phdr->p_type != PT_LOAD)
+ continue;
+
+ offset = phdr->p_offset & PAGE_MASK;
+ if (!start_offset)
+ start_offset = offset;
+
+ size = (offset - start_offset + phdr->p_filesz +
+ PAGE_SIZE - 1) & PAGE_MASK;
+ if (size > encl_size)
+ encl_size = size;
+ }
+
+ if (!encl_create(ctx.encl_fd, encl_size, &ctx.secs))
goto err;
/* TCS */
- if (!encl_build_segment(ctx.encl_fd, &ctx.secs, ctx.bin, 0, PAGE_SIZE,
- SGX_SECINFO_TCS, PROT_READ | PROT_WRITE))
+ if (!encl_build_segment(ctx.encl_fd, &ctx.secs, ctx.bin + start_offset,
+ 0, PAGE_SIZE, SGX_SECINFO_TCS,
+ PROT_READ | PROT_WRITE))
goto err;
- if (!encl_build_segment(ctx.encl_fd, &ctx.secs, ctx.bin, PAGE_SIZE,
- ctx.bin_size - PAGE_SIZE,
+ if (!encl_build_segment(ctx.encl_fd, &ctx.secs, ctx.bin + start_offset,
+ PAGE_SIZE, encl_size - PAGE_SIZE,
SGX_SECINFO_REG | SGX_SECINFO_R |
SGX_SECINFO_W | SGX_SECINFO_X,
PROT_READ | PROT_WRITE | PROT_EXEC))
goto err;
- if (!encl_create_sigstruct(ctx.bin, ctx.bin_size, &sigstruct))
+ if (!encl_create_sigstruct(ctx.bin + start_offset, encl_size,
+ &sigstruct))
goto err;
ioc.sigstruct = (uint64_t)&sigstruct;
To make test program more realistic and robust, load the test enclave directly from encl.elf. Cc: Sean Christopherson <sean.j.christopherson@intel.com> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> --- tools/testing/selftests/sgx/Makefile | 11 +++--- tools/testing/selftests/sgx/defines.h | 1 + tools/testing/selftests/sgx/main.c | 48 ++++++++++++++++++++------- 3 files changed, 41 insertions(+), 19 deletions(-)