lkml.org 
[lkml]   [2022]   [Apr]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V4 13/31] x86/sgx: Export sgx_encl_page_alloc()
    Date
    From: Jarkko Sakkinen <jarkko@kernel.org>

    Move sgx_encl_page_alloc() to encl.c and export it so that it can be
    used in the implementation for support of adding pages to initialized
    enclaves, which requires to allocate new enclave pages.

    Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
    ---
    No changes since V3.

    Changes since V2:
    - New patch
    Originally submitted at:
    https://lore.kernel.org/linux-sgx/20220308112833.262805-3-jarkko@kernel.org/

    arch/x86/kernel/cpu/sgx/encl.c | 32 ++++++++++++++++++++++++++++++++
    arch/x86/kernel/cpu/sgx/encl.h | 3 +++
    arch/x86/kernel/cpu/sgx/ioctl.c | 32 --------------------------------
    3 files changed, 35 insertions(+), 32 deletions(-)

    diff --git a/arch/x86/kernel/cpu/sgx/encl.c b/arch/x86/kernel/cpu/sgx/encl.c
    index c77a62432862..546423753e4c 100644
    --- a/arch/x86/kernel/cpu/sgx/encl.c
    +++ b/arch/x86/kernel/cpu/sgx/encl.c
    @@ -792,6 +792,38 @@ int sgx_encl_test_and_clear_young(struct mm_struct *mm,
    return ret;
    }

    +struct sgx_encl_page *sgx_encl_page_alloc(struct sgx_encl *encl,
    + unsigned long offset,
    + u64 secinfo_flags)
    +{
    + struct sgx_encl_page *encl_page;
    + unsigned long prot;
    +
    + encl_page = kzalloc(sizeof(*encl_page), GFP_KERNEL);
    + if (!encl_page)
    + return ERR_PTR(-ENOMEM);
    +
    + encl_page->desc = encl->base + offset;
    + encl_page->encl = encl;
    +
    + prot = _calc_vm_trans(secinfo_flags, SGX_SECINFO_R, PROT_READ) |
    + _calc_vm_trans(secinfo_flags, SGX_SECINFO_W, PROT_WRITE) |
    + _calc_vm_trans(secinfo_flags, SGX_SECINFO_X, PROT_EXEC);
    +
    + /*
    + * TCS pages must always RW set for CPU access while the SECINFO
    + * permissions are *always* zero - the CPU ignores the user provided
    + * values and silently overwrites them with zero permissions.
    + */
    + if ((secinfo_flags & SGX_SECINFO_PAGE_TYPE_MASK) == SGX_SECINFO_TCS)
    + prot |= PROT_READ | PROT_WRITE;
    +
    + /* Calculate maximum of the VM flags for the page. */
    + encl_page->vm_max_prot_bits = calc_vm_prot_bits(prot, 0);
    +
    + return encl_page;
    +}
    +
    /**
    * sgx_zap_enclave_ptes() - remove PTEs mapping the address from enclave
    * @encl: the enclave
    diff --git a/arch/x86/kernel/cpu/sgx/encl.h b/arch/x86/kernel/cpu/sgx/encl.h
    index 9d673d9531f0..253ebdd1c5be 100644
    --- a/arch/x86/kernel/cpu/sgx/encl.h
    +++ b/arch/x86/kernel/cpu/sgx/encl.h
    @@ -112,6 +112,9 @@ int sgx_encl_get_backing(struct sgx_encl *encl, unsigned long page_index,
    void sgx_encl_put_backing(struct sgx_backing *backing, bool do_write);
    int sgx_encl_test_and_clear_young(struct mm_struct *mm,
    struct sgx_encl_page *page);
    +struct sgx_encl_page *sgx_encl_page_alloc(struct sgx_encl *encl,
    + unsigned long offset,
    + u64 secinfo_flags);
    void sgx_zap_enclave_ptes(struct sgx_encl *encl, unsigned long addr);
    struct sgx_epc_page *sgx_alloc_va_page(void);
    unsigned int sgx_alloc_va_slot(struct sgx_va_page *va_page);
    diff --git a/arch/x86/kernel/cpu/sgx/ioctl.c b/arch/x86/kernel/cpu/sgx/ioctl.c
    index 2df27dd8b30d..bb8cdb2ad0d1 100644
    --- a/arch/x86/kernel/cpu/sgx/ioctl.c
    +++ b/arch/x86/kernel/cpu/sgx/ioctl.c
    @@ -169,38 +169,6 @@ static long sgx_ioc_enclave_create(struct sgx_encl *encl, void __user *arg)
    return ret;
    }

    -static struct sgx_encl_page *sgx_encl_page_alloc(struct sgx_encl *encl,
    - unsigned long offset,
    - u64 secinfo_flags)
    -{
    - struct sgx_encl_page *encl_page;
    - unsigned long prot;
    -
    - encl_page = kzalloc(sizeof(*encl_page), GFP_KERNEL);
    - if (!encl_page)
    - return ERR_PTR(-ENOMEM);
    -
    - encl_page->desc = encl->base + offset;
    - encl_page->encl = encl;
    -
    - prot = _calc_vm_trans(secinfo_flags, SGX_SECINFO_R, PROT_READ) |
    - _calc_vm_trans(secinfo_flags, SGX_SECINFO_W, PROT_WRITE) |
    - _calc_vm_trans(secinfo_flags, SGX_SECINFO_X, PROT_EXEC);
    -
    - /*
    - * TCS pages must always RW set for CPU access while the SECINFO
    - * permissions are *always* zero - the CPU ignores the user provided
    - * values and silently overwrites them with zero permissions.
    - */
    - if ((secinfo_flags & SGX_SECINFO_PAGE_TYPE_MASK) == SGX_SECINFO_TCS)
    - prot |= PROT_READ | PROT_WRITE;
    -
    - /* Calculate maximum of the VM flags for the page. */
    - encl_page->vm_max_prot_bits = calc_vm_prot_bits(prot, 0);
    -
    - return encl_page;
    -}
    -
    static int sgx_validate_secinfo(struct sgx_secinfo *secinfo)
    {
    u64 perm = secinfo->flags & SGX_SECINFO_PERMISSION_MASK;
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-04-13 23:13    [W:8.396 / U:0.836 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site