@@ -328,16 +328,14 @@ static int __sgx_encl_add_page(struct sgx_encl *encl,
if (ret < 1)
return ret;
- __uaccess_begin();
-
pginfo.secs = (unsigned long)sgx_epc_addr(encl->secs.epc_page);
pginfo.addr = SGX_ENCL_PAGE_ADDR(encl_page);
pginfo.metadata = (unsigned long)secinfo;
- pginfo.contents = (unsigned long)src;
+ pginfo.contents = (unsigned long)kmap_atomic(src_page);
ret = __eadd(&pginfo, sgx_epc_addr(epc_page));
- __uaccess_end();
+ kunmap_atomic((void *)pginfo.contents);
put_page(src_page);
return ret ? -EFAULT : 0;
Use the kernel's virtual address to reference the source page when EADDing a page to the enclave. gup() "does not guarantee that the page exists in the user mappings", i.e. EADD can still fault and deadlock due to mmap_sem contention if it consumes the userspace address. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> --- arch/x86/kernel/cpu/sgx/ioctl.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)