Lines Matching refs: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()
174 bool encl_load(const char *path, struct encl *encl, unsigned long heap_size) in encl_load() argument
187 memset(encl, 0, sizeof(*encl)); in encl_load()
221 encl->fd = fd; in encl_load()
223 if (!encl_map_bin(path, encl)) in encl_load()
226 ehdr = encl->bin; in encl_load()
227 phdr_tbl = encl->bin + ehdr->e_phoff; in encl_load()
229 encl->nr_segments = 1; /* one for the heap */ in encl_load()
235 encl->nr_segments++; in encl_load()
238 encl->segment_tbl = calloc(encl->nr_segments, in encl_load()
240 if (!encl->segment_tbl) in encl_load()
250 seg = &encl->segment_tbl[j]; in encl_load()
268 encl->src = encl->bin + src_offset; in encl_load()
281 seg->src = encl->src + seg->offset; in encl_load()
287 assert(j == encl->nr_segments - 1); in encl_load()
289 seg = &encl->segment_tbl[j]; in encl_load()
290 seg->offset = encl->segment_tbl[j - 1].offset + encl->segment_tbl[j - 1].size; in encl_load()
301 encl->src_size = encl->segment_tbl[j].offset + encl->segment_tbl[j].size; in encl_load()
303 for (encl->encl_size = 4096; encl->encl_size < encl->src_size; ) in encl_load()
304 encl->encl_size <<= 1; in encl_load()
311 encl_delete(encl); in encl_load()
315 static bool encl_map_area(struct encl *encl) in encl_map_area() argument
317 size_t encl_size = encl->encl_size; in encl_map_area()
327 encl->encl_base = ((uint64_t)area + encl_size - 1) & ~(encl_size - 1); in encl_map_area()
329 munmap(area, encl->encl_base - (uint64_t)area); in encl_map_area()
330 munmap((void *)(encl->encl_base + encl_size), in encl_map_area()
331 (uint64_t)area + encl_size - encl->encl_base); in encl_map_area()
336 bool encl_build(struct encl *encl) in encl_build() argument
342 if (!encl_map_area(encl)) in encl_build()
345 if (!encl_ioc_create(encl)) in encl_build()
352 for (i = 0; i < encl->nr_segments; i++) { in encl_build()
353 struct encl_segment *seg = &encl->segment_tbl[i]; in encl_build()
355 if (!encl_ioc_add_pages(encl, seg)) in encl_build()
359 ioc.sigstruct = (uint64_t)&encl->sigstruct; in encl_build()
360 ret = ioctl(encl->fd, SGX_IOC_ENCLAVE_INIT, &ioc); in encl_build()