Lines Matching refs:encl
20 struct sgx_va_page *sgx_encl_grow(struct sgx_encl *encl, bool reclaim) 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 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
74 va_page = sgx_encl_grow(encl, true); in sgx_encl_create()
78 list_add(&va_page->list, &encl->va_pages); in sgx_encl_create()
91 encl->backing = backing; in sgx_encl_create()
93 secs_epc = sgx_alloc_epc_page(&encl->secs, true); in sgx_encl_create()
99 encl->secs.epc_page = secs_epc; in sgx_encl_create()
114 set_bit(SGX_ENCL_DEBUG, &encl->flags); in sgx_encl_create()
116 encl->secs.encl = encl; in sgx_encl_create()
117 encl->secs.type = SGX_PAGE_TYPE_SECS; in sgx_encl_create()
118 encl->base = secs->base; in sgx_encl_create()
119 encl->size = secs->size; in sgx_encl_create()
120 encl->attributes = secs->attributes; in sgx_encl_create()
121 encl->attributes_mask = SGX_ATTR_UNPRIV_MASK; in sgx_encl_create()
124 set_bit(SGX_ENCL_CREATED, &encl->flags); in sgx_encl_create()
129 sgx_encl_free_epc_page(encl->secs.epc_page); in sgx_encl_create()
130 encl->secs.epc_page = NULL; in sgx_encl_create()
133 fput(encl->backing); in sgx_encl_create()
134 encl->backing = NULL; in sgx_encl_create()
137 sgx_encl_shrink(encl, va_page); in sgx_encl_create()
154 static long sgx_ioc_enclave_create(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_create() argument
160 if (test_bit(SGX_ENCL_CREATED, &encl->flags)) in sgx_ioc_enclave_create()
173 ret = sgx_encl_create(encl, secs); in sgx_ioc_enclave_create()
206 static int __sgx_encl_add_page(struct sgx_encl *encl, in __sgx_encl_add_page() argument
228 pginfo.secs = (unsigned long)sgx_get_epc_virt_addr(encl->secs.epc_page); in __sgx_encl_add_page()
246 static int __sgx_encl_extend(struct sgx_encl *encl, in __sgx_encl_extend() argument
253 ret = __eextend(sgx_get_epc_virt_addr(encl->secs.epc_page), in __sgx_encl_extend()
266 static int sgx_encl_add_page(struct sgx_encl *encl, unsigned long src, in sgx_encl_add_page() argument
275 encl_page = sgx_encl_page_alloc(encl, offset, secinfo->flags); in sgx_encl_add_page()
285 va_page = sgx_encl_grow(encl, true); in sgx_encl_add_page()
292 mutex_lock(&encl->lock); in sgx_encl_add_page()
299 list_add(&va_page->list, &encl->va_pages); in sgx_encl_add_page()
306 ret = xa_insert(&encl->page_array, PFN_DOWN(encl_page->desc), in sgx_encl_add_page()
311 ret = __sgx_encl_add_page(encl, encl_page, epc_page, secinfo, in sgx_encl_add_page()
321 encl_page->encl = encl; in sgx_encl_add_page()
324 encl->secs_child_cnt++; in sgx_encl_add_page()
327 ret = __sgx_encl_extend(encl, epc_page); in sgx_encl_add_page()
333 mutex_unlock(&encl->lock); in sgx_encl_add_page()
338 xa_erase(&encl->page_array, PFN_DOWN(encl_page->desc)); in sgx_encl_add_page()
341 sgx_encl_shrink(encl, va_page); in sgx_encl_add_page()
342 mutex_unlock(&encl->lock); in sgx_encl_add_page()
356 static int sgx_validate_offset_length(struct sgx_encl *encl, in sgx_validate_offset_length() argument
369 if (offset + length - PAGE_SIZE >= encl->size) in sgx_validate_offset_length()
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()
431 if (sgx_validate_offset_length(encl, add_arg.offset, add_arg.length)) in sgx_ioc_enclave_add_pages()
452 ret = sgx_encl_add_page(encl, add_arg.src + c, add_arg.offset + c, in sgx_ioc_enclave_add_pages()
491 static int sgx_encl_init(struct sgx_encl *encl, struct sgx_sigstruct *sigstruct, in sgx_encl_init() argument
503 if (encl->attributes & ~encl->attributes_mask) in sgx_encl_init()
530 mutex_lock(&encl->lock); in sgx_encl_init()
540 addr = sgx_get_epc_virt_addr(encl->secs.epc_page); in sgx_encl_init()
576 set_bit(SGX_ENCL_INITIALIZED, &encl->flags); in sgx_encl_init()
580 mutex_unlock(&encl->lock); in sgx_encl_init()
599 static long sgx_ioc_enclave_init(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_init() argument
606 if (!test_bit(SGX_ENCL_CREATED, &encl->flags) || in sgx_ioc_enclave_init()
607 test_bit(SGX_ENCL_INITIALIZED, &encl->flags)) in sgx_ioc_enclave_init()
644 ret = sgx_encl_init(encl, sigstruct, token); in sgx_ioc_enclave_init()
663 static long sgx_ioc_enclave_provision(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_provision() argument
670 return sgx_set_attribute(&encl->attributes_mask, params.fd); in sgx_ioc_enclave_provision()
678 static int sgx_ioc_sgx2_ready(struct sgx_encl *encl) in sgx_ioc_sgx2_ready() argument
683 if (!test_bit(SGX_ENCL_INITIALIZED, &encl->flags)) in sgx_ioc_sgx2_ready()
700 static int sgx_enclave_etrack(struct sgx_encl *encl) in sgx_enclave_etrack() argument
705 epc_virt = sgx_get_epc_virt_addr(encl->secs.epc_page); in sgx_enclave_etrack()
718 on_each_cpu_mask(sgx_encl_cpumask(encl), sgx_ipi_cb, NULL, 1); in sgx_enclave_etrack()
726 on_each_cpu_mask(sgx_encl_cpumask(encl), sgx_ipi_cb, NULL, 1); in sgx_enclave_etrack()
742 sgx_enclave_restrict_permissions(struct sgx_encl *encl, in sgx_enclave_restrict_permissions() argument
756 addr = encl->base + modp->offset + c; in sgx_enclave_restrict_permissions()
760 mutex_lock(&encl->lock); in sgx_enclave_restrict_permissions()
762 entry = sgx_encl_load_page(encl, addr); in sgx_enclave_restrict_permissions()
809 ret = sgx_enclave_etrack(encl); in sgx_enclave_restrict_permissions()
815 mutex_unlock(&encl->lock); in sgx_enclave_restrict_permissions()
822 mutex_unlock(&encl->lock); in sgx_enclave_restrict_permissions()
849 static long sgx_ioc_enclave_restrict_permissions(struct sgx_encl *encl, in sgx_ioc_enclave_restrict_permissions() argument
855 ret = sgx_ioc_sgx2_ready(encl); in sgx_ioc_enclave_restrict_permissions()
862 if (sgx_validate_offset_length(encl, params.offset, params.length)) in sgx_ioc_enclave_restrict_permissions()
879 ret = sgx_enclave_restrict_permissions(encl, ¶ms); in sgx_ioc_enclave_restrict_permissions()
897 static long sgx_enclave_modify_types(struct sgx_encl *encl, in sgx_enclave_modify_types() argument
923 addr = encl->base + modt->offset + c; in sgx_enclave_modify_types()
927 mutex_lock(&encl->lock); in sgx_enclave_modify_types()
929 entry = sgx_encl_load_page(encl, addr); in sgx_enclave_modify_types()
980 mutex_unlock(&encl->lock); in sgx_enclave_modify_types()
982 sgx_zap_enclave_ptes(encl, addr); in sgx_enclave_modify_types()
984 mutex_lock(&encl->lock); in sgx_enclave_modify_types()
1011 ret = sgx_enclave_etrack(encl); in sgx_enclave_modify_types()
1019 mutex_unlock(&encl->lock); in sgx_enclave_modify_types()
1028 mutex_unlock(&encl->lock); in sgx_enclave_modify_types()
1058 static long sgx_ioc_enclave_modify_types(struct sgx_encl *encl, in sgx_ioc_enclave_modify_types() argument
1064 ret = sgx_ioc_sgx2_ready(encl); in sgx_ioc_enclave_modify_types()
1071 if (sgx_validate_offset_length(encl, params.offset, params.length)) in sgx_ioc_enclave_modify_types()
1080 ret = sgx_enclave_modify_types(encl, ¶ms); in sgx_ioc_enclave_modify_types()
1097 static long sgx_encl_remove_pages(struct sgx_encl *encl, in sgx_encl_remove_pages() argument
1111 addr = encl->base + params->offset + c; in sgx_encl_remove_pages()
1115 mutex_lock(&encl->lock); in sgx_encl_remove_pages()
1117 entry = sgx_encl_load_page(encl, addr); in sgx_encl_remove_pages()
1152 mutex_unlock(&encl->lock); in sgx_encl_remove_pages()
1154 sgx_zap_enclave_ptes(encl, addr); in sgx_encl_remove_pages()
1156 mutex_lock(&encl->lock); in sgx_encl_remove_pages()
1159 encl->secs_child_cnt--; in sgx_encl_remove_pages()
1161 xa_erase(&encl->page_array, PFN_DOWN(entry->desc)); in sgx_encl_remove_pages()
1162 sgx_encl_shrink(encl, NULL); in sgx_encl_remove_pages()
1165 mutex_unlock(&encl->lock); in sgx_encl_remove_pages()
1172 mutex_unlock(&encl->lock); in sgx_encl_remove_pages()
1205 static long sgx_ioc_enclave_remove_pages(struct sgx_encl *encl, in sgx_ioc_enclave_remove_pages() argument
1211 ret = sgx_ioc_sgx2_ready(encl); in sgx_ioc_enclave_remove_pages()
1218 if (sgx_validate_offset_length(encl, params.offset, params.length)) in sgx_ioc_enclave_remove_pages()
1224 ret = sgx_encl_remove_pages(encl, ¶ms); in sgx_ioc_enclave_remove_pages()
1234 struct sgx_encl *encl = filep->private_data; in sgx_ioctl() local
1237 if (test_and_set_bit(SGX_ENCL_IOCTL, &encl->flags)) in sgx_ioctl()
1242 ret = sgx_ioc_enclave_create(encl, (void __user *)arg); in sgx_ioctl()
1245 ret = sgx_ioc_enclave_add_pages(encl, (void __user *)arg); in sgx_ioctl()
1248 ret = sgx_ioc_enclave_init(encl, (void __user *)arg); in sgx_ioctl()
1251 ret = sgx_ioc_enclave_provision(encl, (void __user *)arg); in sgx_ioctl()
1254 ret = sgx_ioc_enclave_restrict_permissions(encl, in sgx_ioctl()
1258 ret = sgx_ioc_enclave_modify_types(encl, (void __user *)arg); in sgx_ioctl()
1261 ret = sgx_ioc_enclave_remove_pages(encl, (void __user *)arg); in sgx_ioctl()
1268 clear_bit(SGX_ENCL_IOCTL, &encl->flags); in sgx_ioctl()