lkml.org 
[lkml]   [2022]   [Jun]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 51/67] x86/sgx: Ensure no data in PCMD page after truncate
    Date
    From: Reinette Chatre <reinette.chatre@intel.com>

    commit e3a3bbe3e99de73043a1d32d36cf4d211dc58c7e upstream.

    A PCMD (Paging Crypto MetaData) page contains the PCMD
    structures of enclave pages that have been encrypted and
    moved to the shmem backing store. When all enclave pages
    sharing a PCMD page are loaded in the enclave, there is no
    need for the PCMD page and it can be truncated from the
    backing store.

    A few issues appeared around the truncation of PCMD pages. The
    known issues have been addressed but the PCMD handling code could
    be made more robust by loudly complaining if any new issue appears
    in this area.

    Add a check that will complain with a warning if the PCMD page is not
    actually empty after it has been truncated. There should never be data
    in the PCMD page at this point since it is was just checked to be empty
    and truncated with enclave mutex held and is updated with the
    enclave mutex held.

    Suggested-by: Dave Hansen <dave.hansen@linux.intel.com>
    Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
    Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
    Tested-by: Haitao Huang <haitao.huang@intel.com>
    Link: https://lkml.kernel.org/r/6495120fed43fafc1496d09dd23df922b9a32709.1652389823.git.reinette.chatre@intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/kernel/cpu/sgx/encl.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    --- a/arch/x86/kernel/cpu/sgx/encl.c
    +++ b/arch/x86/kernel/cpu/sgx/encl.c
    @@ -187,12 +187,20 @@ static int __sgx_encl_eldu(struct sgx_en
    kunmap_atomic(pcmd_page);
    kunmap_atomic((void *)(unsigned long)pginfo.contents);

    + get_page(b.pcmd);
    sgx_encl_put_backing(&b);

    sgx_encl_truncate_backing_page(encl, page_index);

    - if (pcmd_page_empty && !reclaimer_writing_to_pcmd(encl, pcmd_first_page))
    + if (pcmd_page_empty && !reclaimer_writing_to_pcmd(encl, pcmd_first_page)) {
    sgx_encl_truncate_backing_page(encl, PFN_DOWN(page_pcmd_off));
    + pcmd_page = kmap_atomic(b.pcmd);
    + if (memchr_inv(pcmd_page, 0, PAGE_SIZE))
    + pr_warn("PCMD page not empty after truncate.\n");
    + kunmap_atomic(pcmd_page);
    + }
    +
    + put_page(b.pcmd);

    return ret;
    }

    \
     
     \ /
      Last update: 2022-06-03 20:18    [W:2.667 / U:0.532 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site