]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commit
x86/sgx/virt: implement SGX_IOC_VEPC_REMOVE ioctl
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 21 Oct 2021 20:11:55 +0000 (16:11 -0400)
committerDave Hansen <dave.hansen@linux.intel.com>
Fri, 22 Oct 2021 15:32:12 +0000 (08:32 -0700)
commitae095b16fc652f459e6c16a256834985c85ecc4d
tree5f403502038d2586b3c20b87058be62297df459a
parentfd5128e622d7834bb3f7ee23c2bbea8db63cebaf
x86/sgx/virt: implement SGX_IOC_VEPC_REMOVE ioctl

For bare-metal SGX on real hardware, the hardware provides guarantees
SGX state at reboot.  For instance, all pages start out uninitialized.
The vepc driver provides a similar guarantee today for freshly-opened
vepc instances, but guests such as Windows expect all pages to be in
uninitialized state on startup, including after every guest reboot.

Some userspace implementations of virtual SGX would rather avoid having
to close and reopen the /dev/sgx_vepc file descriptor and re-mmap the
virtual EPC.  For example, they could sandbox themselves after the guest
starts and forbid further calls to open(), in order to mitigate exploits
from untrusted guests.

Therefore, add a ioctl that does this with EREMOVE.  Userspace can
invoke the ioctl to bring its vEPC pages back to uninitialized state.
There is a possibility that some pages fail to be removed if they are
SECS pages, and the child and SECS pages could be in separate vEPC
regions.  Therefore, the ioctl returns the number of EREMOVE failures,
telling userspace to try the ioctl again after it's done with all
vEPC regions.  A more verbose description of the correct usage and
the possible error conditions is documented in sgx.rst.

Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Link: https://lkml.kernel.org/r/20211021201155.1523989-3-pbonzini@redhat.com
Documentation/x86/sgx.rst
arch/x86/include/uapi/asm/sgx.h
arch/x86/kernel/cpu/sgx/virt.c