Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [High] Modifying a debug address register without first disabling the 
corresponding breakpoint in DR7 violates the x86 hardware architecture 
specification and causes unpredictable behavior.
--

commit 35b07811f48c348c13ac1d9de7fa44d25fc7f36a
Author: Jinchao Wang <[email protected]>

x86/hw_breakpoints: Add arch_modify_local_hw_breakpoint_addr() API

This commit adds an architecture backend to modify the address of an active
per-CPU watchpoint without releasing its hardware slot. It validates the new
address, finds the installed local slot, and updates the hardware debug
register and per-CPU shadow state.

Link: 
https://lore.kernel.org/all/59637b96946653393a7ad3c7de094094796b39c2.1785067572.git.wangjinchao...@gmail.com/

> diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoint.c
> index 3204e75dc4546..2227918b0163c 100644
> --- a/arch/x86/kernel/hw_breakpoint.c
> +++ b/arch/x86/kernel/hw_breakpoint.c

[ ... ]

> +int arch_modify_local_hw_breakpoint_addr(struct perf_event *bp,
> +                                      unsigned long addr)
> +{

[ ... ]

> +     do {
> +             seq = this_cpu_inc_return(cpu_dr7_seq);
> +             this_cpu_write(cpu_debugreg[i], addr);
> +             barrier();
> +             set_debugreg(addr, i);

[Severity: High]
Does this code risk violating the x86 hardware architecture specification?

Looking at arch_modify_local_hw_breakpoint_addr() in
arch/x86/kernel/hw_breakpoint.c, set_debugreg() directly updates the debug
address register (DR0-DR3) while its corresponding enable bit in DR7 might
still be set.

According to hardware specs, modifying a debug address register without first
disabling the breakpoint in DR7 can lead to spurious debug exceptions or
unpredictable processor behavior if an NMI occurs or if execution boundaries
trigger a match on the transient state.

Should the DR7 enable bit be cleared before updating the debug register?

> +             barrier();
> +     } while (seq != this_cpu_read(cpu_dr7_seq));
> +
> +     return 0;
> +}

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/178810001186.64882.2161016469449127450.stgit@devnote2?part=5

Reply via email to