diff mbox series

[5/5] selftests/sgx: Load encl.elf directly in the test program

Message ID 20200323034634.4157-5-jarkko.sakkinen@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series [1/5] selftests/sgx: Add PHDRS to encl.lds | expand

Commit Message

Jarkko Sakkinen March 23, 2020, 3:46 a.m. UTC
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(-)
diff mbox series

Patch

diff --git a/tools/testing/selftests/sgx/Makefile b/tools/testing/selftests/sgx/Makefile
index d9c3b3a1983b..48a2cda6c34d 100644
--- a/tools/testing/selftests/sgx/Makefile
+++ b/tools/testing/selftests/sgx/Makefile
@@ -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 \
-
diff --git a/tools/testing/selftests/sgx/defines.h b/tools/testing/selftests/sgx/defines.h
index 8f4d17cf8cee..1802cace7527 100644
--- a/tools/testing/selftests/sgx/defines.h
+++ b/tools/testing/selftests/sgx/defines.h
@@ -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))
diff --git a/tools/testing/selftests/sgx/main.c b/tools/testing/selftests/sgx/main.c
index a78e64159313..a0a37d85714b 100644
--- a/tools/testing/selftests/sgx/main.c
+++ b/tools/testing/selftests/sgx/main.c
@@ -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;