On Tue, 3 Dec 2002, Daniel Jacobowitz wrote:
> > As a fallback the approach is just fine, but doesn't is suck
> > performance-wise for watchpoints at the stack? It certainly sucks for
> > instruction fetches. While gdb doesn't seem to use hardware breakpoints
> > as they are only really necessary for ROMs, other software may want to
> > (well, gdb too, one day).
>
> Page-protection watchpoints on the stack do bite for performance, yes.
> Most watched variables are not on the stack, though. People tend to
> watch globals.
Well, so far I've almost exclusively watched the stack, sometimes
malloc()ed areas, to track down out of bound corruption. It's really
useful when a program crashes with a SIGSEGV when returning from a
function call or when calling free() with a legal pointer. Watching
globals has not been really useful for me so far -- they are rarely used
in the first place and you know where they can get modified, so you can
set ordinary breakpoints in contexts of interest.
> On Mon, Nov 25, 2002 at 04:08:00PM +0100, Ralf Baechle wrote:
> > I assume you got and R4000 manual and the MIPS64 spec. R4000 implements
> > matching a physical address with a granularity of 8 bytes for load and
> > store operations.
>
> Not handy.
Still better than nothing. Userland doesn't need to care of the
underlying implementation anyway. You simply have a single watchpoint
available. The kernel needs to take care when entering and exiting
userland.
> > So how would a prefered ptrace(2) API for hardware watchpoints look like?
>
> Well, it would be nice to have at least:
> - query total number
> - query the granularity, or at least query whether or not the
> granularity is settable
> - Set and remove watchpoints.
>
> Off the top of my head:
> PTRACE_MIPS_WATCHPOINT_INFO
> struct mips_watchpoint_info {
> u32 num_avail;
> u32 max_size;
> };
The information may be provided when reading the registers.
> PTRACE_MIPS_WATCHPOINT_SET
> struct mips_watchpoint_set {
> u32 index;
> u32 size;
> s64 address;
> };
How about a KISS approach:
typedef struct {
s64 address;
u64 mask;
u64 access;
} mips_watchpoint;
typedef struct {
s32 api_version;
s32 nr_watchpoints;
mips_watchpoint watchpoints[0];
} mips_watchpoint_set;
Then PTRACE_MIPS_WATCHPOINT_GET is used to retrieve current settings,
PTRACE_MIPS_WATCHPOINT_SET is used to alter them. More details:
PTRACE_MIPS_WATCHPOINT_SET:
Input:
- api_version has to match the version implemented, currently 0,
- nr_watchpoints specifies the number of watchpoint descriptions
following, >= 0,
- for each watchpoints entry i, (i = 0; i < nr_watchpoints; i++):
- address specifies the virtual address covered -- properly
sign-extended for the 32-bit kernel),
- mask specifies the mask to use against the address -- don't care bits
set to one,
- access specifies the access type; currently read, write and exec are
specified -- we may follow the MIPS32/64 ISA definition.
Output:
- error code: a failure if a protection violation happens when reading
mips_watchpoint_set, otherwise success.
PTRACE_MIPS_WATCHPOINT_GET:
Input:
- api_version set to the version expected, currently 0, = api_version_i,
- nr_watchpoints specifies the maximum number of watchpoint descriptions
expected, >= 0, = nr_watchpoints_i
Output:
- error code: a failure if a protection violation happens when writing
mips_watchpoint_set, otherwise success,
- api_version set to the version supported, currently 0, = api_version_o,
- if (api_version_i == api_version_o):
- nr_watchpoints set to the number of watchpoints supported, >= 0, =
nr_watchpoints_o,
- for each watchpoints entry i, (i = 0; i < min(nr_watchpoints_i,
nr_watchpoints_o; i++):
- address set to the value preset for the watchpoint, as obtained
from hardware,
- mask set to the value preset for the watchpoint, as obtained from
hardware,
- access set to the value preset for the watchpoint, as obtained from
hardware.
I think such an interface covers all the functionality we care of now,
including implementation variations (R4000 vs R4650 vs MIPS32/64), and
provides for cheap future expansion. Additionally thread-global
watchpoints may be handled by adding a bit to the access member if needed.
What do you think?
Maciej
--
+ Maciej W. Rozycki, Technical University of Gdansk, Poland +
+--------------------------------------------------------------+
+ e-mail: macro@ds2.pg.gda.pl, PGP key available +
|