Received: by 2002:a05:6358:e9c4:b0:b2:91dc:71ab with SMTP id hc4csp4105407rwb; Sun, 7 Aug 2022 15:09:55 -0700 (PDT) X-Google-Smtp-Source: AA6agR6n9ZEinzmSHyn3fsmfaQnoiKgcV3ld/h51BiZOneoaHM/W/XGFYyPPbwb0mv35cZhNA7eV X-Received: by 2002:a17:907:1dc5:b0:730:aade:95fb with SMTP id og5-20020a1709071dc500b00730aade95fbmr11849185ejc.520.1659910195628; Sun, 07 Aug 2022 15:09:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659910195; cv=none; d=google.com; s=arc-20160816; b=WC0VHMrhFRyk9UBFDJHzdb4s0KA+MYOEw9V2OMuSKTdxuVvXfZEiQxYFxKPRmSlkBU 01WvXlXGtooxz3bEugyqNBY5ltvQZzuLNQgDV9fIr+no/7IwOF8BlFlhb/sp5SY+i4TO b4mmThFSelMMJ4422ARJKT06tmDSpm348E3fE8vRmX13is2rZ0RDlCmdCAVL4WUUZPz/ lmnBrUeBPcfmqHQnGM8wHgtq6gTzhEwtD2UZnlRU/0sUWnt9KGNKDSB94nOfR+ZWWkyf Xyw19FNkoVzjbmEgmWxwVQ6WTjofFsye57z4znqMHP7faT8ZifZ9r7zTvVHBsICdYv0s WGNw== 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=t4DdR9w8OnMdR8UXcTb4AMnVeN/EXJCOSNM86grAVSQ=; b=oDw0pXF+rmiosrRV300u4Hxzox5t8uW8CN+k+fOzk68EC0fPnLoNLpPLgTJgvqSg9y YuyFrSAH5fzU3EXvl6lh5ZFRNb1PktipDN8YOxaZBvyYwFNklYpcO/w4MbwagJI8/L8f 7MB4DxuleBTWUEf0+752udrbiW6oyYXEmsEJA8UcbXwLbSHaW2bhAVI9SiwhQseB9yzI yXUNzKIOIgwbzirBnsS+FjNDdbSNUBgidx/oLspNHkYLbSQaLFusXdW423tfF++LrbbZ DGGv9SzWMy8OjKS6awu8yva3ZcJTHNmLA7eZ9MT/nCtCcsIvclmdp3kP69vflxN2Ts+i 0PuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=c85WX6LJ; 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 dz17-20020a0564021d5100b0043585bc1c54si5775982edb.567.2022.08.07.15.09.30; Sun, 07 Aug 2022 15:09:55 -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=c85WX6LJ; 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 S241735AbiHGWGu (ORCPT + 99 others); Sun, 7 Aug 2022 18:06:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48266 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234368AbiHGWDI (ORCPT ); Sun, 7 Aug 2022 18:03:08 -0400 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 16F9A9FF2; Sun, 7 Aug 2022 15:02:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1659909763; x=1691445763; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=hInWa0hvzVtq8ZH0DigJE2CfzqDdW61tq1L8sB9nfsE=; b=c85WX6LJ36NW6en7yBAFGIMEmkr4sSwZ3USl7YW2o0O4NtBy0murzpeP MFXq57X8dRXwXqt4zRRhOMwuD+BQ04I0uDpTAlCTqEbsb/d3OJAHp6Rgo XD8+AmT+bdwj2vv0rbtC7nukBonlLYsWdJjzBsj1gmnR49uEwdib7S8ya t4dSlWkJaSXpOzADGLmyL8plg/LsCsoXMva2cq8dpGbT4hyH9GSrNVVh3 TCRdXPRBzL6WYGUSOvwW6Vj8XkiD5bzzCUWSgz9fLesFvWb6TeTv98ezm w+Of8ozPtlsgs37JonbHr4HfU4SWUqacsakjVNACsB06Jt4DfFrfLe7uD Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10432"; a="270240363" X-IronPort-AV: E=Sophos;i="5.93,220,1654585200"; d="scan'208";a="270240363" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Aug 2022 15:02:40 -0700 X-IronPort-AV: E=Sophos;i="5.93,220,1654585200"; d="scan'208";a="663682686" Received: from ls.sc.intel.com (HELO localhost) ([143.183.96.54]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Aug 2022 15:02:40 -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: [PATCH v8 073/103] KVM: x86: Add a switch_db_regs flag to handle TDX's auto-switched behavior Date: Sun, 7 Aug 2022 15:01:58 -0700 Message-Id: <97dd69e850fd10b67333436e79e2ef05fc6da69b.1659854790.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 f32613dd7491..75218f7d15ac 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -582,8 +582,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 7849260a252d..12fe6d0eab36 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -532,6 +532,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 b1438fb6dd96..bc3b657e9795 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10509,7 +10509,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); @@ -10552,6 +10552,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); @@ -10564,8 +10565,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