Lines Matching refs:encl
20 static struct sgx_va_page *sgx_encl_grow(struct sgx_encl *encl) in sgx_encl_grow() argument
28 if (!(encl->page_cnt % SGX_VA_SLOT_COUNT)) { in sgx_encl_grow()
40 WARN_ON_ONCE(encl->page_cnt % SGX_VA_SLOT_COUNT); in sgx_encl_grow()
42 encl->page_cnt++; in sgx_encl_grow()
46 static void sgx_encl_shrink(struct sgx_encl *encl, struct sgx_va_page *va_page) in sgx_encl_shrink() argument
48 encl->page_cnt--; in sgx_encl_shrink()
57 static int sgx_encl_create(struct sgx_encl *encl, struct sgx_secs *secs) in sgx_encl_create() argument
67 va_page = sgx_encl_grow(encl); in sgx_encl_create()
71 list_add(&va_page->list, &encl->va_pages); in sgx_encl_create()
84 encl->backing = backing; in sgx_encl_create()
86 secs_epc = sgx_alloc_epc_page(&encl->secs, true); in sgx_encl_create()
92 encl->secs.epc_page = secs_epc; in sgx_encl_create()
107 set_bit(SGX_ENCL_DEBUG, &encl->flags); in sgx_encl_create()
109 encl->secs.encl = encl; in sgx_encl_create()
110 encl->base = secs->base; in sgx_encl_create()
111 encl->size = secs->size; in sgx_encl_create()
112 encl->attributes = secs->attributes; in sgx_encl_create()
113 encl->attributes_mask = SGX_ATTR_DEBUG | SGX_ATTR_MODE64BIT | SGX_ATTR_KSS; in sgx_encl_create()
116 set_bit(SGX_ENCL_CREATED, &encl->flags); in sgx_encl_create()
121 sgx_encl_free_epc_page(encl->secs.epc_page); in sgx_encl_create()
122 encl->secs.epc_page = NULL; in sgx_encl_create()
125 fput(encl->backing); in sgx_encl_create()
126 encl->backing = NULL; in sgx_encl_create()
129 sgx_encl_shrink(encl, va_page); in sgx_encl_create()
146 static long sgx_ioc_enclave_create(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_create() argument
152 if (test_bit(SGX_ENCL_CREATED, &encl->flags)) in sgx_ioc_enclave_create()
165 ret = sgx_encl_create(encl, secs); in sgx_ioc_enclave_create()
171 static struct sgx_encl_page *sgx_encl_page_alloc(struct sgx_encl *encl, in sgx_encl_page_alloc() argument
182 encl_page->desc = encl->base + offset; in sgx_encl_page_alloc()
183 encl_page->encl = encl; in sgx_encl_page_alloc()
230 static int __sgx_encl_add_page(struct sgx_encl *encl, in __sgx_encl_add_page() argument
252 pginfo.secs = (unsigned long)sgx_get_epc_virt_addr(encl->secs.epc_page); in __sgx_encl_add_page()
270 static int __sgx_encl_extend(struct sgx_encl *encl, in __sgx_encl_extend() argument
277 ret = __eextend(sgx_get_epc_virt_addr(encl->secs.epc_page), in __sgx_encl_extend()
290 static int sgx_encl_add_page(struct sgx_encl *encl, unsigned long src, in sgx_encl_add_page() argument
299 encl_page = sgx_encl_page_alloc(encl, offset, secinfo->flags); in sgx_encl_add_page()
309 va_page = sgx_encl_grow(encl); in sgx_encl_add_page()
316 mutex_lock(&encl->lock); in sgx_encl_add_page()
323 list_add(&va_page->list, &encl->va_pages); in sgx_encl_add_page()
330 ret = xa_insert(&encl->page_array, PFN_DOWN(encl_page->desc), in sgx_encl_add_page()
335 ret = __sgx_encl_add_page(encl, encl_page, epc_page, secinfo, in sgx_encl_add_page()
345 encl_page->encl = encl; in sgx_encl_add_page()
347 encl->secs_child_cnt++; in sgx_encl_add_page()
350 ret = __sgx_encl_extend(encl, epc_page); in sgx_encl_add_page()
356 mutex_unlock(&encl->lock); in sgx_encl_add_page()
361 xa_erase(&encl->page_array, PFN_DOWN(encl_page->desc)); in sgx_encl_add_page()
364 sgx_encl_shrink(encl, va_page); in sgx_encl_add_page()
365 mutex_unlock(&encl->lock); in sgx_encl_add_page()
414 static long sgx_ioc_enclave_add_pages(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_add_pages() argument
421 if (!test_bit(SGX_ENCL_CREATED, &encl->flags) || in sgx_ioc_enclave_add_pages()
422 test_bit(SGX_ENCL_INITIALIZED, &encl->flags)) in sgx_ioc_enclave_add_pages()
435 if (add_arg.offset + add_arg.length - PAGE_SIZE >= encl->size) in sgx_ioc_enclave_add_pages()
456 ret = sgx_encl_add_page(encl, add_arg.src + c, add_arg.offset + c, in sgx_ioc_enclave_add_pages()
495 static int sgx_encl_init(struct sgx_encl *encl, struct sgx_sigstruct *sigstruct, in sgx_encl_init() argument
507 if (encl->attributes & ~encl->attributes_mask) in sgx_encl_init()
534 mutex_lock(&encl->lock); in sgx_encl_init()
544 addr = sgx_get_epc_virt_addr(encl->secs.epc_page); in sgx_encl_init()
580 set_bit(SGX_ENCL_INITIALIZED, &encl->flags); in sgx_encl_init()
584 mutex_unlock(&encl->lock); in sgx_encl_init()
603 static long sgx_ioc_enclave_init(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_init() argument
610 if (!test_bit(SGX_ENCL_CREATED, &encl->flags) || in sgx_ioc_enclave_init()
611 test_bit(SGX_ENCL_INITIALIZED, &encl->flags)) in sgx_ioc_enclave_init()
648 ret = sgx_encl_init(encl, sigstruct, token); in sgx_ioc_enclave_init()
667 static long sgx_ioc_enclave_provision(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_provision() argument
674 return sgx_set_attribute(&encl->attributes_mask, params.fd); in sgx_ioc_enclave_provision()
679 struct sgx_encl *encl = filep->private_data; in sgx_ioctl() local
682 if (test_and_set_bit(SGX_ENCL_IOCTL, &encl->flags)) in sgx_ioctl()
687 ret = sgx_ioc_enclave_create(encl, (void __user *)arg); in sgx_ioctl()
690 ret = sgx_ioc_enclave_add_pages(encl, (void __user *)arg); in sgx_ioctl()
693 ret = sgx_ioc_enclave_init(encl, (void __user *)arg); in sgx_ioctl()
696 ret = sgx_ioc_enclave_provision(encl, (void __user *)arg); in sgx_ioctl()
703 clear_bit(SGX_ENCL_IOCTL, &encl->flags); in sgx_ioctl()