Received: by 2002:a6b:500f:0:0:0:0:0 with SMTP id e15csp2679539iob; Fri, 6 May 2022 08:10:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwZawND0TalNY91EMNwDI6ubG7wGBu/w68rS1Hps0EZLD/k0IqxvJtj1pDO/nxVYDjrVv13 X-Received: by 2002:a63:8ac1:0:b0:3ab:199:cbdf with SMTP id y184-20020a638ac1000000b003ab0199cbdfmr3083351pgd.466.1651849818270; Fri, 06 May 2022 08:10:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651849818; cv=none; d=google.com; s=arc-20160816; b=chUUnmbw0rCJIKfD+DvHZX2ejmckJf9tLU7LR2LgxHMxDFCA8g9ERpYpQkfteA/TtQ 47Tjb+XUMeHOSG4RdXH83TpT0JxSoEPjuH9GrIGMOMQGTiUTzfLIqkhQ3xx/rcauZht+ ilBVd6DG2eYmRceNKQL3OBfVHWb5LXVAY503lukSQv7e8QehHve+BXK86Eebpc7fvSqF OnmOUV8CpZ68b5BP+SLF1xrQOAnwbqnbLmS4lm7AROzcCLt+isJ6gn76NsI6nr+HgMX5 0ICbNnYUimHdQZcCIsJSskg56KoYiibbxop9NlMgJ8bZLfUIovt9pwotFh8FQFM7MLjZ ObUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=jPmIBoavxLfy6eFKlv5aZE0byWviXF01WUw8DQX0FMY=; b=BLENF8H5TQu4jjL5V8H4iYm7D/3knKewAZISRfIZbiFtaU09aT1xW1qznNvqI5QQTc oqWRhHeOcIXn0ZYfzthzsDperXkJd9C8ddAwWk8Qo8MGEF4Xu7kxkT1pdSHm9KpP/Crr k68ckp60RBPbojAXIr+ID9322KHa/goyx5bjZGBBmFEXwD39TeLzQKaBL7L5kVJYHN8U apULdCQexe00qkIMFTgNpFcIbn0rUuWwLwhkdBqkQ7yOOYuNj3SITH9aQWBx3MeIy7LL EY98YOfiSCaro50XC3g4rkGobqBHhrn5IAX880Y7AvQDJWUsIy9ANcJBkrHMr2OjVhqM 1TVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=TCbpo90I; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d16-20020a17090ab31000b001d934982969si10848797pjr.55.2022.05.06.08.10.00; Fri, 06 May 2022 08:10:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=TCbpo90I; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383216AbiEES1S (ORCPT + 99 others); Thu, 5 May 2022 14:27:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36886 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1383210AbiEESTl (ORCPT ); Thu, 5 May 2022 14:19:41 -0400 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 37C733BBCE; Thu, 5 May 2022 11:15:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651774553; x=1683310553; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=so7kiXtRlPEg3DgTCrMIl6OMFEHOZkZ06JH3qx9GgwY=; b=TCbpo90I49uMTBdBUJbp5yj2oj8mTKgG97xPh01XHNSINAfXOeTGbMZk zEP0YWYOvOpqjMBwInHRBVuq/oq7/JQZOp4EACBeP+XAUVmR4OOP1yj3e Po1r+Ja+Y02QEKfYoqQorxzqRaML/kMzqjaVKoJWYQJbPnaHoEab/hiAR r7IjSFc2rDmeIlt7GKNTpo+upz9mXk1XiCCLd3ja5zVsODsIVzCp4YSod f7teV55TVqFh2QaZhfaLMhKwYoPurSZau02Xh1iJpQ78xcHrDBjBU8M9d jAMQAvg9i9EW8Gqjy0UG3UCJI2jMf7IFXhyAk1Pxp4Y9FYv1jDfoqG/TS Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10338"; a="248113903" X-IronPort-AV: E=Sophos;i="5.91,202,1647327600"; d="scan'208";a="248113903" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 May 2022 11:15:51 -0700 X-IronPort-AV: E=Sophos;i="5.91,202,1647327600"; d="scan'208";a="665083405" Received: from ls.sc.intel.com (HELO localhost) ([143.183.96.54]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 May 2022 11:15:51 -0700 From: isaku.yamahata@intel.com To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: isaku.yamahata@intel.com, isaku.yamahata@gmail.com, Paolo Bonzini , erdemaktas@google.com, Sean Christopherson , Sagi Shahar Subject: [RFC PATCH v6 074/104] KVM: x86: Add a switch_db_regs flag to handle TDX's auto-switched behavior Date: Thu, 5 May 2022 11:15:08 -0700 Message-Id: <628f68b444170562b7dd344c932f7cd2143165b1.1651774250.git.isaku.yamahata@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_PASS,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Isaku Yamahata Add a flag, KVM_DEBUGREG_AUTO_SWITCHED_GUEST, to skip saving/restoring DRs irrespective of any other flags. TDX-SEAM unconditionally saves and restores guest DRs and reset to architectural INIT state on TD exit. So, KVM needs to save host DRs before TD enter without restoring guest DRs and restore host DRs after TD exit. Opportunistically convert the KVM_DEBUGREG_* definitions to use BIT(). Reported-by: Xiaoyao Li Signed-off-by: Sean Christopherson Co-developed-by: Chao Gao Signed-off-by: Chao Gao Signed-off-by: Isaku Yamahata --- arch/x86/include/asm/kvm_host.h | 9 +++++++-- arch/x86/kvm/vmx/tdx.c | 1 + arch/x86/kvm/x86.c | 11 ++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 4513b619f614..5d2855e8de81 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -537,8 +537,13 @@ struct kvm_pmu { struct kvm_pmu_ops; enum { - KVM_DEBUGREG_BP_ENABLED = 1, - KVM_DEBUGREG_WONT_EXIT = 2, + KVM_DEBUGREG_BP_ENABLED = BIT(0), + KVM_DEBUGREG_WONT_EXIT = BIT(1), + /* + * Guest debug registers are saved/restored by hardware on exit from + * or enter guest. KVM needn't switch them. + */ + KVM_DEBUGREG_AUTO_SWITCH = BIT(2), }; struct kvm_mtrr_range { diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index 6233c65b2a48..41edf3e414ec 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -543,6 +543,7 @@ int tdx_vcpu_create(struct kvm_vcpu *vcpu) vcpu->arch.efer = EFER_SCE | EFER_LME | EFER_LMA | EFER_NX; + vcpu->arch.switch_db_regs = KVM_DEBUGREG_AUTO_SWITCH; vcpu->arch.cr0_guest_owned_bits = -1ul; vcpu->arch.cr4_guest_owned_bits = -1ul; diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index bdba187fb087..2691abb46fac 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10265,7 +10265,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) if (vcpu->arch.guest_fpu.xfd_err) wrmsrl(MSR_IA32_XFD_ERR, vcpu->arch.guest_fpu.xfd_err); - if (unlikely(vcpu->arch.switch_db_regs)) { + if (unlikely(vcpu->arch.switch_db_regs & ~KVM_DEBUGREG_AUTO_SWITCH)) { set_debugreg(0, 7); set_debugreg(vcpu->arch.eff_db[0], 0); set_debugreg(vcpu->arch.eff_db[1], 1); @@ -10307,6 +10307,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) */ if (unlikely(vcpu->arch.switch_db_regs & KVM_DEBUGREG_WONT_EXIT)) { WARN_ON(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP); + WARN_ON(vcpu->arch.switch_db_regs & KVM_DEBUGREG_AUTO_SWITCH); static_call(kvm_x86_sync_dirty_debug_regs)(vcpu); kvm_update_dr0123(vcpu); kvm_update_dr7(vcpu); @@ -10319,8 +10320,12 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) * care about the messed up debug address registers. But if * we have some of them active, restore the old state. */ - if (hw_breakpoint_active()) - hw_breakpoint_restore(); + if (hw_breakpoint_active()) { + if (!(vcpu->arch.switch_db_regs & KVM_DEBUGREG_AUTO_SWITCH)) + hw_breakpoint_restore(); + else + set_debugreg(__this_cpu_read(cpu_dr7), 7); + } vcpu->arch.last_vmentry_cpu = vcpu->cpu; vcpu->arch.last_guest_tsc = kvm_read_l1_tsc(vcpu, rdtsc()); -- 2.25.1