lkml.org 
[lkml]   [2022]   [Sep]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v8 050/103] KVM: TDX: Add load_mmu_pgd method for TDX
    On Sun, Aug 07, 2022 at 03:01:35PM -0700, isaku.yamahata@intel.com wrote:
    > From: Sean Christopherson <sean.j.christopherson@intel.com>
    >
    > For virtual IO, the guest TD shares guest pages with VMM without
    > encryption. Shared EPT is used to map guest pages in unprotected way.
    >
    > Add the VMCS field encoding for the shared EPTP, which will be used by
    > TDX to have separate EPT walks for private GPAs (existing EPTP) versus
    > shared GPAs (new shared EPTP).
    >
    > Set shared EPT pointer value for the TDX guest to initialize TDX MMU.
    >
    > Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
    > Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

    Reviewed-by: Yuan Yao <yuan.yao@intel.com>

    > ---
    > arch/x86/include/asm/vmx.h | 1 +
    > arch/x86/kvm/vmx/main.c | 11 ++++++++++-
    > arch/x86/kvm/vmx/tdx.c | 5 +++++
    > arch/x86/kvm/vmx/x86_ops.h | 4 ++++
    > 4 files changed, 20 insertions(+), 1 deletion(-)
    >
    > diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h
    > index f0f8eecf55ac..e169ace97e83 100644
    > --- a/arch/x86/include/asm/vmx.h
    > +++ b/arch/x86/include/asm/vmx.h
    > @@ -234,6 +234,7 @@ enum vmcs_field {
    > TSC_MULTIPLIER_HIGH = 0x00002033,
    > TERTIARY_VM_EXEC_CONTROL = 0x00002034,
    > TERTIARY_VM_EXEC_CONTROL_HIGH = 0x00002035,
    > + SHARED_EPT_POINTER = 0x0000203C,
    > PID_POINTER_TABLE = 0x00002042,
    > PID_POINTER_TABLE_HIGH = 0x00002043,
    > GUEST_PHYSICAL_ADDRESS = 0x00002400,
    > diff --git a/arch/x86/kvm/vmx/main.c b/arch/x86/kvm/vmx/main.c
    > index 9f4c3a0bcc12..252b7298b230 100644
    > --- a/arch/x86/kvm/vmx/main.c
    > +++ b/arch/x86/kvm/vmx/main.c
    > @@ -110,6 +110,15 @@ static void vt_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
    > return vmx_vcpu_reset(vcpu, init_event);
    > }
    >
    > +static void vt_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa,
    > + int pgd_level)
    > +{
    > + if (is_td_vcpu(vcpu))
    > + return tdx_load_mmu_pgd(vcpu, root_hpa, pgd_level);
    > +
    > + vmx_load_mmu_pgd(vcpu, root_hpa, pgd_level);
    > +}
    > +
    > static int vt_mem_enc_ioctl(struct kvm *kvm, void __user *argp)
    > {
    > if (!is_td(kvm))
    > @@ -228,7 +237,7 @@ struct kvm_x86_ops vt_x86_ops __initdata = {
    > .write_tsc_offset = vmx_write_tsc_offset,
    > .write_tsc_multiplier = vmx_write_tsc_multiplier,
    >
    > - .load_mmu_pgd = vmx_load_mmu_pgd,
    > + .load_mmu_pgd = vt_load_mmu_pgd,
    >
    > .check_intercept = vmx_check_intercept,
    > .handle_exit_irqoff = vmx_handle_exit_irqoff,
    > diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
    > index 36d2127cb7b7..7a631ae78e59 100644
    > --- a/arch/x86/kvm/vmx/tdx.c
    > +++ b/arch/x86/kvm/vmx/tdx.c
    > @@ -518,6 +518,11 @@ void tdx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
    > vcpu->kvm->vm_bugged = true;
    > }
    >
    > +void tdx_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa, int pgd_level)
    > +{
    > + td_vmcs_write64(to_tdx(vcpu), SHARED_EPT_POINTER, root_hpa & PAGE_MASK);
    > +}
    > +
    > int tdx_dev_ioctl(void __user *argp)
    > {
    > struct kvm_tdx_capabilities __user *user_caps;
    > diff --git a/arch/x86/kvm/vmx/x86_ops.h b/arch/x86/kvm/vmx/x86_ops.h
    > index 62f1d1cdd44b..185481ee5f2f 100644
    > --- a/arch/x86/kvm/vmx/x86_ops.h
    > +++ b/arch/x86/kvm/vmx/x86_ops.h
    > @@ -145,6 +145,8 @@ void tdx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event);
    >
    > int tdx_vm_ioctl(struct kvm *kvm, void __user *argp);
    > int tdx_vcpu_ioctl(struct kvm_vcpu *vcpu, void __user *argp);
    > +
    > +void tdx_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa, int root_level);
    > #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; }
    > @@ -162,6 +164,8 @@ static inline void tdx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) {}
    >
    > static inline int tdx_vm_ioctl(struct kvm *kvm, void __user *argp) { return -EOPNOTSUPP; }
    > static inline int tdx_vcpu_ioctl(struct kvm_vcpu *vcpu, void __user *argp) { return -EOPNOTSUPP; }
    > +
    > +static inline void tdx_load_mmu_pgd(struct kvm_vcpu *vcpu, hpa_t root_hpa, int root_level) {}
    > #endif
    >
    > #endif /* __KVM_X86_VMX_X86_OPS_H */
    > --
    > 2.25.1
    >

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