From nobody Fri Oct 10 09:53:04 2025 Received: from mail.zytor.com (terminus.zytor.com [198.137.202.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 775783C2F; Tue, 17 Jun 2025 07:33:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.137.202.136 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750145629; cv=none; b=sd0CLevUo3GOs3NB8xxtOuTPgEqZ+dHbuVpqzfY6jQJiZxe4TXnI8K5SW6fDWbzBo5eCOxKaIsa2QoXxGSsO3aFcoBxjAGQFRHsepkRMZWtTbrZsY14BlgYWAfxVmoR6aaEuHu/KJUna89QdXlTPt4ioy9fyEzmtJQ65GD8Uc2o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750145629; c=relaxed/simple; bh=r2hXSsjEbQxu0mOvM191VLjPAl5LgTFDXv+l4XfTIJc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QvCiJMGbiO4MyX6lln30vvRS4oC8Lmhj9Ao3oMz4xFoRfXI2xSaX0Wfq1+ru4PDzLK187WRA6qH9moBMeVHlebz7rnyx8t+JI5uoLzPtLSSbmunsrTwnTl5hJWYURCQjRzx7VGz0B7nPhF3YoFsHVcKKxbKn9qqk61MHamL/NqE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zytor.com; spf=pass smtp.mailfrom=zytor.com; dkim=pass (2048-bit key) header.d=zytor.com header.i=@zytor.com header.b=iCMGcPJW; arc=none smtp.client-ip=198.137.202.136 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zytor.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zytor.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=zytor.com header.i=@zytor.com header.b="iCMGcPJW" Received: from terminus.zytor.com (terminus.zytor.com [IPv6:2607:7c80:54:3:0:0:0:136]) (authenticated bits=0) by mail.zytor.com (8.18.1/8.17.1) with ESMTPSA id 55H7WY8x1020658 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Tue, 17 Jun 2025 00:32:38 -0700 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.zytor.com 55H7WY8x1020658 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zytor.com; s=2025052101; t=1750145559; bh=M0DKhA38fEw6Bm/3Z+zol8C78ucdC08/MmuvHH4gP5o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iCMGcPJWNrjKttAGX2SFY0d7+3klYcr5d/LKLeAAoPd4ZvIOMSke8zdJqd/BHnl46 x5rbdYIXpQaC4fdTQFDUFqLoHU0wnvzLixKayRGJOoxHCCEfzXzwgnFADxIBPeTcIy p0mMfJCtFhWOPVHXYdMAlBhxvuRHlYOIY0J1hjO0+0t4qTY0IgAsgstjRGSlgzXAhe r1jzoCnAIxycfQqb06iqNFhz8jbzyPUuL5NdtU95ur+v3E24eu4kOO+jgTxZ8OemdZ /Peu/ItwJWejYVDcFp8kbRFXJtdlPhpLlsa4C+9vVTkUcuBoDKeXdCKlq6jRiHAK+5 q/MrFIg8uUb9w== From: "Xin Li (Intel)" To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, peterz@infradead.org, sohil.mehta@intel.com, brgerst@gmail.com, tony.luck@intel.com, fenghuay@nvidia.com Subject: [PATCH v2 1/2] x86/traps: Initialize DR6 by writing its architectural reset value Date: Tue, 17 Jun 2025 00:32:33 -0700 Message-ID: <20250617073234.1020644-2-xin@zytor.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250617073234.1020644-1-xin@zytor.com> References: <20250617073234.1020644-1-xin@zytor.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Initialize DR6 by writing its architectural reset value to ensure compliance with the specification. This avoids incorrectly zeroing DR6 to clear DR6.BLD at boot time, which leads to a false bus lock detected warning. The Intel SDM says: 1) Certain debug exceptions may clear bits 0-3 of DR6. 2) BLD induced #DB clears DR6.BLD and any other debug exception doesn't modify DR6.BLD. 3) RTM induced #DB clears DR6.RTM and any other debug exception sets DR6.RTM. To avoid confusion in identifying debug exceptions, debug handlers should set DR6.BLD and DR6.RTM, and clear other DR6 bits before returning. The DR6 architectural reset value 0xFFFF0FF0, already defined as macro DR6_RESERVED, satisfies these requirements, so just use it to reinitialize DR6 whenever needed. Since clear_all_debug_regs() no longer zeros all debug registers, rename it to initialize_debug_regs() to better reflect its current behavior. Since debug_read_clear_dr6() no longer clears DR6, rename it to debug_read_reset_dr6() to better reflect its current behavior. Reported-by: Sohil Mehta Link: https://lore.kernel.org/lkml/06e68373-a92b-472e-8fd9-ba548119770c@int= el.com/ Fixes: ebb1064e7c2e9 ("x86/traps: Handle #DB for bus lock") Suggested-by: H. Peter Anvin (Intel) Reviewed-by: H. Peter Anvin (Intel) Signed-off-by: Xin Li (Intel) Cc: stable@vger.kernel.org Acked-by: Peter Zijlstra (Intel) Reviewed-by: Sohil Mehta Tested-by: Sohil Mehta --- Changes in v2: *) Use debug register index 6 rather than DR_STATUS (PeterZ and Sean). *) Move this patch the first of the patch set to ease backporting. --- arch/x86/include/uapi/asm/debugreg.h | 7 +++++- arch/x86/kernel/cpu/common.c | 17 ++++++-------- arch/x86/kernel/traps.c | 34 +++++++++++++++++----------- 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/arch/x86/include/uapi/asm/debugreg.h b/arch/x86/include/uapi/a= sm/debugreg.h index 0007ba077c0c..8f335b9fa892 100644 --- a/arch/x86/include/uapi/asm/debugreg.h +++ b/arch/x86/include/uapi/asm/debugreg.h @@ -15,7 +15,12 @@ which debugging register was responsible for the trap. The other bits are either reserved or not of interest to us. */ =20 -/* Define reserved bits in DR6 which are always set to 1 */ +/* + * Define reserved bits in DR6 which are set to 1 by default. + * + * This is also the DR6 architectural value following Power-up, Reset or I= NIT. + * Some of these reserved bits can be set to 0 by hardware or software. + */ #define DR6_RESERVED (0xFFFF0FF0) =20 #define DR_TRAP0 (0x1) /* db0 */ diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 8feb8fd2957a..3bd7c9ac7576 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -2243,20 +2243,17 @@ EXPORT_PER_CPU_SYMBOL(__stack_chk_guard); #endif #endif =20 -/* - * Clear all 6 debug registers: - */ -static void clear_all_debug_regs(void) +static void initialize_debug_regs(void) { int i; =20 - for (i =3D 0; i < 8; i++) { - /* Ignore db4, db5 */ - if ((i =3D=3D 4) || (i =3D=3D 5)) - continue; + /* Control register first */ + set_debugreg(0, 7); + set_debugreg(DR6_RESERVED, 6); =20 + /* Ignore db4, db5 */ + for (i =3D 0; i < 4; i++) set_debugreg(0, i); - } } =20 #ifdef CONFIG_KGDB @@ -2417,7 +2414,7 @@ void cpu_init(void) =20 load_mm_ldt(&init_mm); =20 - clear_all_debug_regs(); + initialize_debug_regs(); dbg_restore_debug_regs(); =20 doublefault_init_cpu_tss(); diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index c5c897a86418..36354b470590 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -1022,24 +1022,32 @@ static bool is_sysenter_singlestep(struct pt_regs *= regs) #endif } =20 -static __always_inline unsigned long debug_read_clear_dr6(void) +static __always_inline unsigned long debug_read_reset_dr6(void) { unsigned long dr6; =20 + get_debugreg(dr6, 6); + dr6 ^=3D DR6_RESERVED; /* Flip to positive polarity */ + /* * The Intel SDM says: * - * Certain debug exceptions may clear bits 0-3. The remaining - * contents of the DR6 register are never cleared by the - * processor. To avoid confusion in identifying debug - * exceptions, debug handlers should clear the register before - * returning to the interrupted task. + * Certain debug exceptions may clear bits 0-3 of DR6. + * + * BLD induced #DB clears DR6.BLD and any other debug + * exception doesn't modify DR6.BLD. * - * Keep it simple: clear DR6 immediately. + * RTM induced #DB clears DR6.RTM and any other debug + * exception sets DR6.RTM. + * + * To avoid confusion in identifying debug exceptions, + * debug handlers should set DR6.BLD and DR6.RTM, and + * clear other DR6 bits before returning. + * + * Keep it simple: write DR6 with its architectural reset + * value 0xFFFF0FF0, defined as DR6_RESERVED, immediately. */ - get_debugreg(dr6, 6); set_debugreg(DR6_RESERVED, 6); - dr6 ^=3D DR6_RESERVED; /* Flip to positive polarity */ =20 return dr6; } @@ -1239,13 +1247,13 @@ static noinstr void exc_debug_user(struct pt_regs *= regs, unsigned long dr6) /* IST stack entry */ DEFINE_IDTENTRY_DEBUG(exc_debug) { - exc_debug_kernel(regs, debug_read_clear_dr6()); + exc_debug_kernel(regs, debug_read_reset_dr6()); } =20 /* User entry, runs on regular task stack */ DEFINE_IDTENTRY_DEBUG_USER(exc_debug) { - exc_debug_user(regs, debug_read_clear_dr6()); + exc_debug_user(regs, debug_read_reset_dr6()); } =20 #ifdef CONFIG_X86_FRED @@ -1264,7 +1272,7 @@ DEFINE_FREDENTRY_DEBUG(exc_debug) { /* * FRED #DB stores DR6 on the stack in the format which - * debug_read_clear_dr6() returns for the IDT entry points. + * debug_read_reset_dr6() returns for the IDT entry points. */ unsigned long dr6 =3D fred_event_data(regs); =20 @@ -1279,7 +1287,7 @@ DEFINE_FREDENTRY_DEBUG(exc_debug) /* 32 bit does not have separate entry points. */ DEFINE_IDTENTRY_RAW(exc_debug) { - unsigned long dr6 =3D debug_read_clear_dr6(); + unsigned long dr6 =3D debug_read_reset_dr6(); =20 if (user_mode(regs)) exc_debug_user(regs, dr6); --=20 2.49.0 From nobody Fri Oct 10 09:53:04 2025 Received: from mail.zytor.com (terminus.zytor.com [198.137.202.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 775DA1E22FC; Tue, 17 Jun 2025 07:33:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.137.202.136 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750145628; cv=none; b=kr+Atp71xZyPLRMeCWRHPKoE2f2xpHTF344bqXFzUlkTy7pyztdon4MtyvaO6Vm4i3y3vvalo2ufffHzPkIflYYDnntvvljmQ0DJeGcFyMzLPpBN/HLNsHLbZ5DgP3qnhkuLEtNTFxmLQNZXLpMPoUYSutj0xYmnv2TYgdvXHiU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750145628; c=relaxed/simple; bh=SjPjqhJUo5tnTLAx9gehS2WYxidqB/n4ashPnn4A23c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FzfZ5bAOh9PHsGzTviyr2UwsKpOptVJgtHvfZFU9XxwN2eDbawliRYsIqtPOIiVIqI3XkZgLOgQCvdD360hmablHNlUMuYgEignEWKh4iP4wK8pJMU4fbNoniERmqkBX1hHrUi82xk10olUOh0T++De4u+qJnakSBvu4A/PpVag= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zytor.com; spf=pass smtp.mailfrom=zytor.com; dkim=pass (2048-bit key) header.d=zytor.com header.i=@zytor.com header.b=xf9Ma34l; arc=none smtp.client-ip=198.137.202.136 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zytor.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zytor.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=zytor.com header.i=@zytor.com header.b="xf9Ma34l" Received: from terminus.zytor.com (terminus.zytor.com [IPv6:2607:7c80:54:3:0:0:0:136]) (authenticated bits=0) by mail.zytor.com (8.18.1/8.17.1) with ESMTPSA id 55H7WY901020658 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Tue, 17 Jun 2025 00:32:39 -0700 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.zytor.com 55H7WY901020658 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zytor.com; s=2025052101; t=1750145560; bh=qaHWaR3qS+VvBjhBQiLm25PU4KqdjLMxlrG3QnDM/6c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=xf9Ma34lhmlCiTJKHLkI2fxVy55T2Igy/PPE/WbwHAr/rq+yB/pJzd8Nd3AwM8y3R Ns6u5aWKbEXTaoLzNF1AvwJ1gKAe+uIO5arCwuwQdOapjaLANj3elfLlQUanGoo+QA /AxKqiuEN6fUIxrtBmCUekBTvoSCEuElM2hy6g9vlUewNq97ms7N7jQRRMIcKfhBH0 SgnwjL5L9ysquzN8N7co0xljDm8ekkE76UfSNHUKklIVlcCyULxljIAWOHGKXSri8/ edrI+W1Fs26lV8UTISLoYR+DDCYbgN0Hfpr7wT5zyP3jFQmdhpctp9CnDcmcl4haER JPEdn29h/AHAA== From: "Xin Li (Intel)" To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, peterz@infradead.org, sohil.mehta@intel.com, brgerst@gmail.com, tony.luck@intel.com, fenghuay@nvidia.com Subject: [PATCH v2 2/2] x86/traps: Initialize DR7 by writing its architectural reset value Date: Tue, 17 Jun 2025 00:32:34 -0700 Message-ID: <20250617073234.1020644-3-xin@zytor.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250617073234.1020644-1-xin@zytor.com> References: <20250617073234.1020644-1-xin@zytor.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Initialize DR7 by writing its architectural reset value to ensure compliance with the specification. Reviewed-by: H. Peter Anvin (Intel) Signed-off-by: Xin Li (Intel) Acked-by: Peter Zijlstra (Intel) Acked-by: Sean Christopherson Reviewed-by: Sohil Mehta Tested-by: Sohil Mehta --- Changes in v2: *) Use debug register index 7 rather than DR_CONTROL (PeterZ and Sean). *) Use DR7_FIXED_1 as the architectural reset value of DR7 (Sean). --- arch/x86/include/asm/debugreg.h | 14 ++++++++++---- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kernel/cpu/common.c | 2 +- arch/x86/kernel/kgdb.c | 2 +- arch/x86/kernel/process_32.c | 2 +- arch/x86/kernel/process_64.c | 2 +- arch/x86/kvm/x86.c | 4 ++-- 7 files changed, 17 insertions(+), 11 deletions(-) diff --git a/arch/x86/include/asm/debugreg.h b/arch/x86/include/asm/debugre= g.h index 363110e6b2e3..3acb85850c19 100644 --- a/arch/x86/include/asm/debugreg.h +++ b/arch/x86/include/asm/debugreg.h @@ -9,6 +9,9 @@ #include #include =20 +/* DR7_FIXED_1 is also used as the init/reset value for DR7 */ +#define DR7_FIXED_1 0x00000400 + DECLARE_PER_CPU(unsigned long, cpu_dr7); =20 #ifndef CONFIG_PARAVIRT_XXL @@ -100,8 +103,8 @@ static __always_inline void native_set_debugreg(int reg= no, unsigned long value) =20 static inline void hw_breakpoint_disable(void) { - /* Zero the control register for HW Breakpoint */ - set_debugreg(0UL, 7); + /* Reset the control register for HW Breakpoint */ + set_debugreg(DR7_FIXED_1, 7); =20 /* Zero-out the individual HW breakpoint address registers */ set_debugreg(0UL, 0); @@ -125,9 +128,12 @@ static __always_inline unsigned long local_db_save(voi= d) return 0; =20 get_debugreg(dr7, 7); - dr7 &=3D ~0x400; /* architecturally set bit */ + + /* Architecturally set bit */ + dr7 &=3D ~DR7_FIXED_1; if (dr7) - set_debugreg(0, 7); + set_debugreg(DR7_FIXED_1, 7); + /* * Ensure the compiler doesn't lower the above statements into * the critical section; disabling breakpoints late would not diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index b4a391929cdb..639d9bcee842 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -31,6 +31,7 @@ =20 #include #include +#include #include #include #include @@ -249,7 +250,6 @@ enum x86_intercept_stage; #define DR7_BP_EN_MASK 0x000000ff #define DR7_GE (1 << 9) #define DR7_GD (1 << 13) -#define DR7_FIXED_1 0x00000400 #define DR7_VOLATILE 0xffff2bff =20 #define KVM_GUESTDBG_VALID_MASK \ diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 3bd7c9ac7576..183765fdb56b 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -2248,7 +2248,7 @@ static void initialize_debug_regs(void) int i; =20 /* Control register first */ - set_debugreg(0, 7); + set_debugreg(DR7_FIXED_1, 7); set_debugreg(DR6_RESERVED, 6); =20 /* Ignore db4, db5 */ diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index 102641fd2172..8b1a9733d13e 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c @@ -385,7 +385,7 @@ static void kgdb_disable_hw_debug(struct pt_regs *regs) struct perf_event *bp; =20 /* Disable hardware debugging while we are in kgdb: */ - set_debugreg(0UL, 7); + set_debugreg(DR7_FIXED_1, 7); for (i =3D 0; i < HBP_NUM; i++) { if (!breakinfo[i].enabled) continue; diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index a10e180cbf23..3ef15c2f152f 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c @@ -93,7 +93,7 @@ void __show_regs(struct pt_regs *regs, enum show_regs_mod= e mode, =20 /* Only print out debug registers if they are in their non-default state.= */ if ((d0 =3D=3D 0) && (d1 =3D=3D 0) && (d2 =3D=3D 0) && (d3 =3D=3D 0) && - (d6 =3D=3D DR6_RESERVED) && (d7 =3D=3D 0x400)) + (d6 =3D=3D DR6_RESERVED) && (d7 =3D=3D DR7_FIXED_1)) return; =20 printk("%sDR0: %08lx DR1: %08lx DR2: %08lx DR3: %08lx\n", diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 8d6cf25127aa..b972bf72fb8b 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -133,7 +133,7 @@ void __show_regs(struct pt_regs *regs, enum show_regs_m= ode mode, =20 /* Only print out debug registers if they are in their non-default state.= */ if (!((d0 =3D=3D 0) && (d1 =3D=3D 0) && (d2 =3D=3D 0) && (d3 =3D=3D 0) && - (d6 =3D=3D DR6_RESERVED) && (d7 =3D=3D 0x400))) { + (d6 =3D=3D DR6_RESERVED) && (d7 =3D=3D DR7_FIXED_1))) { printk("%sDR0: %016lx DR1: %016lx DR2: %016lx\n", log_lvl, d0, d1, d2); printk("%sDR3: %016lx DR6: %016lx DR7: %016lx\n", diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index b58a74c1722d..a9d992d5652f 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -11035,7 +11035,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) =20 if (unlikely(vcpu->arch.switch_db_regs && !(vcpu->arch.switch_db_regs & KVM_DEBUGREG_AUTO_SWITCH))) { - set_debugreg(0, 7); + set_debugreg(DR7_FIXED_1, 7); set_debugreg(vcpu->arch.eff_db[0], 0); set_debugreg(vcpu->arch.eff_db[1], 1); set_debugreg(vcpu->arch.eff_db[2], 2); @@ -11044,7 +11044,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) if (unlikely(vcpu->arch.switch_db_regs & KVM_DEBUGREG_WONT_EXIT)) kvm_x86_call(set_dr6)(vcpu, vcpu->arch.dr6); } else if (unlikely(hw_breakpoint_active())) { - set_debugreg(0, 7); + set_debugreg(DR7_FIXED_1, 7); } =20 vcpu->arch.host_debugctl =3D get_debugctlmsr(); --=20 2.49.0