All running enclaves and cryptographic assets (such as internal SGX
encryption keys) are assumed to be compromised whenever an SGX-related
microcode update occurs. To mitigate this assumed compromise the new
supervisor SGX instruction ENCLS[EUPDATESVN] can generate fresh
cryptographic assets.
Before executing EUPDATESVN, all SGX memory must be marked as unused. This
requirement ensures that no potentially compromised enclave survives the
update and allows the system to safely regenerate cryptographic assets.
Add the method to perform ENCLS[EUPDATESVN]. However, until the follow up
patch that wires calling sgx_update_svn() from sgx_inc_usage_count(), this
code is not reachable.
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Elena Reshetova <elena.reshetova@intel.com>
---
arch/x86/include/asm/sgx.h | 31 +++++++-------
arch/x86/kernel/cpu/sgx/encls.h | 5 +++
arch/x86/kernel/cpu/sgx/main.c | 75 +++++++++++++++++++++++++++++++++
3 files changed, 96 insertions(+), 15 deletions(-)
diff --git a/arch/x86/include/asm/sgx.h b/arch/x86/include/asm/sgx.h
index 73348cf4fd78..c2c4c0d22ca4 100644
--- a/arch/x86/include/asm/sgx.h
+++ b/arch/x86/include/asm/sgx.h
@@ -28,21 +28,22 @@
#define SGX_CPUID_EPC_MASK GENMASK(3, 0)
enum sgx_encls_function {
- ECREATE = 0x00,
- EADD = 0x01,
- EINIT = 0x02,
- EREMOVE = 0x03,
- EDGBRD = 0x04,
- EDGBWR = 0x05,
- EEXTEND = 0x06,
- ELDU = 0x08,
- EBLOCK = 0x09,
- EPA = 0x0A,
- EWB = 0x0B,
- ETRACK = 0x0C,
- EAUG = 0x0D,
- EMODPR = 0x0E,
- EMODT = 0x0F,
+ ECREATE = 0x00,
+ EADD = 0x01,
+ EINIT = 0x02,
+ EREMOVE = 0x03,
+ EDGBRD = 0x04,
+ EDGBWR = 0x05,
+ EEXTEND = 0x06,
+ ELDU = 0x08,
+ EBLOCK = 0x09,
+ EPA = 0x0A,
+ EWB = 0x0B,
+ ETRACK = 0x0C,
+ EAUG = 0x0D,
+ EMODPR = 0x0E,
+ EMODT = 0x0F,
+ EUPDATESVN = 0x18,
};
/**
diff --git a/arch/x86/kernel/cpu/sgx/encls.h b/arch/x86/kernel/cpu/sgx/encls.h
index 99004b02e2ed..d9160c89a93d 100644
--- a/arch/x86/kernel/cpu/sgx/encls.h
+++ b/arch/x86/kernel/cpu/sgx/encls.h
@@ -233,4 +233,9 @@ static inline int __eaug(struct sgx_pageinfo *pginfo, void *addr)
return __encls_2(EAUG, pginfo, addr);
}
+/* Attempt to update CPUSVN at runtime. */
+static inline int __eupdatesvn(void)
+{
+ return __encls_ret_1(EUPDATESVN, "");
+}
#endif /* _X86_ENCLS_H */
diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c
index 3a5cbd1c170e..69ab28641e20 100644
--- a/arch/x86/kernel/cpu/sgx/main.c
+++ b/arch/x86/kernel/cpu/sgx/main.c
@@ -16,6 +16,7 @@
#include <linux/vmalloc.h>
#include <asm/msr.h>
#include <asm/sgx.h>
+#include <asm/archrandom.h>
#include "driver.h"
#include "encl.h"
#include "encls.h"
@@ -917,6 +918,80 @@ int sgx_set_attribute(unsigned long *allowed_attributes,
}
EXPORT_SYMBOL_GPL(sgx_set_attribute);
+/* Counter to count the active SGX users */
+static int sgx_usage_count;
+
+/**
+ * sgx_update_svn() - Attempt to call ENCLS[EUPDATESVN].
+ *
+ * This instruction attempts to update CPUSVN to the
+ * currently loaded microcode update SVN and generate new
+ * cryptographic assets.
+ *
+ * Return:
+ * * %0: - Success or not supported
+ * * %-EAGAIN: - Can be safely retried, failure is due to lack of
+ * * entropy in RNG
+ * * %-EIO: - Unexpected error, retries are not advisable
+ */
+static int __maybe_unused sgx_update_svn(void)
+{
+ int ret;
+
+ /*
+ * If EUPDATESVN is not available, it is ok to
+ * silently skip it to comply with legacy behavior.
+ */
+ if (!cpu_feature_enabled(X86_FEATURE_SGX_EUPDATESVN))
+ return 0;
+
+ /*
+ * EPC is guaranteed to be empty when there are no users.
+ * Ensure we are on our first user before proceeding further.
+ */
+ WARN(sgx_usage_count, "Elevated usage count when calling EUPDATESVN\n");
+
+ for (int i = 0; i < RDRAND_RETRY_LOOPS; i++) {
+ ret = __eupdatesvn();
+
+ /* Stop on success or unexpected errors: */
+ if (ret != SGX_INSUFFICIENT_ENTROPY)
+ break;
+ }
+
+ switch (ret) {
+ case 0:
+ /*
+ * SVN successfully updated.
+ * Let users know when the update was successful.
+ */
+ pr_info("SVN updated successfully\n");
+ return 0;
+ case SGX_NO_UPDATE:
+ /*
+ * SVN update failed since the current SVN is
+ * not newer than CPUSVN. This is the most
+ * common case and indicates no harm.
+ */
+ return 0;
+ case SGX_INSUFFICIENT_ENTROPY:
+ /*
+ * SVN update failed due to lack of entropy in DRNG.
+ * Indicate to userspace that it should retry.
+ */
+ return -EAGAIN;
+ default:
+ break;
+ }
+
+ /*
+ * EUPDATESVN was called when EPC is empty, all other error
+ * codes are unexpected.
+ */
+ ENCLS_WARN(ret, "EUPDATESVN");
+ return -EIO;
+}
+
int sgx_inc_usage_count(void)
{
return 0;
--
2.45.2
On Thu, 2025-08-14 at 10:34 +0300, Reshetova, Elena wrote: > All running enclaves and cryptographic assets (such as internal SGX > encryption keys) are assumed to be compromised whenever an SGX-related > microcode update occurs. To mitigate this assumed compromise the new > supervisor SGX instruction ENCLS[EUPDATESVN] can generate fresh > cryptographic assets. > > Before executing EUPDATESVN, all SGX memory must be marked as unused. This > requirement ensures that no potentially compromised enclave survives the > update and allows the system to safely regenerate cryptographic assets. > > Add the method to perform ENCLS[EUPDATESVN]. However, until the follow up > patch that wires calling sgx_update_svn() from sgx_inc_usage_count(), this > code is not reachable. > > Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> > Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> Reviewed-by: Kai Huang <kai.huang@intel.com> > > + * Return: > + * * %0: - Success or not supported > + * * %-EAGAIN: - Can be safely retried, failure is due to lack of > + * * entropy in RNG Nit: if another version is ever needed, I think it would be better to make the text vertical aligned w/o the leading '-', i.e., * %-EAGAIN: - Can be .... entropy in RNG. .. instead of * %-EAGAIN: - Can be .... entropy in RNG.
> -----Original Message----- > From: Huang, Kai <kai.huang@intel.com> > Sent: Thursday, August 14, 2025 12:36 PM > To: Reshetova, Elena <elena.reshetova@intel.com>; Hansen, Dave > <dave.hansen@intel.com> > Cc: seanjc@google.com; mingo@kernel.org; Scarlata, Vincent R > <vincent.r.scarlata@intel.com>; x86@kernel.org; jarkko@kernel.org; > Annapurve, Vishal <vannapurve@google.com>; linux-kernel@vger.kernel.org; > Mallick, Asit K <asit.k.mallick@intel.com>; Aktas, Erdem > <erdemaktas@google.com>; Cai, Chong <chongc@google.com>; Bondarevska, > Nataliia <bondarn@google.com>; linux-sgx@vger.kernel.org; Raynor, Scott > <scott.raynor@intel.com> > Subject: Re: [PATCH v14 4/5] x86/sgx: Implement ENCLS[EUPDATESVN] > > On Thu, 2025-08-14 at 10:34 +0300, Reshetova, Elena wrote: > > All running enclaves and cryptographic assets (such as internal SGX > > encryption keys) are assumed to be compromised whenever an SGX-related > > microcode update occurs. To mitigate this assumed compromise the new > > supervisor SGX instruction ENCLS[EUPDATESVN] can generate fresh > > cryptographic assets. > > > > Before executing EUPDATESVN, all SGX memory must be marked as unused. > This > > requirement ensures that no potentially compromised enclave survives the > > update and allows the system to safely regenerate cryptographic assets. > > > > Add the method to perform ENCLS[EUPDATESVN]. However, until the follow > up > > patch that wires calling sgx_update_svn() from sgx_inc_usage_count(), this > > code is not reachable. > > > > Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> > > Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> > > Reviewed-by: Kai Huang <kai.huang@intel.com> > > > > > + * Return: > > + * * %0: - Success or not supported > > + * * %-EAGAIN: - Can be safely retried, failure is due to lack of > > + * * entropy in RNG > > Nit: if another version is ever needed, I think it would be better to make > the text vertical aligned w/o the leading '-', i.e., > > * %-EAGAIN: - Can be .... > entropy in RNG. > > .. instead of > > * %-EAGAIN: - Can be .... > entropy in RNG. OK, yes, this can be fixed, indeed. Thank you very much for your reviews, Kai!
> > > > > > > > + * Return: > > > + * * %0: - Success or not supported > > > + * * %-EAGAIN: - Can be safely retried, failure is due to lack of > > > + * * entropy in RNG > > > > Nit: if another version is ever needed, I think it would be better to make > > the text vertical aligned w/o the leading '-', i.e., > > > > * %-EAGAIN: - Can be .... > > entropy in RNG. > > > > .. instead of > > > > * %-EAGAIN: - Can be .... > > entropy in RNG. > > OK, yes, this can be fixed, indeed. > I downloaded those patches and checked locally. I found there's an unnecessary 'tab' between the error codes and the descriptions, making the whitespace between them unnecessarily too long. Please see below diff I came up with: diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c index cff5c4d22ac2..c6467628da04 100644 --- a/arch/x86/kernel/cpu/sgx/main.c +++ b/arch/x86/kernel/cpu/sgx/main.c @@ -929,10 +929,10 @@ static int sgx_usage_count; * cryptographic assets. * * Return: - * * %0: - Success or not supported - * * %-EAGAIN: - Can be safely retried, failure is due to lack of - * * entropy in RNG - * * %-EIO: - Unexpected error, retries are not advisable + * * %0: - Success or not supported + * * %-EAGAIN: - Can be safely retried, failure is due to lack of + * * entropy in RNG + * * %-EIO: - Unexpected error, retries are not advisable */ static int sgx_update_svn(void) {
> -----Original Message----- > From: Huang, Kai <kai.huang@intel.com> > Sent: Friday, August 15, 2025 1:31 AM > To: Reshetova, Elena <elena.reshetova@intel.com>; Hansen, Dave > <dave.hansen@intel.com> > Cc: linux-sgx@vger.kernel.org; mingo@kernel.org; Scarlata, Vincent R > <vincent.r.scarlata@intel.com>; x86@kernel.org; jarkko@kernel.org; > Annapurve, Vishal <vannapurve@google.com>; linux-kernel@vger.kernel.org; > Mallick, Asit K <asit.k.mallick@intel.com>; Aktas, Erdem > <erdemaktas@google.com>; Cai, Chong <chongc@google.com>; Bondarevska, > Nataliia <bondarn@google.com>; seanjc@google.com; Raynor, Scott > <scott.raynor@intel.com> > Subject: Re: [PATCH v14 4/5] x86/sgx: Implement ENCLS[EUPDATESVN] > > > > > > > > > > > > > + * Return: > > > > + * * %0: - Success or not supported > > > > + * * %-EAGAIN: - Can be safely retried, failure is due to lack of > > > > + * * entropy in RNG > > > > > > Nit: if another version is ever needed, I think it would be better to make > > > the text vertical aligned w/o the leading '-', i.e., > > > > > > * %-EAGAIN: - Can be .... > > > entropy in RNG. > > > > > > .. instead of > > > > > > * %-EAGAIN: - Can be .... > > > entropy in RNG. > > > > OK, yes, this can be fixed, indeed. > > > > I downloaded those patches and checked locally. I found there's an > unnecessary 'tab' between the error codes and the descriptions, making the > whitespace between them unnecessarily too long. > > Please see below diff I came up with: > > diff --git a/arch/x86/kernel/cpu/sgx/main.c > b/arch/x86/kernel/cpu/sgx/main.c > index cff5c4d22ac2..c6467628da04 100644 > --- a/arch/x86/kernel/cpu/sgx/main.c > +++ b/arch/x86/kernel/cpu/sgx/main.c > @@ -929,10 +929,10 @@ static int sgx_usage_count; > * cryptographic assets. > * > * Return: > - * * %0: - Success or not supported > - * * %-EAGAIN: - Can be safely retried, failure is due to lack of > - * * entropy in RNG > - * * %-EIO: - Unexpected error, retries are not advisable > + * * %0: - Success or not supported > + * * %-EAGAIN: - Can be safely retried, failure is due to lack of > + * * entropy in RNG > + * * %-EIO: - Unexpected error, retries are not advisable > */ > static int sgx_update_svn(void) > { Thank you, I will use will rendering!
© 2016 - 2025 Red Hat, Inc.