On Mon, Apr 04, 2022 at 09:49:10AM -0700, Reinette Chatre wrote: > Add a wrapper for the EMODPR ENCLS leaf function used to > restrict enclave page permissions as maintained in the > SGX hardware's Enclave Page Cache Map (EPCM). > > EMODPR: > 1) Updates the EPCM permissions of an enclave page by treating > the new permissions as a mask. Supplying a value that attempts > to relax EPCM permissions has no effect on EPCM permissions > (PR bit, see below, is changed). > 2) Sets the PR bit in the EPCM entry of the enclave page to > indicate that permission restriction is in progress. The bit > is reset by the enclave by invoking ENCLU leaf function > EACCEPT or EACCEPTCOPY. > > The enclave may access the page throughout the entire process > if conforming to the EPCM permissions for the enclave page. > > After performing the permission restriction by issuing EMODPR > the kernel needs to collaborate with the hardware to ensure that > all logical processors sees the new restricted permissions. This > is required for the enclave's EACCEPT/EACCEPTCOPY to succeed and > is accomplished with the ETRACK flow. > > Expand enum sgx_return_code with the possible EMODPR return > values. > > Signed-off-by: Reinette Chatre <reinette.chatre@xxxxxxxxx> > --- > Changes since V2: > - Add detail to changelog that PR bit is set when EPCM permissions > not changed when relaxing of permissions using EMODPR attempted. > > Changes since V1: > - Split original patch ("x86/sgx: Add wrappers for SGX2 functions") > in three to introduce the SGX2 functions separately (Jarkko). > - Rewrite commit message to include how the EPCM within the hardware > is changed by the SGX2 function as well as the calling > conditions (Jarkko). > - Make short description more specific to which permissions (EPCM > permissions) the function modifies. > > arch/x86/include/asm/sgx.h | 5 +++++ > arch/x86/kernel/cpu/sgx/encls.h | 6 ++++++ > 2 files changed, 11 insertions(+) > > diff --git a/arch/x86/include/asm/sgx.h b/arch/x86/include/asm/sgx.h > index 3f9334ef67cd..d67810b50a81 100644 > --- a/arch/x86/include/asm/sgx.h > +++ b/arch/x86/include/asm/sgx.h > @@ -65,17 +65,22 @@ enum sgx_encls_function { > > /** > * enum sgx_return_code - The return code type for ENCLS, ENCLU and ENCLV > + * %SGX_EPC_PAGE_CONFLICT: Page is being written by other ENCLS function. > * %SGX_NOT_TRACKED: Previous ETRACK's shootdown sequence has not > * been completed yet. > * %SGX_CHILD_PRESENT SECS has child pages present in the EPC. > * %SGX_INVALID_EINITTOKEN: EINITTOKEN is invalid and enclave signer's > * public key does not match IA32_SGXLEPUBKEYHASH. > + * %SGX_PAGE_NOT_MODIFIABLE: The EPC page cannot be modified because it > + * is in the PENDING or MODIFIED state. > * %SGX_UNMASKED_EVENT: An unmasked event, e.g. INTR, was received > */ > enum sgx_return_code { > + SGX_EPC_PAGE_CONFLICT = 7, > SGX_NOT_TRACKED = 11, > SGX_CHILD_PRESENT = 13, > SGX_INVALID_EINITTOKEN = 16, > + SGX_PAGE_NOT_MODIFIABLE = 20, > SGX_UNMASKED_EVENT = 128, > }; > > diff --git a/arch/x86/kernel/cpu/sgx/encls.h b/arch/x86/kernel/cpu/sgx/encls.h > index 0e22fa8f77c5..2b091912f038 100644 > --- a/arch/x86/kernel/cpu/sgx/encls.h > +++ b/arch/x86/kernel/cpu/sgx/encls.h > @@ -215,4 +215,10 @@ static inline int __ewb(struct sgx_pageinfo *pginfo, void *addr, > return __encls_ret_3(EWB, pginfo, addr, va); > } > > +/* Restrict the EPCM permissions of an EPC page. */ > +static inline int __emodpr(struct sgx_secinfo *secinfo, void *addr) > +{ > + return __encls_ret_2(EMODPR, secinfo, addr); > +} > + > #endif /* _X86_ENCLS_H */ > -- > 2.25.1 > Reviewed-by: Jarkko Sakkinen <jarkko@xxxxxxxxxx> BR, Jarkko