exec.c: Record watchpoint fault address and direction
When we check whether we've hit a watchpoint we know the address that we were attempting to access and whether it was a read or a write. Record this information in the CPUWatchpoint struct so that target-specific code can report it to the guest. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
3ee887e8ff
commit
08225676b2
7
exec.c
7
exec.c
@ -1673,7 +1673,12 @@ static void check_watchpoint(int offset, int len, int flags)
|
|||||||
QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
|
QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
|
||||||
if (cpu_watchpoint_address_matches(wp, vaddr, len)
|
if (cpu_watchpoint_address_matches(wp, vaddr, len)
|
||||||
&& (wp->flags & flags)) {
|
&& (wp->flags & flags)) {
|
||||||
wp->flags |= BP_WATCHPOINT_HIT;
|
if (flags == BP_MEM_READ) {
|
||||||
|
wp->flags |= BP_WATCHPOINT_HIT_READ;
|
||||||
|
} else {
|
||||||
|
wp->flags |= BP_WATCHPOINT_HIT_WRITE;
|
||||||
|
}
|
||||||
|
wp->hitaddr = vaddr;
|
||||||
if (!cpu->watchpoint_hit) {
|
if (!cpu->watchpoint_hit) {
|
||||||
cpu->watchpoint_hit = wp;
|
cpu->watchpoint_hit = wp;
|
||||||
tb_check_watchpoint(cpu);
|
tb_check_watchpoint(cpu);
|
||||||
|
@ -170,6 +170,7 @@ typedef struct CPUBreakpoint {
|
|||||||
typedef struct CPUWatchpoint {
|
typedef struct CPUWatchpoint {
|
||||||
vaddr vaddr;
|
vaddr vaddr;
|
||||||
vaddr len;
|
vaddr len;
|
||||||
|
vaddr hitaddr;
|
||||||
int flags; /* BP_* */
|
int flags; /* BP_* */
|
||||||
QTAILQ_ENTRY(CPUWatchpoint) entry;
|
QTAILQ_ENTRY(CPUWatchpoint) entry;
|
||||||
} CPUWatchpoint;
|
} CPUWatchpoint;
|
||||||
@ -622,9 +623,12 @@ void cpu_single_step(CPUState *cpu, int enabled);
|
|||||||
#define BP_MEM_WRITE 0x02
|
#define BP_MEM_WRITE 0x02
|
||||||
#define BP_MEM_ACCESS (BP_MEM_READ | BP_MEM_WRITE)
|
#define BP_MEM_ACCESS (BP_MEM_READ | BP_MEM_WRITE)
|
||||||
#define BP_STOP_BEFORE_ACCESS 0x04
|
#define BP_STOP_BEFORE_ACCESS 0x04
|
||||||
#define BP_WATCHPOINT_HIT 0x08
|
/* 0x08 currently unused */
|
||||||
#define BP_GDB 0x10
|
#define BP_GDB 0x10
|
||||||
#define BP_CPU 0x20
|
#define BP_CPU 0x20
|
||||||
|
#define BP_WATCHPOINT_HIT_READ 0x40
|
||||||
|
#define BP_WATCHPOINT_HIT_WRITE 0x80
|
||||||
|
#define BP_WATCHPOINT_HIT (BP_WATCHPOINT_HIT_READ | BP_WATCHPOINT_HIT_WRITE)
|
||||||
|
|
||||||
int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags,
|
int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags,
|
||||||
CPUBreakpoint **breakpoint);
|
CPUBreakpoint **breakpoint);
|
||||||
|
Loading…
Reference in New Issue
Block a user