Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp2614880rdg; Mon, 16 Oct 2023 09:26:25 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFiYvJl7mHtmc+eDp6lWEr2lKqYsW0QQdCHGCvwSBLZEN+EdqVo5oNb2w+/6RUKFQAgsSWj X-Received: by 2002:a05:6870:c1cc:b0:1e9:a434:58a5 with SMTP id i12-20020a056870c1cc00b001e9a43458a5mr17640243oad.46.1697473585205; Mon, 16 Oct 2023 09:26:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697473585; cv=none; d=google.com; s=arc-20160816; b=dZNTJ7xji0776krK1Ktmixv7V2Xb7lD7UcApga42ZYVRtOBeJH9Hpfb9McZZBjgsRi XaB5vWA6W+YiCSFC0GUxQZnnn3UvL2XZgHVz5UY0X2q2BlHUpmO+rXVHClXS09ATTlIO c6ftVE/4lAMD7sUQmXSQo8SeaHFphnJIF5Xv88BsHqkIqjYKoim8By7lYDaC1+aZd7uw rdSBqhU1E2WNqkMO9rbU5V/7xy5SI7+Je/Ww1RneL7ZaJVg9kSGUIJbrYaep+Ib76xwa V8hMuQWTncbBJr38pQTv9rH2GnzFVQdwsjp4QD+KpsIsgdMOwJdODWbHrLoFQpSj7vg5 a66Q== 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=CQfEf0hPbg/Jz7Nk5n6Ujjte4aOZxaSyki/KZXgqMBk=; fh=vqsj/qvR8HKT9KGX/dJS+jxMkl1rK7MB6pQkLgt8bks=; b=Il2XF46yjPSYRZ3JWLMi07sMu97JjgtrzXpDjZ5f5+jedR+1YIlM2eoUxrutQ/fDHL ouEe5ARVoQHvQSM0bwc9YNoyAKzguPty7BDdECn6mqo+P0H+Ahj2pCAc0PityNf5fFRb PyuPcfaGNUo/o2jRvaThSP+vmXh6iXw7zkfO06Y5pJ3pWX6f/JJLVkaTkXLfUGSaKW1o vkkl1aFYZwv5uYGoyaCe7YukHffknu75ZOe/VigzdnianHhrJ/RCv7YhjcFb+rJ3E2Ag Wyf21MAgNHH0YtjKtp+7IcyQ5MNfr0yz1D01Yat9oFX4LpEA/O/QvRYBFekDqBfwLPqy +EXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=DCZ1xWfd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 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 snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id by22-20020a056a02059600b005af868c0041si7298241pgb.320.2023.10.16.09.26.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Oct 2023 09:26:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=DCZ1xWfd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 379AA802C8D2; Mon, 16 Oct 2023 09:26:24 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234150AbjJPQ0Q (ORCPT + 99 others); Mon, 16 Oct 2023 12:26:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32990 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234006AbjJPQ0F (ORCPT ); Mon, 16 Oct 2023 12:26:05 -0400 Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35D9C1739; Mon, 16 Oct 2023 09:18:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1697473112; x=1729009112; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=pd121RgsBdLoQfdGTj0dZhZwVCN1L3A5EMNaY3NSTL0=; b=DCZ1xWfddZbs/ujm+2oJr93Xbl95ZMAzfMyB+mPBFcCODbKjpjNg6rFN FnlXQknoAS0dx0gFcVnXaV2IDuMTqK/mtdUZji5dY4Abn0F+eIdclMzKx s+MMrR4lnAOgXSWyH7ztR+T100jEiKd3dWrwpLyuTckwzwh5zbnrne9oH s7+7ElcSaXz/B0sNBDY62DXriXlZgh5in6fTIsKHM6MwPbfwtD7IYH3te 1huEOhpFvGb0XO311lRbsN0feRUBsC4dqoo9FqwKcGbaNom2/wSLBz/AL XUAjkpwHcKGpugpFji15/HW8FGYD6hbh6HkmR3kwfInIYlTmC0WqL0LeK w==; X-IronPort-AV: E=McAfee;i="6600,9927,10865"; a="364921917" X-IronPort-AV: E=Sophos;i="6.03,229,1694761200"; d="scan'208";a="364921917" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Oct 2023 09:15:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10865"; a="846448223" X-IronPort-AV: E=Sophos;i="6.03,229,1694761200"; d="scan'208";a="846448223" Received: from ls.sc.intel.com (HELO localhost) ([172.25.112.31]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Oct 2023 09:15:54 -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 , David Matlack , Kai Huang , Zhi Wang , chen.bo@intel.com, hang.yuan@intel.com, tina.zhang@intel.com, Xiaoyao Li , Sean Christopherson , Chao Gao Subject: [PATCH v16 072/116] KVM: x86: Add a switch_db_regs flag to handle TDX's auto-switched behavior Date: Mon, 16 Oct 2023 09:14:24 -0700 Message-Id: <5646ce8ce4dc732edd44aa2ee389c73d5b296350.1697471314.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=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_NONE 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 X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Mon, 16 Oct 2023 09:26:24 -0700 (PDT) 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 | 10 ++++++++-- arch/x86/kvm/vmx/tdx.c | 1 + arch/x86/kvm/x86.c | 11 ++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 777981e97f1a..b19e8eac4c80 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -604,8 +604,14 @@ 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 (DR0-3 and DR6) are saved/restored by hardware + * on exit from or enter to guest. KVM needn't switch them. Because DR7 + * is cleared on exit from guest, DR7 need to be saved/restored. + */ + 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 511ba2496372..b936c98f601c 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -560,6 +560,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 916c462f7d8b..a75b0b9ce9bf 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10792,7 +10792,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); @@ -10838,6 +10838,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); @@ -10850,8 +10851,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