Lines Matching refs:encl
22 void encl_delete(struct encl *encl) in encl_delete() argument
24 if (encl->encl_base) in encl_delete()
25 munmap((void *)encl->encl_base, encl->encl_size); in encl_delete()
27 if (encl->bin) in encl_delete()
28 munmap(encl->bin, encl->bin_size); in encl_delete()
30 if (encl->fd) in encl_delete()
31 close(encl->fd); in encl_delete()
33 if (encl->segment_tbl) in encl_delete()
34 free(encl->segment_tbl); in encl_delete()
36 memset(encl, 0, sizeof(*encl)); in encl_delete()
39 static bool encl_map_bin(const char *path, struct encl *encl) in encl_map_bin() argument
64 encl->bin = bin; in encl_map_bin()
65 encl->bin_size = sb.st_size; in encl_map_bin()
75 static bool encl_ioc_create(struct encl *encl) in encl_ioc_create() argument
77 struct sgx_secs *secs = &encl->secs; in encl_ioc_create()
81 assert(encl->encl_base != 0); in encl_ioc_create()
87 secs->base = encl->encl_base; in encl_ioc_create()
88 secs->size = encl->encl_size; in encl_ioc_create()
91 rc = ioctl(encl->fd, SGX_IOC_ENCLAVE_CREATE, &ioc); in encl_ioc_create()
94 munmap((void *)secs->base, encl->encl_size); in encl_ioc_create()
101 static bool encl_ioc_add_pages(struct encl *encl, struct encl_segment *seg) in encl_ioc_add_pages() argument
110 ioc.src = (uint64_t)encl->src + seg->offset; in encl_ioc_add_pages()
116 rc = ioctl(encl->fd, SGX_IOC_ENCLAVE_ADD_PAGES, &ioc); in encl_ioc_add_pages()
127 bool encl_load(const char *path, struct encl *encl) in encl_load() argument
139 memset(encl, 0, sizeof(*encl)); in encl_load()
173 encl->fd = fd; in encl_load()
175 if (!encl_map_bin(path, encl)) in encl_load()
178 ehdr = encl->bin; in encl_load()
179 phdr_tbl = encl->bin + ehdr->e_phoff; in encl_load()
185 encl->nr_segments++; in encl_load()
188 encl->segment_tbl = calloc(encl->nr_segments, in encl_load()
190 if (!encl->segment_tbl) in encl_load()
201 seg = &encl->segment_tbl[j]; in encl_load()
235 assert(j == encl->nr_segments); in encl_load()
237 encl->src = encl->bin + src_offset; in encl_load()
238 encl->src_size = encl->segment_tbl[j - 1].offset + in encl_load()
239 encl->segment_tbl[j - 1].size; in encl_load()
241 for (encl->encl_size = 4096; encl->encl_size < encl->src_size; ) in encl_load()
242 encl->encl_size <<= 1; in encl_load()
249 encl_delete(encl); in encl_load()
253 static bool encl_map_area(struct encl *encl) in encl_map_area() argument
255 size_t encl_size = encl->encl_size; in encl_map_area()
265 encl->encl_base = ((uint64_t)area + encl_size - 1) & ~(encl_size - 1); in encl_map_area()
267 munmap(area, encl->encl_base - (uint64_t)area); in encl_map_area()
268 munmap((void *)(encl->encl_base + encl_size), in encl_map_area()
269 (uint64_t)area + encl_size - encl->encl_base); in encl_map_area()
274 bool encl_build(struct encl *encl) in encl_build() argument
280 if (!encl_map_area(encl)) in encl_build()
283 if (!encl_ioc_create(encl)) in encl_build()
290 for (i = 0; i < encl->nr_segments; i++) { in encl_build()
291 struct encl_segment *seg = &encl->segment_tbl[i]; in encl_build()
293 if (!encl_ioc_add_pages(encl, seg)) in encl_build()
297 ioc.sigstruct = (uint64_t)&encl->sigstruct; in encl_build()
298 ret = ioctl(encl->fd, SGX_IOC_ENCLAVE_INIT, &ioc); in encl_build()