Re: [PATCH v2 1/2] x86/traps: Initialize DR6 by writing its architectural reset value

From: Peter Zijlstra
Date: Tue Jun 17 2025 - 05:03:50 EST


On Tue, Jun 17, 2025 at 12:32:33AM -0700, Xin Li (Intel) wrote:
> 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
>
> -/*
> - * Clear all 6 debug registers:
> - */
> -static void clear_all_debug_regs(void)
> +static void initialize_debug_regs(void)
> {
> int i;
>
> - for (i = 0; i < 8; i++) {
> - /* Ignore db4, db5 */
> - if ((i == 4) || (i == 5))
> - continue;
> + /* Control register first */
> + set_debugreg(0, 7);
> + set_debugreg(DR6_RESERVED, 6);
>
> + /* Ignore db4, db5 */
> + for (i = 0; i < 4; i++)
> set_debugreg(0, i);
> - }
> }
>
> #ifdef CONFIG_KGDB

Maybe like so?

--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -2206,15 +2206,14 @@ EXPORT_PER_CPU_SYMBOL(__stack_chk_guard)

static void initialize_debug_regs(void)
{
- int i;
-
- /* Control register first */
+ /* Control register first -- to make sure everything is disabled. */
set_debugreg(0, 7);
set_debugreg(DR6_RESERVED, 6);
-
- /* Ignore db4, db5 */
- for (i = 0; i < 4; i++)
- set_debugreg(0, i);
+ /* dr5 and dr4 don't exist */
+ set_debugreg(0, 3);
+ set_debugreg(0, 2);
+ set_debugreg(0, 1);
+ set_debugreg(0, 0);
}

#ifdef CONFIG_KGDB