Lines Matching full:encl
18 #include "encl.h"
21 struct sgx_va_page *sgx_encl_grow(struct sgx_encl *encl, bool reclaim) in sgx_encl_grow() argument
29 if (!(encl->page_cnt % SGX_VA_SLOT_COUNT)) { in sgx_encl_grow()
41 WARN_ON_ONCE(encl->page_cnt % SGX_VA_SLOT_COUNT); in sgx_encl_grow()
43 encl->page_cnt++; in sgx_encl_grow()
47 void sgx_encl_shrink(struct sgx_encl *encl, struct sgx_va_page *va_page) in sgx_encl_shrink() argument
49 encl->page_cnt--; in sgx_encl_shrink()
58 static int sgx_encl_create(struct sgx_encl *encl, struct sgx_secs *secs) in sgx_encl_create() argument
75 va_page = sgx_encl_grow(encl, true); in sgx_encl_create()
79 list_add(&va_page->list, &encl->va_pages); in sgx_encl_create()
92 encl->backing = backing; in sgx_encl_create()
94 secs_epc = sgx_alloc_epc_page(&encl->secs, true); in sgx_encl_create()
100 encl->secs.epc_page = secs_epc; in sgx_encl_create()
115 set_bit(SGX_ENCL_DEBUG, &encl->flags); in sgx_encl_create()
117 encl->secs.encl = encl; in sgx_encl_create()
118 encl->secs.type = SGX_PAGE_TYPE_SECS; in sgx_encl_create()
119 encl->base = secs->base; in sgx_encl_create()
120 encl->size = secs->size; in sgx_encl_create()
121 encl->attributes = secs->attributes; in sgx_encl_create()
122 encl->attributes_mask = SGX_ATTR_UNPRIV_MASK; in sgx_encl_create()
124 /* Set only after completion, as encl->lock has not been taken. */ in sgx_encl_create()
125 set_bit(SGX_ENCL_CREATED, &encl->flags); in sgx_encl_create()
130 sgx_encl_free_epc_page(encl->secs.epc_page); in sgx_encl_create()
131 encl->secs.epc_page = NULL; in sgx_encl_create()
134 fput(encl->backing); in sgx_encl_create()
135 encl->backing = NULL; in sgx_encl_create()
138 sgx_encl_shrink(encl, va_page); in sgx_encl_create()
145 * @encl: An enclave pointer.
155 static long sgx_ioc_enclave_create(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_create() argument
161 if (test_bit(SGX_ENCL_CREATED, &encl->flags)) in sgx_ioc_enclave_create()
174 ret = sgx_encl_create(encl, secs); in sgx_ioc_enclave_create()
207 static int __sgx_encl_add_page(struct sgx_encl *encl, in __sgx_encl_add_page() argument
229 pginfo.secs = (unsigned long)sgx_get_epc_virt_addr(encl->secs.epc_page); in __sgx_encl_add_page()
247 static int __sgx_encl_extend(struct sgx_encl *encl, in __sgx_encl_extend() argument
254 ret = __eextend(sgx_get_epc_virt_addr(encl->secs.epc_page), in __sgx_encl_extend()
267 static int sgx_encl_add_page(struct sgx_encl *encl, unsigned long src, in sgx_encl_add_page() argument
276 encl_page = sgx_encl_page_alloc(encl, offset, secinfo->flags); in sgx_encl_add_page()
286 va_page = sgx_encl_grow(encl, true); in sgx_encl_add_page()
293 mutex_lock(&encl->lock); in sgx_encl_add_page()
296 * Adding to encl->va_pages must be done under encl->lock. Ditto for in sgx_encl_add_page()
300 list_add(&va_page->list, &encl->va_pages); in sgx_encl_add_page()
307 ret = xa_insert(&encl->page_array, PFN_DOWN(encl_page->desc), in sgx_encl_add_page()
312 ret = __sgx_encl_add_page(encl, encl_page, epc_page, secinfo, in sgx_encl_add_page()
322 encl_page->encl = encl; in sgx_encl_add_page()
325 encl->secs_child_cnt++; in sgx_encl_add_page()
328 ret = __sgx_encl_extend(encl, epc_page); in sgx_encl_add_page()
334 mutex_unlock(&encl->lock); in sgx_encl_add_page()
339 xa_erase(&encl->page_array, PFN_DOWN(encl_page->desc)); in sgx_encl_add_page()
342 sgx_encl_shrink(encl, va_page); in sgx_encl_add_page()
343 mutex_unlock(&encl->lock); in sgx_encl_add_page()
357 static int sgx_validate_offset_length(struct sgx_encl *encl, in sgx_validate_offset_length() argument
370 if (offset + length - PAGE_SIZE >= encl->size) in sgx_validate_offset_length()
378 * @encl: an enclave pointer
415 static long sgx_ioc_enclave_add_pages(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_add_pages() argument
422 if (!test_bit(SGX_ENCL_CREATED, &encl->flags) || in sgx_ioc_enclave_add_pages()
423 test_bit(SGX_ENCL_INITIALIZED, &encl->flags)) in sgx_ioc_enclave_add_pages()
432 if (sgx_validate_offset_length(encl, add_arg.offset, add_arg.length)) in sgx_ioc_enclave_add_pages()
453 ret = sgx_encl_add_page(encl, add_arg.src + c, add_arg.offset + c, in sgx_ioc_enclave_add_pages()
467 static int sgx_encl_init(struct sgx_encl *encl, struct sgx_sigstruct *sigstruct, in sgx_encl_init() argument
479 if (encl->attributes & ~encl->attributes_mask) in sgx_encl_init()
504 mutex_lock(&encl->lock); in sgx_encl_init()
514 addr = sgx_get_epc_virt_addr(encl->secs.epc_page); in sgx_encl_init()
550 set_bit(SGX_ENCL_INITIALIZED, &encl->flags); in sgx_encl_init()
554 mutex_unlock(&encl->lock); in sgx_encl_init()
560 * @encl: an enclave pointer
573 static long sgx_ioc_enclave_init(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_init() argument
580 if (!test_bit(SGX_ENCL_CREATED, &encl->flags) || in sgx_ioc_enclave_init()
581 test_bit(SGX_ENCL_INITIALIZED, &encl->flags)) in sgx_ioc_enclave_init()
618 ret = sgx_encl_init(encl, sigstruct, token); in sgx_ioc_enclave_init()
627 * @encl: an enclave pointer
637 static long sgx_ioc_enclave_provision(struct sgx_encl *encl, void __user *arg) in sgx_ioc_enclave_provision() argument
644 return sgx_set_attribute(&encl->attributes_mask, params.fd); in sgx_ioc_enclave_provision()
652 static int sgx_ioc_sgx2_ready(struct sgx_encl *encl) in sgx_ioc_sgx2_ready() argument
657 if (!test_bit(SGX_ENCL_INITIALIZED, &encl->flags)) in sgx_ioc_sgx2_ready()
674 static int sgx_enclave_etrack(struct sgx_encl *encl) in sgx_enclave_etrack() argument
679 epc_virt = sgx_get_epc_virt_addr(encl->secs.epc_page); in sgx_enclave_etrack()
692 on_each_cpu_mask(sgx_encl_cpumask(encl), sgx_ipi_cb, NULL, 1); in sgx_enclave_etrack()
700 on_each_cpu_mask(sgx_encl_cpumask(encl), sgx_ipi_cb, NULL, 1); in sgx_enclave_etrack()
707 * @encl: Enclave to which the pages belong.
716 sgx_enclave_restrict_permissions(struct sgx_encl *encl, in sgx_enclave_restrict_permissions() argument
730 addr = encl->base + modp->offset + c; in sgx_enclave_restrict_permissions()
734 mutex_lock(&encl->lock); in sgx_enclave_restrict_permissions()
736 entry = sgx_encl_load_page(encl, addr); in sgx_enclave_restrict_permissions()
783 ret = sgx_enclave_etrack(encl); in sgx_enclave_restrict_permissions()
789 mutex_unlock(&encl->lock); in sgx_enclave_restrict_permissions()
796 mutex_unlock(&encl->lock); in sgx_enclave_restrict_permissions()
806 * @encl: an enclave pointer
823 static long sgx_ioc_enclave_restrict_permissions(struct sgx_encl *encl, in sgx_ioc_enclave_restrict_permissions() argument
829 ret = sgx_ioc_sgx2_ready(encl); in sgx_ioc_enclave_restrict_permissions()
836 if (sgx_validate_offset_length(encl, params.offset, params.length)) in sgx_ioc_enclave_restrict_permissions()
853 ret = sgx_enclave_restrict_permissions(encl, ¶ms); in sgx_ioc_enclave_restrict_permissions()
863 * @encl: Enclave to which the pages belong.
871 static long sgx_enclave_modify_types(struct sgx_encl *encl, in sgx_enclave_modify_types() argument
897 addr = encl->base + modt->offset + c; in sgx_enclave_modify_types()
901 mutex_lock(&encl->lock); in sgx_enclave_modify_types()
903 entry = sgx_encl_load_page(encl, addr); in sgx_enclave_modify_types()
951 * Do not keep encl->lock because of dependency on in sgx_enclave_modify_types()
954 mutex_unlock(&encl->lock); in sgx_enclave_modify_types()
956 sgx_zap_enclave_ptes(encl, addr); in sgx_enclave_modify_types()
958 mutex_lock(&encl->lock); in sgx_enclave_modify_types()
985 ret = sgx_enclave_etrack(encl); in sgx_enclave_modify_types()
993 mutex_unlock(&encl->lock); in sgx_enclave_modify_types()
1002 mutex_unlock(&encl->lock); in sgx_enclave_modify_types()
1011 * @encl: an enclave pointer
1032 static long sgx_ioc_enclave_modify_types(struct sgx_encl *encl, in sgx_ioc_enclave_modify_types() argument
1038 ret = sgx_ioc_sgx2_ready(encl); in sgx_ioc_enclave_modify_types()
1045 if (sgx_validate_offset_length(encl, params.offset, params.length)) in sgx_ioc_enclave_modify_types()
1054 ret = sgx_enclave_modify_types(encl, ¶ms); in sgx_ioc_enclave_modify_types()
1064 * @encl: Enclave to which the pages belong
1071 static long sgx_encl_remove_pages(struct sgx_encl *encl, in sgx_encl_remove_pages() argument
1085 addr = encl->base + params->offset + c; in sgx_encl_remove_pages()
1089 mutex_lock(&encl->lock); in sgx_encl_remove_pages()
1091 entry = sgx_encl_load_page(encl, addr); in sgx_encl_remove_pages()
1123 * Do not keep encl->lock because of dependency on in sgx_encl_remove_pages()
1126 mutex_unlock(&encl->lock); in sgx_encl_remove_pages()
1128 sgx_zap_enclave_ptes(encl, addr); in sgx_encl_remove_pages()
1130 mutex_lock(&encl->lock); in sgx_encl_remove_pages()
1133 encl->secs_child_cnt--; in sgx_encl_remove_pages()
1135 xa_erase(&encl->page_array, PFN_DOWN(entry->desc)); in sgx_encl_remove_pages()
1136 sgx_encl_shrink(encl, NULL); in sgx_encl_remove_pages()
1139 mutex_unlock(&encl->lock); in sgx_encl_remove_pages()
1146 mutex_unlock(&encl->lock); in sgx_encl_remove_pages()
1155 * @encl: an enclave pointer
1179 static long sgx_ioc_enclave_remove_pages(struct sgx_encl *encl, in sgx_ioc_enclave_remove_pages() argument
1185 ret = sgx_ioc_sgx2_ready(encl); in sgx_ioc_enclave_remove_pages()
1192 if (sgx_validate_offset_length(encl, params.offset, params.length)) in sgx_ioc_enclave_remove_pages()
1198 ret = sgx_encl_remove_pages(encl, ¶ms); in sgx_ioc_enclave_remove_pages()
1208 struct sgx_encl *encl = filep->private_data; in sgx_ioctl() local
1211 if (test_and_set_bit(SGX_ENCL_IOCTL, &encl->flags)) in sgx_ioctl()
1216 ret = sgx_ioc_enclave_create(encl, (void __user *)arg); in sgx_ioctl()
1219 ret = sgx_ioc_enclave_add_pages(encl, (void __user *)arg); in sgx_ioctl()
1222 ret = sgx_ioc_enclave_init(encl, (void __user *)arg); in sgx_ioctl()
1225 ret = sgx_ioc_enclave_provision(encl, (void __user *)arg); in sgx_ioctl()
1228 ret = sgx_ioc_enclave_restrict_permissions(encl, in sgx_ioctl()
1232 ret = sgx_ioc_enclave_modify_types(encl, (void __user *)arg); in sgx_ioctl()
1235 ret = sgx_ioc_enclave_remove_pages(encl, (void __user *)arg); in sgx_ioctl()
1242 clear_bit(SGX_ENCL_IOCTL, &encl->flags); in sgx_ioctl()