lkml.org 
[lkml]   [2022]   [Apr]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC PATCH v5 027/104] KVM: TDX: initialize VM with TDX specific parameters
    On Thu, Mar 31, 2022 at 05:55:01PM +1300,
    Kai Huang <kai.huang@intel.com> wrote:

    > > diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h
    > > index 70f9be4ea575..6e26dde0dce6 100644
    > > --- a/arch/x86/include/uapi/asm/kvm.h
    > > +++ b/arch/x86/include/uapi/asm/kvm.h
    > > @@ -531,6 +531,7 @@ struct kvm_pmu_event_filter {
    > > /* Trust Domain eXtension sub-ioctl() commands. */
    > > enum kvm_tdx_cmd_id {
    > > KVM_TDX_CAPABILITIES = 0,
    > > + KVM_TDX_INIT_VM,
    > >
    > > KVM_TDX_CMD_NR_MAX,
    > > };
    > > @@ -561,4 +562,15 @@ struct kvm_tdx_capabilities {
    > > struct kvm_tdx_cpuid_config cpuid_configs[0];
    > > };
    > >
    > > +struct kvm_tdx_init_vm {
    > > + __u32 max_vcpus;
    > > + __u32 tsc_khz;
    > > + __u64 attributes;
    > > + __u64 cpuid;
    >
    > Is it better to append all CPUIDs directly into this structure, perhaps at end
    > of this structure, to make it more consistent with TD_PARAMS?
    >
    > Also, I think somewhere in commit message or comments we should explain why
    > CPUIDs are passed here (why existing KVM_SET_CUPID2 is not sufficient).

    Ok, let's change the data structure to match more with TD_PARAMS.


    > > diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
    > > index 20b45bb0b032..236faaca68a0 100644
    > > --- a/arch/x86/kvm/vmx/tdx.c
    > > +++ b/arch/x86/kvm/vmx/tdx.c
    > > @@ -387,6 +387,203 @@ static int tdx_capabilities(struct kvm *kvm, struct kvm_tdx_cmd *cmd)
    > > return 0;
    > > }
    > >
    > > +static struct kvm_cpuid_entry2 *tdx_find_cpuid_entry(struct kvm_tdx *kvm_tdx,
    > > + u32 function, u32 index)
    > > +{
    > > + struct kvm_cpuid_entry2 *e;
    > > + int i;
    > > +
    > > + for (i = 0; i < kvm_tdx->cpuid_nent; i++) {
    > > + e = &kvm_tdx->cpuid_entries[i];
    > > +
    > > + if (e->function == function && (e->index == index ||
    > > + !(e->flags & KVM_CPUID_FLAG_SIGNIFCANT_INDEX)))
    > > + return e;
    > > + }
    > > + return NULL;
    > > +}
    > > +
    > > +static int setup_tdparams(struct kvm *kvm, struct td_params *td_params,
    > > + struct kvm_tdx_init_vm *init_vm)
    > > +{
    > > + struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
    > > + struct tdx_cpuid_config *config;
    > > + struct kvm_cpuid_entry2 *entry;
    > > + struct tdx_cpuid_value *value;
    > > + u64 guest_supported_xcr0;
    > > + u64 guest_supported_xss;
    > > + u32 guest_tsc_khz;
    > > + int max_pa;
    > > + int i;
    > > +
    > > + /* init_vm->reserved must be zero */
    > > + if (find_first_bit((unsigned long *)init_vm->reserved,
    > > + sizeof(init_vm->reserved) * 8) !=
    > > + sizeof(init_vm->reserved) * 8)
    > > + return -EINVAL;
    > > +
    > > + td_params->max_vcpus = init_vm->max_vcpus;
    > > +
    > > + td_params->attributes = init_vm->attributes;
    > > + if (td_params->attributes & TDX_TD_ATTRIBUTE_PERFMON) {
    > > + pr_warn("TD doesn't support perfmon. KVM needs to save/restore "
    > > + "host perf registers properly.\n");
    > > + return -EOPNOTSUPP;
    > > + }
    >
    > PERFMON can be supported but it's not support in this series, so perhaps add a
    > comment to explain it's a TODO?

    Yes, good idea. Will do.


    > > + max_pa = 36;
    > > + entry = tdx_find_cpuid_entry(kvm_tdx, 0x80000008, 0);
    > > + if (entry)
    > > + max_pa = entry->eax & 0xff;
    > > +
    > > + td_params->eptp_controls = VMX_EPTP_MT_WB;
    > > + if (cpu_has_vmx_ept_5levels() && max_pa > 48) {
    > > + td_params->eptp_controls |= VMX_EPTP_PWL_5;
    > > + td_params->exec_controls |= TDX_EXEC_CONTROL_MAX_GPAW;
    > > + } else {
    > > + td_params->eptp_controls |= VMX_EPTP_PWL_4;
    > > + }
    >
    > Not quite sure, but could we support >48 GPA with 4-level EPT?

    No.
    "5-level paging and 5-level EPT"
    section 4.1 4-level EPT
    "4-level EPT is limited to translating 48-bit guest-physical addresses."
    --
    Isaku Yamahata <isaku.yamahata@gmail.com>

    \
     
     \ /
      Last update: 2022-04-08 04:24    [W:3.058 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site