[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 03/16] exec: Add cpu_probe_watchpoint
From: |
Richard Henderson |
Subject: |
[PATCH 03/16] exec: Add cpu_probe_watchpoint |
Date: |
Tue, 10 Mar 2020 23:44:07 -0700 |
Allow probing of a watchpoint *without* raising an exception.
This is of most use for no-fault loads, which should indicate
via some architectural means that the load did not occur.
Signed-off-by: Richard Henderson <address@hidden>
---
include/hw/core/cpu.h | 7 +++++++
exec.c | 19 +++++++++++++++++++
2 files changed, 26 insertions(+)
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 73e9a869a4..8ec44267a4 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -1090,6 +1090,12 @@ static inline void cpu_check_watchpoint(CPUState *cpu,
vaddr addr, vaddr len,
{
}
+static inline bool cpu_probe_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
+ int flags)
+{
+ return false;
+}
+
static inline int cpu_watchpoint_address_matches(CPUState *cpu,
vaddr addr, vaddr len)
{
@@ -1104,6 +1110,7 @@ void cpu_watchpoint_remove_by_ref(CPUState *cpu,
CPUWatchpoint *watchpoint);
void cpu_watchpoint_remove_all(CPUState *cpu, int mask);
void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
MemTxAttrs attrs, int flags, uintptr_t ra);
+bool cpu_probe_watchpoint(CPUState *cpu, vaddr addr, vaddr len, int flags);
int cpu_watchpoint_address_matches(CPUState *cpu, vaddr addr, vaddr len);
#endif
diff --git a/exec.c b/exec.c
index 0cc500d53a..2b8f601b9e 100644
--- a/exec.c
+++ b/exec.c
@@ -2735,6 +2735,25 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr,
vaddr len,
}
}
+bool cpu_probe_watchpoint(CPUState *cpu, vaddr addr, vaddr len, int flags)
+{
+ CPUClass *cc = CPU_GET_CLASS(cpu);
+ CPUWatchpoint *wp;
+
+ assert(tcg_enabled());
+
+ addr = cc->adjust_watchpoint_address(cpu, addr, len);
+ QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
+ if (watchpoint_address_matches(wp, addr, len) &&
+ (wp->flags & flags) &&
+ (!(wp->flags & BP_CPU) ||
+ !cc->debug_check_watchpoint(cpu, wp))) {
+ return true;
+ }
+ }
+ return false;
+}
+
static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
MemTxAttrs attrs, void *buf, hwaddr len);
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
--
2.20.1
- [PATCH 00/16] target/arm: sve load/store improvements, Richard Henderson, 2020/03/11
- [PATCH 01/16] accel/tcg: Add block comment for probe_access, Richard Henderson, 2020/03/11
- [PATCH 03/16] exec: Add cpu_probe_watchpoint,
Richard Henderson <=
- [PATCH 02/16] accel/tcg: Add probe_access_flags, Richard Henderson, 2020/03/11
- [PATCH 04/16] target/arm: Use cpu_*_data_ra for sve_ldst_tlb_fn, Richard Henderson, 2020/03/11
- [PATCH 05/16] target/arm: Drop manual handling of set/clear_helper_retaddr, Richard Henderson, 2020/03/11
- [PATCH 09/16] target/arm: Handle watchpoints in sve_ld1_r, Richard Henderson, 2020/03/11
- [PATCH 06/16] target/arm: Add sve infrastructure for page lookup, Richard Henderson, 2020/03/11
- [PATCH 08/16] target/arm: Use SVEContLdSt in sve_ld1_r, Richard Henderson, 2020/03/11
- [PATCH 07/16] target/arm: Adjust interface of sve_ld1_host_fn, Richard Henderson, 2020/03/11
- [PATCH 10/16] target/arm: Use SVEContLdSt for multi-register contiguous loads, Richard Henderson, 2020/03/11