Hi,
Please look over the following patch to ddb. This patch adds the
'hwatch' and 'dhwatch' commands to set and delete hardware
watchpoints. These commands allow one to utilize hardware watchpoints
without having to modify the debug registers directly (which can be
tricky).
I modified the 'show watch' command to display information about
hardware watchpoints as well. These commands result in no-ops for
architectures that don't support them.
I originally tried to overload the 'watch' and 'dwatch' command but
their operation was sufficiently different that I decided it best to
make a new command. For one thing, watchpoints are not actually
installed until a 'continue' command is given which makes it
impossible see the effects on the debug registers until after the next
break or watchpoint has been hit. More serious, though, the 'watch'
command really seems to be designed for watching addresses in user
address space and not the kernel.
To support the hwatch/dhwatch commands, I needed three machine
dependent hooks from ddb:
db_md_set_watchpoint()
db_md_clr_watchpoint()
db_md_list_watchpoints()
These are all called from within ddb/db_watch.c and are defined in
$arch/$arch/db_trace.c.
The patch is located at:
http://people.freebsd.org/~bsd/ddb/ddb.patch2
I've built an alpha kernel with the patch applied and it built ok. I
don't have hardware to actually run it, though, but since this ends up
as a no-op on alpha (and ia64), I suspect it is Ok (famous last
words). I don't know where I can build this on an ia64 machine. Do we
have a machine available for this kind of thing?
Caveats: This patch won't do the right thing on SMP systems. The
debug registers are set/cleared only for the CPU running ddb.
Since the debug registers are a per-cpu thing, they won't be
set for the other CPUs. I'll work on that next.
See below for a sample session.
Thanks,
-Brian
--
Brian Dean
[EMAIL PROTECTED]
[EMAIL PROTECTED]
Example session:
login:
FreeBSD/i386 (stage.bsdhome.com) (ttyd1)
login: Debugger("manual escape to debugger")
Stopped at Debugger+0x44: pushl %ebx
db> show reg
cs 0x8
ds 0x10
es 0xc9a80010
fs 0xc0300018 harvestring+0x2b38
ss 0x10
eax 0x26
ecx 0x2fd
edx 0x2f9
ebx 0x202
esp 0xc9a8ded0
ebp 0xc9a8dedc
esi 0xc0cff400
edi 0xc0d16800
eip 0xc0276974 Debugger+0x44
efl 0x46
dr0 0
dr1 0
dr2 0
dr3 0
dr4 0xffff0ff0
dr5 0x400
dr6 0xffff0ff0
dr7 0x400
Debugger+0x44: pushl %ebx
db> hwatch 0xcaae6740,9
db> show watch
No watchpoints set
hardware watchpoints:
watch status type len address
----- -------- ---------- --- ----------
0 enabled write 4 0xcaae6740
1 enabled write 4 0xcaae6744
2 enabled write 1 0xcaae6748
3 disabled
debug register values:
dr0 0xcaae6740
dr1 0xcaae6744
dr2 0xcaae6748
dr3 0x00000000
dr4 0xffff0ff0
dr5 0x01dd042a
dr6 0xffff0ff0
dr7 0x01dd042a
db> cont
Stopped at runq_add+0x41: movl 0x4(%edx),%eax
db> dhwatch 0xcaae6740,9
db> show watch
No watchpoints set
hardware watchpoints:
watch status type len address
----- -------- ---------- --- ----------
0 disabled
1 disabled
2 disabled
3 disabled
debug register values:
dr0 0x00000000
dr1 0x00000000
dr2 0x00000000
dr3 0x00000000
dr4 0xffff0ff1
dr5 0x00000400
dr6 0xffff0ff1
dr7 0x00000400
db> cont
FreeBSD/i386 (stage.bsdhome.com) (ttyd1)
login:
--
Brian Dean [EMAIL PROTECTED]
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message