On Wed, Dec 19, 2018 at 09:36:16AM +0000, Jethro Beekman wrote: > On 2018-12-19 14:41, Jarkko Sakkinen wrote: > >On Wed, Dec 19, 2018 at 08:41:12AM +0000, Jethro Beekman wrote: > >>One weird thing is the departure from the normal mmap behavior that the > >>memory mapping persists even if the original fd is closed. (See man mmap: > >>"closing the file descriptor does not unmap the region.") It won't (be a departure). mmap() on a file grabs a reference to the file, i.e. each VMA keeps a reference to the file. Closing the original enclave fd will only put its reference to the file/enclave, not destroy it outright. > > > >The mmapped region and enclave would be completely disjoint to start > >with. The enclave driver code would assume that an enclave VMA exists > >when it maps enclave address space to a process. > > > >I.e. VMA would no longer reference to the enclave or vice versa but > >you would still create an enclave VMA with mmap(). > > > >This is IMHO very clear and well-defined semantics. > > > >>>struct sgx_enclave_add_page { > >>> __u64 enclave_fd; > >>> __u64 src; > >>> __u64 secinfo; > >>> __u16 mrmask; > >>>} __attribute__((__packed__)); > >> > >>Wouldn't you just pass enclave_fd as the ioctl fd parameter? > > > >I'm still planning to keep the API in the device fd and use enclave_fd > >as handle to the enclave address space. I don't see any obvious reason > >to change that behavior. > > > >And if we ever add any "global" ioctls, then we would have to define > >APIs to both fd's, which would become a mess. > > > >>How to specify the address of the page that is being added? > > > >Yes, that is correct and my bad to remove it (just quickly drafted what > >I had in mind). > > So your plan is that to call EADD, userspace has to pass the device fd AND > the enclave fd AND the enclave address? That seems a little superfluous. I agree with Jethro, passing the enclave_fd as a param is obnoxious. And it means the user needs to open /dev/sgx to do anything with an enclave fd, e.g. the enclave fd might be passed to a builder thread, it shouldn't also need the device fd. E.g.: sgx_fd = open("/dev/sgx", O_RDWR); BUG_ON(sgx_fd < 0); enclave_fd = ioctl(sgx_fd, SGX_ENCLAVE_CREATE, &ecreate); BUG_ON(enclave_fd < 0); ret = ioctl(enclave_fd, SGX_ENCLAVE_ADD_PAGE, &eadd); BUG_ON(ret); ... ret = ioctl(enclave_fd, SGX_ENCLAVE_INIT, &einit); BUG_ON(ret); ... close(enclave_fd); close(sgx_fd); Take a look at virt/kvm/kvm_main.c to see how KVM manages anon inodes and ioctls for VMs and vCPUs.