selftests/sgx: Assign source for each segment
authorJarkko Sakkinen <jarkko@kernel.org>
Mon, 15 Nov 2021 18:35:15 +0000 (10:35 -0800)
committerDave Hansen <dave.hansen@linux.intel.com>
Mon, 15 Nov 2021 19:34:00 +0000 (11:34 -0800)
Define source per segment so that enclave pages can be added from different
sources, e.g. anonymous VMA for zero pages. In other words, add 'src' field
to struct encl_segment, and assign it to 'encl->src' for pages inherited
from the enclave binary.

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/7850709c3089fe20e4bcecb8295ba87c54cc2b4a.1636997631.git.reinette.chatre@intel.com
tools/testing/selftests/sgx/load.c
tools/testing/selftests/sgx/main.h
tools/testing/selftests/sgx/sigstruct.c

index 3ebe5d1fe3370452de4aed346913140fbc416c9d..5605474aab73e07deec24d3ad495b5699c59f60b 100644 (file)
@@ -107,7 +107,7 @@ static bool encl_ioc_add_pages(struct encl *encl, struct encl_segment *seg)
        memset(&secinfo, 0, sizeof(secinfo));
        secinfo.flags = seg->flags;
 
-       ioc.src = (uint64_t)encl->src + seg->offset;
+       ioc.src = (uint64_t)seg->src;
        ioc.offset = seg->offset;
        ioc.length = seg->size;
        ioc.secinfo = (unsigned long)&secinfo;
@@ -216,6 +216,7 @@ bool encl_load(const char *path, struct encl *encl)
 
                if (j == 0) {
                        src_offset = phdr->p_offset & PAGE_MASK;
+                       encl->src = encl->bin + src_offset;
 
                        seg->prot = PROT_READ | PROT_WRITE;
                        seg->flags = SGX_PAGE_TYPE_TCS << 8;
@@ -228,13 +229,13 @@ bool encl_load(const char *path, struct encl *encl)
 
                seg->offset = (phdr->p_offset & PAGE_MASK) - src_offset;
                seg->size = (phdr->p_filesz + PAGE_SIZE - 1) & PAGE_MASK;
+               seg->src = encl->src + seg->offset;
 
                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;
 
index 68672fd86cf945d6249e6bb54c6677a709f303d9..452d11dc4889d9c1dbdac219d343181be7bf05b2 100644 (file)
@@ -7,6 +7,7 @@
 #define MAIN_H
 
 struct encl_segment {
+       void *src;
        off_t offset;
        size_t size;
        unsigned int prot;
index 92bbc5a15c39ff44f7be2ce5aac8eab2b9d28517..202a96fd81bf8ea3cc4d69c7daa5bf25db79b65e 100644 (file)
@@ -289,14 +289,14 @@ static bool mrenclave_eextend(EVP_MD_CTX *ctx, uint64_t offset,
 static bool mrenclave_segment(EVP_MD_CTX *ctx, struct encl *encl,
                              struct encl_segment *seg)
 {
-       uint64_t end = seg->offset + seg->size;
+       uint64_t end = seg->size;
        uint64_t offset;
 
-       for (offset = seg->offset; offset < end; offset += PAGE_SIZE) {
-               if (!mrenclave_eadd(ctx, offset, seg->flags))
+       for (offset = 0; offset < end; offset += PAGE_SIZE) {
+               if (!mrenclave_eadd(ctx, seg->offset + offset, seg->flags))
                        return false;
 
-               if (!mrenclave_eextend(ctx, offset, encl->src + offset))
+               if (!mrenclave_eextend(ctx, seg->offset + offset, seg->src + offset))
                        return false;
        }