From patchwork Sun Oct 30 06:23:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Isaku Yamahata X-Patchwork-Id: 12904 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp1666813wru; Sat, 29 Oct 2022 23:31:29 -0700 (PDT) X-Google-Smtp-Source: AMsMyM63bMMnbhpynx9RFzRuhyqVPj2KsGHezpbr5UnYFbErpeepWd2+d3c79Lop3IcCIaXw5ExS X-Received: by 2002:a05:6a00:2402:b0:52c:81cf:8df8 with SMTP id z2-20020a056a00240200b0052c81cf8df8mr8156671pfh.60.1667111489300; Sat, 29 Oct 2022 23:31:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667111489; cv=none; d=google.com; s=arc-20160816; b=PAhNi0WtVUvsqwBjDHU3y+K8wX2+OYeRBs8h72egccLF5TJkKAgpsMPlv9xO2Uz3XD a7RRKY7pwyoRl/VoB9adgzlZKJkuNIiX5OQB4KxJmRx0Jd5RRuWtVg9E6ifY6Kc3GfM7 /89goaMCvoWkvIPcQTYZALsljTwG9KRYNi5WpwXopWK3e9ta+K/HqdeF3KKhtTmqyqgj K1IV2qEa5g6+zvBhChMw2mb50F8hDa3mJ1Y8GkxKpNfRQKQEmAnrkBBFJ33rjubNzCrB EyY5IDXI/412AFZjH9VeU27QK+9mRbKap03yPr9eNfnD7tnLKxrM+YGevbsEAFakiMkF We1Q== 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=MGr8Z5qE2R2hjla4RAVL0AKWGvZ6Ww9DrLOX4jxCi0g=; b=T0rYwdVePeZB4hCEJnPDiS3d6G+H/hJH2N2TEHxCWuZFCJgsAVIr+VSSy6deAVllQ0 CN6uP3NPLDCGM5M8cMPg1LrACZYAGKRLJ9Shk/U5QqXZEki4I+d0M+dnVgFrRMKg+3pi LXzOcopFLtYnhRTE3Dbh7HqjGDH+2SxCilA1uZYudpd9neax9McAILufNuFYv3a0NYdu qAzDXulfZQLmUyL3yTqkG5eox0bKMrjcKjJh+FGxVzDFm07x1/LsZTs6kGsgARJEaqON R85JBrykcpeGB9+xqFjDGlmBA3Xfc2w8wmBCIEx/PIUc4Pf9Lp6EOcZKkDtpgYoH4P9j xDCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=WsFB0jnK; 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: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 32-20020a630c60000000b0044034f2c3b8si4100885pgm.310.2022.10.29.23.31.16; Sat, 29 Oct 2022 23:31:29 -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=WsFB0jnK; 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 S231340AbiJ3Gag (ORCPT + 99 others); Sun, 30 Oct 2022 02:30:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47796 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230425AbiJ3G2u (ORCPT ); Sun, 30 Oct 2022 02:28:50 -0400 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 51A262E6; Sat, 29 Oct 2022 23:24:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1667111080; x=1698647080; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=NgDNxL+/7jvkhB9H0lGuHNLykdpBprAtOPXa9QdOf+k=; b=WsFB0jnKu9TVcT8RXQyD9wns76q1T4NMN43jjc/G5zZE+884P7f/Ko2L DzbbiKWljtPTWMoutSb/XHZveqp5KaQS7XrhZspZ+KnSXV2DyMpJVluuo cR8doQrB+JIFoN2paK8ycW6Vg/QMJd33FKuB/iD/awadW58Ta1VtpMu/f 8c9arQjf8T8sP+UKiHM/nXdg7wA/LVDuT4zrvI0e5wWLdmGFioda/8kkC 0nVdJVema4mo37AJFHtr6wXvKXV9C34G5off7JJzdq1LyYKPR66ZqSTJz VKuMHAjTNpgrxkwRrwGJOs87lfMIgRbUTc5my83rCTf9k+QGi+Xxb+oDI g==; X-IronPort-AV: E=McAfee;i="6500,9779,10515"; a="395037190" X-IronPort-AV: E=Sophos;i="5.95,225,1661842800"; d="scan'208";a="395037190" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Oct 2022 23:24:10 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10515"; a="878393092" X-IronPort-AV: E=Sophos;i="5.95,225,1661842800"; d="scan'208";a="878393092" Received: from ls.sc.intel.com (HELO localhost) ([143.183.96.54]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Oct 2022 23:24:10 -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 , Xiaoyao Li , Sean Christopherson , Chao Gao Subject: [PATCH v10 077/108] KVM: x86: Add a switch_db_regs flag to handle TDX's auto-switched behavior Date: Sat, 29 Oct 2022 23:23:18 -0700 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-4.9 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_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-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1748093096852451939?= X-GMAIL-MSGID: =?utf-8?q?1748093096852451939?= 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 fdb00d96e954..082e94f78c66 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -583,8 +583,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 fc4de83a2df8..57767ef3353b 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -429,6 +429,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 4d4b71c4cdb1..ad7b227b68dd 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10779,7 +10779,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); @@ -10822,6 +10822,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); @@ -10834,8 +10835,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());