Lines Matching full:encl
22 void encl_delete(struct encl *encl) in encl_delete() argument
26 if (encl->encl_base) in encl_delete()
27 munmap((void *)encl->encl_base, encl->encl_size); in encl_delete()
29 if (encl->bin) in encl_delete()
30 munmap(encl->bin, encl->bin_size); in encl_delete()
32 if (encl->fd) in encl_delete()
33 close(encl->fd); in encl_delete()
35 if (encl->segment_tbl) { in encl_delete()
36 heap_seg = &encl->segment_tbl[encl->nr_segments - 1]; in encl_delete()
38 free(encl->segment_tbl); in encl_delete()
41 memset(encl, 0, sizeof(*encl)); in encl_delete()
44 static bool encl_map_bin(const char *path, struct encl *encl) in encl_map_bin() argument
69 encl->bin = bin; in encl_map_bin()
70 encl->bin_size = sb.st_size; in encl_map_bin()
80 static bool encl_ioc_create(struct encl *encl) in encl_ioc_create() argument
82 struct sgx_secs *secs = &encl->secs; in encl_ioc_create()
86 assert(encl->encl_base != 0); in encl_ioc_create()
92 secs->base = encl->encl_base; in encl_ioc_create()
93 secs->size = encl->encl_size; in encl_ioc_create()
96 rc = ioctl(encl->fd, SGX_IOC_ENCLAVE_CREATE, &ioc); in encl_ioc_create()
99 munmap((void *)secs->base, encl->encl_size); in encl_ioc_create()
106 static bool encl_ioc_add_pages(struct encl *encl, struct encl_segment *seg) in encl_ioc_add_pages() argument
124 rc = ioctl(encl->fd, SGX_IOC_ENCLAVE_ADD_PAGES, &ioc); in encl_ioc_add_pages()
137 uint64_t encl_get_entry(struct encl *encl, const char *symbol) in encl_get_entry() argument
146 ehdr = encl->bin; in encl_get_entry()
147 sections = encl->bin + ehdr->e_shoff; in encl_get_entry()
151 symtab = (Elf64_Sym *)((char *)encl->bin + sections[i].sh_offset); in encl_get_entry()
159 sym_names = (char *)encl->bin + sections[i].sh_offset; in encl_get_entry()
177 bool encl_load(const char *path, struct encl *encl, unsigned long heap_size) in encl_load() argument
190 memset(encl, 0, sizeof(*encl)); in encl_load()
224 encl->fd = fd; in encl_load()
226 if (!encl_map_bin(path, encl)) in encl_load()
229 ehdr = encl->bin; in encl_load()
230 phdr_tbl = encl->bin + ehdr->e_phoff; in encl_load()
232 encl->nr_segments = 1; /* one for the heap */ in encl_load()
238 encl->nr_segments++; in encl_load()
241 encl->segment_tbl = calloc(encl->nr_segments, in encl_load()
243 if (!encl->segment_tbl) in encl_load()
253 seg = &encl->segment_tbl[j]; in encl_load()
271 encl->src = encl->bin + src_offset; in encl_load()
284 seg->src = encl->src + seg->offset; in encl_load()
290 assert(j == encl->nr_segments - 1); in encl_load()
292 seg = &encl->segment_tbl[j]; in encl_load()
293 seg->offset = encl->segment_tbl[j - 1].offset + encl->segment_tbl[j - 1].size; in encl_load()
304 encl->src_size = encl->segment_tbl[j].offset + encl->segment_tbl[j].size; in encl_load()
306 for (encl->encl_size = 4096; encl->encl_size < encl->src_size; ) in encl_load()
307 encl->encl_size <<= 1; in encl_load()
314 encl_delete(encl); in encl_load()
318 static bool encl_map_area(struct encl *encl) in encl_map_area() argument
320 size_t encl_size = encl->encl_size; in encl_map_area()
330 encl->encl_base = ((uint64_t)area + encl_size - 1) & ~(encl_size - 1); in encl_map_area()
332 munmap(area, encl->encl_base - (uint64_t)area); in encl_map_area()
333 munmap((void *)(encl->encl_base + encl_size), in encl_map_area()
334 (uint64_t)area + encl_size - encl->encl_base); in encl_map_area()
339 bool encl_build(struct encl *encl) in encl_build() argument
345 if (!encl_map_area(encl)) in encl_build()
348 if (!encl_ioc_create(encl)) in encl_build()
355 for (i = 0; i < encl->nr_segments; i++) { in encl_build()
356 struct encl_segment *seg = &encl->segment_tbl[i]; in encl_build()
358 if (!encl_ioc_add_pages(encl, seg)) in encl_build()
362 ioc.sigstruct = (uint64_t)&encl->sigstruct; in encl_build()
363 ret = ioctl(encl->fd, SGX_IOC_ENCLAVE_INIT, &ioc); in encl_build()