[PATCH 01/25] x86/sgx: Add shortlog descriptions to ENCLS wrappers

From: Reinette Chatre
Date: Wed Dec 01 2021 - 14:24:26 EST


The SGX ENCLS instruction uses EAX to specify an SGX function and
may require additional registers, depending on the SGX function.
ENCLS invokes the specified privileged SGX function for managing
and debugging enclaves. Macros are used to wrap the ENCLS
functionality and several wrappers are used to wrap the macros to
make the different SGX functions accessible in the code.

The wrappers of the supported SGX functions are cryptic. Add short
changelog descriptions of each to a comment.

Suggested-by: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
Signed-off-by: Reinette Chatre <reinette.chatre@xxxxxxxxx>
---
arch/x86/kernel/cpu/sgx/encls.h | 12 ++++++++++++
1 file changed, 12 insertions(+)

diff --git a/arch/x86/kernel/cpu/sgx/encls.h b/arch/x86/kernel/cpu/sgx/encls.h
index 9b204843b78d..241b766265d3 100644
--- a/arch/x86/kernel/cpu/sgx/encls.h
+++ b/arch/x86/kernel/cpu/sgx/encls.h
@@ -162,57 +162,68 @@ static inline bool encls_failed(int ret)
ret; \
})

+/* Create an SECS page in the Enclave Page Cache (EPC) */
static inline int __ecreate(struct sgx_pageinfo *pginfo, void *secs)
{
return __encls_2(ECREATE, pginfo, secs);
}

+/* Extend uninitialized enclave measurement */
static inline int __eextend(void *secs, void *addr)
{
return __encls_2(EEXTEND, secs, addr);
}

+/* Add a page to an uninitialized enclave */
static inline int __eadd(struct sgx_pageinfo *pginfo, void *addr)
{
return __encls_2(EADD, pginfo, addr);
}

+/* Initialize an enclave for execution */
static inline int __einit(void *sigstruct, void *token, void *secs)
{
return __encls_ret_3(EINIT, sigstruct, secs, token);
}

+/* Remove a page from the Enclave Page Cache (EPC) */
static inline int __eremove(void *addr)
{
return __encls_ret_1(EREMOVE, addr);
}

+/* Write to a debug enclave */
static inline int __edbgwr(void *addr, unsigned long *data)
{
return __encls_2(EDGBWR, *data, addr);
}

+/* Read from a debug enclave */
static inline int __edbgrd(void *addr, unsigned long *data)
{
return __encls_1_1(EDGBRD, *data, addr);
}

+/* Track threads operating inside the enclave */
static inline int __etrack(void *addr)
{
return __encls_ret_1(ETRACK, addr);
}

+/* Load, verify, and unblock an Enclave Page Cache (EPC) page */
static inline int __eldu(struct sgx_pageinfo *pginfo, void *addr,
void *va)
{
return __encls_ret_3(ELDU, pginfo, addr, va);
}

+/* Mark an Enclave Page Cache (EPC) page as blocked */
static inline int __eblock(void *addr)
{
return __encls_ret_1(EBLOCK, addr);
}

+/* Add a Version Array (VA) page to the Enclave Page Cache (EPC) */
static inline int __epa(void *addr)
{
unsigned long rbx = SGX_PAGE_TYPE_VA;
@@ -220,6 +231,7 @@ static inline int __epa(void *addr)
return __encls_2(EPA, rbx, addr);
}

+/* Invalidate an EPC page and write it out to main memory */
static inline int __ewb(struct sgx_pageinfo *pginfo, void *addr,
void *va)
{
--
2.25.1