Re: [PATCH 1/2] x86: sgx_vepc: extract sgx_vepc_remove_page

From: Paolo Bonzini
Date: Mon Sep 13 2021 - 10:29:46 EST


On 13/09/21 16:05, Dave Hansen wrote:
On 9/13/21 6:11 AM, Paolo Bonzini wrote:
Windows expects all pages to be in uninitialized state on startup.
In order to implement this, we will need a ioctl that performs
EREMOVE on all pages mapped by a /dev/sgx_vepc file descriptor:
other possibilities, such as closing and reopening the device,
are racy.

Hi Paolo,

How does this end up happening in the first place?

All enclave pages should start out on 'sgx_dirty_page_list' and
ksgxd sanitizes them with EREMOVE before making them available. That
should cover EREMOVE after reboots while SGX pages are initialized,
including kexec().

By "Windows startup" I mean even after guest reboot. Because another process could sneak in and steal your EPC pages between a close() and an open(), I'd like to have a way to EREMOVE the pages while keeping them assigned to the specific vEPC instance, i.e. *without* going through sgx_vepc_free_page().

Thanks,

Paolo

sgx_vepc_free_page() should do the same for pages that a guest not not
clean up properly.

sgx_encl_free_epc_page() does an EREMOVE after a normal enclave has used
a page.

Those are the only three cases that I can think of. So, it sounds like
one of those is buggy, or there's another unexpected path out there.
Ultimately, I think it would be really handy if we could do this EREMOVE
implicitly and without any new ABI.