lkml.org 
[lkml]   [2024]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v19 032/130] KVM: TDX: Add helper functions to allocate/free TDX private host key id
    Date
    From: Isaku Yamahata <isaku.yamahata@intel.com>

    Add helper functions to allocate/free TDX private host key id (HKID).

    The memory controller encrypts TDX memory with the assigned TDX HKIDs. The
    global TDX HKID is to encrypt the TDX module, its memory, and some dynamic
    data (TDR). The private TDX HKID is assigned to guest TD to encrypt guest
    memory and the related data. When VMM releases an encrypted page for
    reuse, the page needs a cache flush with the used HKID. VMM needs the
    global TDX HKID and the private TDX HKIDs to flush encrypted pages.

    Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    ---
    v19:
    - Removed stale comment in tdx_guest_keyid_alloc() by Binbin
    - Update sanity check in tdx_guest_keyid_free() by Binbin

    v18:
    - Moved the functions to kvm tdx from arch/x86/virt/vmx/tdx/
    - Drop exporting symbols as the host tdx does.

    Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    ---
    arch/x86/kvm/vmx/tdx.c | 28 ++++++++++++++++++++++++++++
    1 file changed, 28 insertions(+)

    diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
    index a7e096fd8361..cde971122c1e 100644
    --- a/arch/x86/kvm/vmx/tdx.c
    +++ b/arch/x86/kvm/vmx/tdx.c
    @@ -11,6 +11,34 @@
    #undef pr_fmt
    #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

    +/*
    + * Key id globally used by TDX module: TDX module maps TDR with this TDX global
    + * key id. TDR includes key id assigned to the TD. Then TDX module maps other
    + * TD-related pages with the assigned key id. TDR requires this TDX global key
    + * id for cache flush unlike other TD-related pages.
    + */
    +/* TDX KeyID pool */
    +static DEFINE_IDA(tdx_guest_keyid_pool);
    +
    +static int __used tdx_guest_keyid_alloc(void)
    +{
    + if (WARN_ON_ONCE(!tdx_guest_keyid_start || !tdx_nr_guest_keyids))
    + return -EINVAL;
    +
    + return ida_alloc_range(&tdx_guest_keyid_pool, tdx_guest_keyid_start,
    + tdx_guest_keyid_start + tdx_nr_guest_keyids - 1,
    + GFP_KERNEL);
    +}
    +
    +static void __used tdx_guest_keyid_free(int keyid)
    +{
    + if (WARN_ON_ONCE(keyid < tdx_guest_keyid_start ||
    + keyid > tdx_guest_keyid_start + tdx_nr_guest_keyids - 1))
    + return;
    +
    + ida_free(&tdx_guest_keyid_pool, keyid);
    +}
    +
    static int __init tdx_module_setup(void)
    {
    int ret;
    --
    2.25.1

    \
     
     \ /
      Last update: 2024-05-27 15:21    [W:4.029 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site