selftests/sgx: Encpsulate the test enclave creation
authorJarkko Sakkinen <jarkko@kernel.org>
Mon, 15 Nov 2021 18:35:19 +0000 (10:35 -0800)
committerDave Hansen <dave.hansen@linux.intel.com>
Mon, 15 Nov 2021 19:34:05 +0000 (11:34 -0800)
Introduce setup_test_encl() so that the enclave creation can be moved to
TEST_F()'s. This is required for a reclaimer test where the heap size needs
to be set large enough to triger the page reclaimer.

Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
Link: https://lkml.kernel.org/r/bee0ca867a95828a569c1ba2a8e443a44047dc71.1636997631.git.reinette.chatre@intel.com
tools/testing/selftests/sgx/main.c

index deab02f2f3cebf0c8b421c9c10260e81583535c2..5b3e49a3634402de4ef4be495aa7fb47784e7439 100644 (file)
@@ -112,7 +112,8 @@ FIXTURE(enclave) {
        struct sgx_enclave_run run;
 };
 
-FIXTURE_SETUP(enclave)
+static bool setup_test_encl(unsigned long heap_size, struct encl *encl,
+                           struct __test_metadata *_metadata)
 {
        Elf64_Sym *sgx_enter_enclave_sym = NULL;
        struct vdso_symtab symtab;
@@ -122,25 +123,25 @@ FIXTURE_SETUP(enclave)
        unsigned int i;
        void *addr;
 
-       if (!encl_load("test_encl.elf", &self->encl, ENCL_HEAP_SIZE_DEFAULT)) {
-               encl_delete(&self->encl);
-               ksft_exit_skip("cannot load enclaves\n");
+       if (!encl_load("test_encl.elf", encl, heap_size)) {
+               encl_delete(encl);
+               TH_LOG("Failed to load the test enclave.\n");
        }
 
-       if (!encl_measure(&self->encl))
+       if (!encl_measure(encl))
                goto err;
 
-       if (!encl_build(&self->encl))
+       if (!encl_build(encl))
                goto err;
 
        /*
         * An enclave consumer only must do this.
         */
-       for (i = 0; i < self->encl.nr_segments; i++) {
-               struct encl_segment *seg = &self->encl.segment_tbl[i];
+       for (i = 0; i < encl->nr_segments; i++) {
+               struct encl_segment *seg = &encl->segment_tbl[i];
 
-               addr = mmap((void *)self->encl.encl_base + seg->offset, seg->size,
-                           seg->prot, MAP_SHARED | MAP_FIXED, self->encl.fd, 0);
+               addr = mmap((void *)encl->encl_base + seg->offset, seg->size,
+                           seg->prot, MAP_SHARED | MAP_FIXED, encl->fd, 0);
                EXPECT_NE(addr, MAP_FAILED);
                if (addr == MAP_FAILED)
                        goto err;
@@ -160,16 +161,13 @@ FIXTURE_SETUP(enclave)
 
        vdso_sgx_enter_enclave = addr + sgx_enter_enclave_sym->st_value;
 
-       memset(&self->run, 0, sizeof(self->run));
-       self->run.tcs = self->encl.encl_base;
-
-       return;
+       return true;
 
 err:
-       encl_delete(&self->encl);
+       encl_delete(encl);
 
-       for (i = 0; i < self->encl.nr_segments; i++) {
-               seg = &self->encl.segment_tbl[i];
+       for (i = 0; i < encl->nr_segments; i++) {
+               seg = &encl->segment_tbl[i];
 
                TH_LOG("0x%016lx 0x%016lx 0x%02x", seg->offset, seg->size, seg->prot);
        }
@@ -186,7 +184,17 @@ err:
                fclose(maps_file);
        }
 
-       ASSERT_TRUE(false);
+       TH_LOG("Failed to initialize the test enclave.\n");
+
+       return false;
+}
+
+FIXTURE_SETUP(enclave)
+{
+       ASSERT_TRUE(setup_test_encl(ENCL_HEAP_SIZE_DEFAULT, &self->encl, _metadata));
+
+       memset(&self->run, 0, sizeof(self->run));
+       self->run.tcs = self->encl.encl_base;
 }
 
 FIXTURE_TEARDOWN(enclave)