On Sat, Jul 13, 2019 at 08:07:52PM +0300, Jarkko Sakkinen wrote: > +static unsigned long sgx_get_unmapped_area(struct file *file, > + unsigned long addr, > + unsigned long len, > + unsigned long pgoff, > + unsigned long flags) > +{ > + if (flags & MAP_PRIVATE) > + return -EINVAL; > + > + if (flags & MAP_FIXED) > + return addr; > + > + if (len < 2 * PAGE_SIZE || len & (len - 1)) > + return -EINVAL; > + > + addr = current->mm->get_unmapped_area(file, addr, 2 * len, pgoff, > + flags); > + if (IS_ERR_VALUE(addr)) > + return addr; > + > + addr = (addr + (len - 1)) & ~(len - 1); > + > + return addr; > +} Thinking about this more, I don't think the driver should verify or adjust @addr and @len during non-fixed mmap(). There is no requirement that userspace must map the full ELRANGE, or that an enclave's ELRANGE can *never* be mapped to non-EPC. The architectural requirement is that an access that hits ELRANGE must map to the EPC *if* the CPU is executing the associated enclave. This means that a process can have random mappings that overlap an enclave's ELRANGE while the enclave is active, it just can't access that memory from within the enclave. A good example is a large enclave, e.g. 3gb of actual code/data, that userspace wants to locate below 4gb for some reason, e.g. running an unmodified non-enclave binary under graphene. Requiring @addr+@len to be naturally sized and aligned will force @addr to 0x0, which is often disallowed by the kernel.