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 126/130] KVM: TDX: Inhibit APICv for TDX guest
    Date
    From: Isaku Yamahata <isaku.yamahata@intel.com>

    TDX doesn't support APICV, inhibit APICv for TDX guest. Follow how SEV
    does it. Define a new inhibit reason for TDX, set it on TD
    initialization, and add the flag to kvm_x86_ops.required_apicv_inhibits.

    Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    ---
    arch/x86/include/asm/kvm_host.h | 9 +++++++++
    arch/x86/kvm/vmx/main.c | 3 ++-
    arch/x86/kvm/vmx/tdx.c | 4 ++++
    3 files changed, 15 insertions(+), 1 deletion(-)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index 2686c080820b..920fb771246b 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -1300,6 +1300,15 @@ enum kvm_apicv_inhibit {
    * mapping between logical ID and vCPU.
    */
    APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED,
    +
    + /*********************************************************/
    + /* INHIBITs that are relevant only to the Intel's APICv. */
    + /*********************************************************/
    +
    + /*
    + * APICv is disabled because TDX doesn't support it.
    + */
    + APICV_INHIBIT_REASON_TDX,
    };

    struct kvm_arch {
    diff --git a/arch/x86/kvm/vmx/main.c b/arch/x86/kvm/vmx/main.c
    index c46c860be0f2..2cd404fd7176 100644
    --- a/arch/x86/kvm/vmx/main.c
    +++ b/arch/x86/kvm/vmx/main.c
    @@ -1022,7 +1022,8 @@ static void vt_post_memory_mapping(struct kvm_vcpu *vcpu,
    BIT(APICV_INHIBIT_REASON_BLOCKIRQ) | \
    BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | \
    BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | \
    - BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED))
    + BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED) | \
    + BIT(APICV_INHIBIT_REASON_TDX))

    struct kvm_x86_ops vt_x86_ops __initdata = {
    .name = KBUILD_MODNAME,
    diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
    index f706c346eea4..7be1be161dc2 100644
    --- a/arch/x86/kvm/vmx/tdx.c
    +++ b/arch/x86/kvm/vmx/tdx.c
    @@ -2488,6 +2488,8 @@ static int __tdx_td_init(struct kvm *kvm, struct td_params *td_params,
    goto teardown;
    }

    + kvm_set_apicv_inhibit(kvm, APICV_INHIBIT_REASON_TDX);
    +
    return 0;

    /*
    @@ -2821,6 +2823,8 @@ static int tdx_td_vcpu_init(struct kvm_vcpu *vcpu, u64 vcpu_rcx)
    return -EIO;
    }

    + WARN_ON_ONCE(kvm_apicv_activated(vcpu->kvm));
    + vcpu->arch.apic->apicv_active = false;
    vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
    tdx->td_vcpu_created = true;
    return 0;
    --
    2.25.1

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