Re: [PATCH 1/4] x86/sgx: Track phase and type of SGX EPC pages

From: Reinette Chatre
Date: Wed Jul 14 2021 - 16:42:20 EST


Hi Tony,

On 7/8/2021 11:14 AM, Tony Luck wrote:

Add a type field to struct epc_page for how an in-use page has been
allocated. Re-use "enum sgx_page_type" for this type, with a couple
of additions for s/w types.

Tracking the enclave page type is a useful addition that will also help the SGX2 support where some instructions (ENCLS[EMODPR]) are only allowed on pages with particular type.

Could this tracking be done at the enclave page (struct sgx_encl_page) instead? The enclave page's EPC page information is not available when the page is in swap and it would be useful to know the page type without loading the page from swap. The information would continue to be accessible from struct epc_page via the owner pointer that may make some of the changes easier since it would not be needed to pass the page type around so much and thus possibly address the SECS page issue that Sean pointed out in
https://lore.kernel.org/lkml/YO3FuBupQTKYaKBf@xxxxxxxxxx/

diff --git a/arch/x86/kernel/cpu/sgx/sgx.h b/arch/x86/kernel/cpu/sgx/sgx.h
index 4628acec0009..e43d3c27eb96 100644
--- a/arch/x86/kernel/cpu/sgx/sgx.h
+++ b/arch/x86/kernel/cpu/sgx/sgx.h
@@ -26,9 +26,19 @@
/* Pages, which are being tracked by the page reclaimer. */
#define SGX_EPC_PAGE_RECLAIMER_TRACKED BIT(0)
+/* Pages, on the "sgx_dirty_page_list" */
+#define SGX_EPC_PAGE_DIRTY BIT(1)
+
+/* Pages, on one of the node free lists */
+#define SGX_EPC_PAGE_FREE BIT(2)
+
+/* Pages, with h/w poison errors */
+#define SGX_EPC_PAGE_POISON BIT(3)
+
struct sgx_epc_page {
unsigned int section;
- unsigned int flags;
+ u16 flags;
+ u16 type;

Could this be "enum sgx_page_type type" ?

Reinette