lkml.org 
[lkml]   [2021]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 12/25] x86/sgx: Add helper to update SGX_LEPUBKEYHASHn MSRs
    Date
    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.

    Acked-by: Dave Hansen <dave.hansen@intel.com>
    Acked-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Kai Huang <kai.huang@intel.com>
    ---
    arch/x86/kernel/cpu/sgx/ioctl.c | 5 ++---
    arch/x86/kernel/cpu/sgx/main.c | 17 +++++++++++++++++
    arch/x86/kernel/cpu/sgx/sgx.h | 2 ++
    3 files changed, 21 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/kernel/cpu/sgx/ioctl.c b/arch/x86/kernel/cpu/sgx/ioctl.c
    index dc18ced04ad8..2a0aed446d6c 100644
    --- a/arch/x86/kernel/cpu/sgx/ioctl.c
    +++ b/arch/x86/kernel/cpu/sgx/ioctl.c
    @@ -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);

    diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c
    index b73114150ff8..b95168427056 100644
    --- a/arch/x86/kernel/cpu/sgx/main.c
    +++ b/arch/x86/kernel/cpu/sgx/main.c
    @@ -727,6 +727,23 @@ 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;
    diff --git a/arch/x86/kernel/cpu/sgx/sgx.h b/arch/x86/kernel/cpu/sgx/sgx.h
    index 5086b240d269..f0f2a92bb8d0 100644
    --- a/arch/x86/kernel/cpu/sgx/sgx.h
    +++ b/arch/x86/kernel/cpu/sgx/sgx.h
    @@ -89,4 +89,6 @@ static inline int __init sgx_vepc_init(void)
    }
    #endif

    +void sgx_update_lepubkeyhash(u64 *lepubkeyhash);
    +
    #endif /* _X86_SGX_H */
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-03-19 08:25    [W:5.902 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site