Commit 73916b6a authored by Kai Huang's avatar Kai Huang Committed by Borislav Petkov
Browse files

x86/sgx: Add helper to update SGX_LEPUBKEYHASHn MSRs



Add a helper to update SGX_LEPUBKEYHASHn MSRs.  SGX virtualization also
needs to update those MSRs based on guest's "virtual" SGX_LEPUBKEYHASHn
before EINIT from guest.

Signed-off-by: default avatarKai Huang <kai.huang@intel.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Acked-by: default avatarDave Hansen <dave.hansen@intel.com>
Acked-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
Link: https://lkml.kernel.org/r/dfb7cd39d4dd62ea27703b64afdd8bccb579f623.1616136308.git.kai.huang@intel.com
parent a67136b4
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -495,7 +495,7 @@ static int sgx_encl_init(struct sgx_encl *encl, struct sgx_sigstruct *sigstruct,
			 void *token)
{
	u64 mrsigner[4];
	int i, j, k;
	int i, j;
	void *addr;
	int ret;

@@ -544,8 +544,7 @@ static int sgx_encl_init(struct sgx_encl *encl, struct sgx_sigstruct *sigstruct,

			preempt_disable();

			for (k = 0; k < 4; k++)
				wrmsrl(MSR_IA32_SGXLEPUBKEYHASH0 + k, mrsigner[k]);
			sgx_update_lepubkeyhash(mrsigner);

			ret = __einit(sigstruct, token, addr);

+16 −0
Original line number Diff line number Diff line
@@ -727,6 +727,22 @@ static bool __init sgx_page_cache_init(void)
	return true;
}

/*
 * Update the SGX_LEPUBKEYHASH MSRs to the values specified by caller.
 * Bare-metal driver requires to update them to hash of enclave's signer
 * before EINIT. KVM needs to update them to guest's virtual MSR values
 * before doing EINIT from guest.
 */
void sgx_update_lepubkeyhash(u64 *lepubkeyhash)
{
	int i;

	WARN_ON_ONCE(preemptible());

	for (i = 0; i < 4; i++)
		wrmsrl(MSR_IA32_SGXLEPUBKEYHASH0 + i, lepubkeyhash[i]);
}

static int __init sgx_init(void)
{
	int ret;
+2 −0
Original line number Diff line number Diff line
@@ -93,4 +93,6 @@ static inline int __init sgx_vepc_init(void)
}
#endif

void sgx_update_lepubkeyhash(u64 *lepubkeyhash);

#endif /* _X86_SGX_H */