lkml.org 
[lkml]   [2022]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v7 024/102] KVM: TDX: Add place holder for TDX VM specific mem_enc_op ioctl
    On Mon, Jun 27, 2022 at 02:53:16PM -0700, isaku.yamahata@intel.com wrote:
    > From: Isaku Yamahata <isaku.yamahata@intel.com>
    >
    > Add a place holder function for TDX specific VM-scoped ioctl as mem_enc_op.
    > TDX specific sub-commands will be added to retrieve/pass TDX specific
    > parameters.
    >
    > KVM_MEMORY_ENCRYPT_OP was introduced for VM-scoped operations specific for
    > guest state-protected VM. It defined subcommands for technology-specific
    > operations under KVM_MEMORY_ENCRYPT_OP. Despite its name, the subcommands
    > are not limited to memory encryption, but various technology-specific
    > operations are defined. It's natural to repurpose KVM_MEMORY_ENCRYPT_OP
    > for TDX specific operations and define subcommands.
    >
    > TDX requires VM-scoped, and VCPU-scoped TDX-specific operations for device
    > model, for example, qemu. Getting system-wide parameters, TDX-specific VM
    > initialization, and TDX-specific vCPU initialization. Which requires KVM
    > vCPU-scoped operations in addition to the existing VM-scoped operations.

    Suggest to no need talking about vcpu scope operations here, because
    they're not available in this patch, we can talk about them in the
    patch which introduces them.

    >
    > Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    > ---
    > arch/x86/kvm/vmx/main.c | 9 +++++++++
    > arch/x86/kvm/vmx/tdx.c | 26 ++++++++++++++++++++++++++
    > arch/x86/kvm/vmx/x86_ops.h | 4 ++++
    > 3 files changed, 39 insertions(+)
    >
    > diff --git a/arch/x86/kvm/vmx/main.c b/arch/x86/kvm/vmx/main.c
    > index 7b497ed1f21c..067f5de56c53 100644
    > --- a/arch/x86/kvm/vmx/main.c
    > +++ b/arch/x86/kvm/vmx/main.c
    > @@ -73,6 +73,14 @@ static void vt_vm_free(struct kvm *kvm)
    > return tdx_vm_free(kvm);
    > }
    >
    > +static int vt_mem_enc_ioctl(struct kvm *kvm, void __user *argp)
    > +{
    > + if (!is_td(kvm))
    > + return -ENOTTY;
    > +
    > + return tdx_vm_ioctl(kvm, argp);
    > +}
    > +
    > struct kvm_x86_ops vt_x86_ops __initdata = {
    > .name = "kvm_intel",
    >
    > @@ -214,6 +222,7 @@ struct kvm_x86_ops vt_x86_ops __initdata = {
    > .vcpu_deliver_sipi_vector = kvm_vcpu_deliver_sipi_vector,
    >
    > .dev_mem_enc_ioctl = tdx_dev_ioctl,
    > + .mem_enc_ioctl = vt_mem_enc_ioctl,
    > };
    >
    > struct kvm_x86_init_ops vt_init_ops __initdata = {
    > diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
    > index ec4ebba4152a..2a9dfd54189f 100644
    > --- a/arch/x86/kvm/vmx/tdx.c
    > +++ b/arch/x86/kvm/vmx/tdx.c
    > @@ -438,6 +438,32 @@ int tdx_dev_ioctl(void __user *argp)
    > return 0;
    > }
    >
    > +int tdx_vm_ioctl(struct kvm *kvm, void __user *argp)
    > +{
    > + struct kvm_tdx_cmd tdx_cmd;
    > + int r;
    > +
    > + if (copy_from_user(&tdx_cmd, argp, sizeof(struct kvm_tdx_cmd)))
    > + return -EFAULT;
    > + if (tdx_cmd.error || tdx_cmd.unused)
    > + return -EINVAL;
    > +
    > + mutex_lock(&kvm->lock);
    > +
    > + switch (tdx_cmd.id) {
    > + default:
    > + r = -EINVAL;
    > + goto out;
    > + }
    > +
    > + if (copy_to_user(argp, &tdx_cmd, sizeof(struct kvm_tdx_cmd)))
    > + r = -EFAULT;
    > +
    > +out:
    > + mutex_unlock(&kvm->lock);
    > + return r;
    > +}
    > +
    > int __init tdx_module_setup(void)
    > {
    > const struct tdsysinfo_struct *tdsysinfo;
    > diff --git a/arch/x86/kvm/vmx/x86_ops.h b/arch/x86/kvm/vmx/x86_ops.h
    > index 3027d9821fe1..ef6115ae0e88 100644
    > --- a/arch/x86/kvm/vmx/x86_ops.h
    > +++ b/arch/x86/kvm/vmx/x86_ops.h
    > @@ -137,6 +137,8 @@ int tdx_dev_ioctl(void __user *argp);
    > int tdx_vm_init(struct kvm *kvm);
    > void tdx_mmu_release_hkid(struct kvm *kvm);
    > void tdx_vm_free(struct kvm *kvm);
    > +
    > +int tdx_vm_ioctl(struct kvm *kvm, void __user *argp);
    > #else
    > static inline int tdx_hardware_setup(struct kvm_x86_ops *x86_ops) { return 0; }
    > static inline bool tdx_is_vm_type_supported(unsigned long type) { return false; }
    > @@ -147,6 +149,8 @@ static inline int tdx_vm_init(struct kvm *kvm) { return -EOPNOTSUPP; }
    > static inline void tdx_mmu_release_hkid(struct kvm *kvm) {}
    > static inline void tdx_flush_shadow_all_private(struct kvm *kvm) {}
    > static inline void tdx_vm_free(struct kvm *kvm) {}
    > +
    > +static inline int tdx_vm_ioctl(struct kvm *kvm, void __user *argp) { return -EOPNOTSUPP; }
    > #endif
    >
    > #endif /* __KVM_X86_VMX_X86_OPS_H */
    > --
    > 2.25.1
    >

    \
     
     \ /
      Last update: 2022-07-07 09:13    [W:2.349 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site