Re: [Patch 00/11] Hardware Breakpoint interfaces

Alan Stern
2009-04-24T14:16:19Z

On Fri, 24 Apr 2009, K.Prasad wrote:

> The arch_update_kernel_hw_breakpoints() was designed to work like this -
> it updates all registers beginning 'hbp_kernel_pos' to (HB_NUM - 1) with
> the values stored in hbp_kernel[] array.
>
> When inserting a new breakpoint, hbp_kernel_pos is decremented *before*
> invoking arch_update_kernel_hw_breakpoints() so that the new value is
> also written onto the physical debug register.
>
> On removal, 'hbp_kernel_pos' is incremented *after*
> arch_update_kernel_hw_breakpoints() so that the physical debug registers
> i.e. both DR7 and DR<pos> are updated with the changes post removal and
> compaction. I'm ready to make changes but don't see where the code
> actually goes wrong. Can you explain that?

I'm sorry; I misread the code in arch_update_kernel_hw_breakpoints().
It isn't actually wrong, and you are correct to increment
hbp_kernel_pos where you do. Your code is different from my original
version, which would update all the debug registers at once instead of
doing the kernel and userspace breakpoints separately -- that's what
confused me.

There is one change you could make to improve the routine, however. In
arch_update_kernel_hw_breakpoints(), the line

kdr7 &= ~kdr7_masks[hbp_kernel_pos];

really should be

kdr7 = 0;

since kdr7 never contains anything other than kernel breakpoint
settings. (You could update the comment in the preceding line as
well.)

Alan Stern