Lines Matching refs:encl

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