* [PATCH-for-8.0 0/3] softmmu: Restore use of CPU watchpoint for non-TCG accelerators
@ 2023-03-28 16:02 Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 1/3] softmmu/watchpoint: Add missing 'qemu/error-report.h' include Philippe Mathieu-Daudé
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-28 16:02 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, kvm, qemu-s390x, Fabiano Rosas,
David Hildenbrand, Marcel Apfelbaum, Paolo Bonzini, Greg Kurz,
Christian Borntraeger, Thomas Huth, Peter Maydell,
Richard Henderson, Ilya Leoshkevich, Halil Pasic,
Cédric Le Goater, Daniel Henrique Barboza, David Gibson,
Yanan Wang, qemu-ppc, Alex Bennée, qemu-arm,
Philippe Mathieu-Daudé
Commit 2609ec2868 ("softmmu: Extract watchpoint API from physmem.c")
restricted CPU watchpoints to TCG accelerator. This is wrong, as
other accelerators such KVM do use watchpoints. Revert (partially)
this commit.
https://lore.kernel.org/qemu-devel/4784948c-1a92-1991-d6a2-b4d1ee23136c@redhat.com/
Philippe Mathieu-Daudé (3):
softmmu/watchpoint: Add missing 'qemu/error-report.h' include
softmmu: Restrict cpu_check_watchpoint / address_matches to TCG accel
softmmu: Restore use of CPU watchpoint for all accelerators
include/hw/core/cpu.h | 39 +------------------------------
include/hw/core/tcg-cpu-ops.h | 43 +++++++++++++++++++++++++++++++++++
softmmu/watchpoint.c | 5 ++++
softmmu/meson.build | 2 +-
4 files changed, 50 insertions(+), 39 deletions(-)
--
2.38.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH-for-8.0 1/3] softmmu/watchpoint: Add missing 'qemu/error-report.h' include
2023-03-28 16:02 [PATCH-for-8.0 0/3] softmmu: Restore use of CPU watchpoint for non-TCG accelerators Philippe Mathieu-Daudé
@ 2023-03-28 16:02 ` Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 2/3] softmmu: Restrict cpu_check_watchpoint / address_matches to TCG accel Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 3/3] softmmu: Restore use of CPU watchpoint for all accelerators Philippe Mathieu-Daudé
2 siblings, 0 replies; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-28 16:02 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, kvm, qemu-s390x, Fabiano Rosas,
David Hildenbrand, Marcel Apfelbaum, Paolo Bonzini, Greg Kurz,
Christian Borntraeger, Thomas Huth, Peter Maydell,
Richard Henderson, Ilya Leoshkevich, Halil Pasic,
Cédric Le Goater, Daniel Henrique Barboza, David Gibson,
Yanan Wang, qemu-ppc, Alex Bennée, qemu-arm,
Philippe Mathieu-Daudé
cpu_watchpoint_insert() calls error_report() which is declared
in "qemu/error-report.h". When moving this code in commit 2609ec2868
("softmmu: Extract watchpoint API from physmem.c") we neglected to
include this header. This works so far because it is indirectly
included by TCG headers -> "qemu/plugin.h" -> "qemu/error-report.h".
Currently cpu_watchpoint_insert() is only built with the TCG
accelerator. When building it with other ones (or without TCG)
we get:
softmmu/watchpoint.c:38:9: error: implicit declaration of function 'error_report' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
error_report("tried to set invalid watchpoint at %"
^
Include "qemu/error-report.h" in order to fix this for non-TCG
builds.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
softmmu/watchpoint.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/softmmu/watchpoint.c b/softmmu/watchpoint.c
index ad58736787..9d6ae68499 100644
--- a/softmmu/watchpoint.c
+++ b/softmmu/watchpoint.c
@@ -19,6 +19,7 @@
#include "qemu/osdep.h"
#include "qemu/main-loop.h"
+#include "qemu/error-report.h"
#include "exec/exec-all.h"
#include "exec/translate-all.h"
#include "sysemu/tcg.h"
--
2.38.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH-for-8.0 2/3] softmmu: Restrict cpu_check_watchpoint / address_matches to TCG accel
2023-03-28 16:02 [PATCH-for-8.0 0/3] softmmu: Restore use of CPU watchpoint for non-TCG accelerators Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 1/3] softmmu/watchpoint: Add missing 'qemu/error-report.h' include Philippe Mathieu-Daudé
@ 2023-03-28 16:02 ` Philippe Mathieu-Daudé
2023-03-28 16:15 ` Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 3/3] softmmu: Restore use of CPU watchpoint for all accelerators Philippe Mathieu-Daudé
2 siblings, 1 reply; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-28 16:02 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, kvm, qemu-s390x, Fabiano Rosas,
David Hildenbrand, Marcel Apfelbaum, Paolo Bonzini, Greg Kurz,
Christian Borntraeger, Thomas Huth, Peter Maydell,
Richard Henderson, Ilya Leoshkevich, Halil Pasic,
Cédric Le Goater, Daniel Henrique Barboza, David Gibson,
Yanan Wang, qemu-ppc, Alex Bennée, qemu-arm,
Philippe Mathieu-Daudé
Both cpu_check_watchpoint() and cpu_watchpoint_address_matches()
are specific to TCG system emulation. Declare them in "tcg-cpu-ops.h"
to be sure accessing them from non-TCG code is a compilation error.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/hw/core/cpu.h | 37 ------------------------------
include/hw/core/tcg-cpu-ops.h | 43 +++++++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+), 37 deletions(-)
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 821e937020..ce312745d5 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -970,17 +970,6 @@ static inline void cpu_watchpoint_remove_by_ref(CPUState *cpu,
static inline void cpu_watchpoint_remove_all(CPUState *cpu, int mask)
{
}
-
-static inline void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
- MemTxAttrs atr, int fl, uintptr_t ra)
-{
-}
-
-static inline int cpu_watchpoint_address_matches(CPUState *cpu,
- vaddr addr, vaddr len)
-{
- return 0;
-}
#else
int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
int flags, CPUWatchpoint **watchpoint);
@@ -988,32 +977,6 @@ int cpu_watchpoint_remove(CPUState *cpu, vaddr addr,
vaddr len, int flags);
void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint);
void cpu_watchpoint_remove_all(CPUState *cpu, int mask);
-
-/**
- * cpu_check_watchpoint:
- * @cpu: cpu context
- * @addr: guest virtual address
- * @len: access length
- * @attrs: memory access attributes
- * @flags: watchpoint access type
- * @ra: unwind return address
- *
- * Check for a watchpoint hit in [addr, addr+len) of the type
- * specified by @flags. Exit via exception with a hit.
- */
-void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
- MemTxAttrs attrs, int flags, uintptr_t ra);
-
-/**
- * cpu_watchpoint_address_matches:
- * @cpu: cpu context
- * @addr: guest virtual address
- * @len: access length
- *
- * Return the watchpoint flags that apply to [addr, addr+len).
- * If no watchpoint is registered for the range, the result is 0.
- */
-int cpu_watchpoint_address_matches(CPUState *cpu, vaddr addr, vaddr len);
#endif
/**
diff --git a/include/hw/core/tcg-cpu-ops.h b/include/hw/core/tcg-cpu-ops.h
index 20e3c0ffbb..0ae08df47e 100644
--- a/include/hw/core/tcg-cpu-ops.h
+++ b/include/hw/core/tcg-cpu-ops.h
@@ -175,4 +175,47 @@ struct TCGCPUOps {
};
+#if defined(CONFIG_USER_ONLY)
+
+static inline void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
+ MemTxAttrs atr, int fl, uintptr_t ra)
+{
+}
+
+static inline int cpu_watchpoint_address_matches(CPUState *cpu,
+ vaddr addr, vaddr len)
+{
+ return 0;
+}
+
+#else
+
+/**
+ * cpu_check_watchpoint:
+ * @cpu: cpu context
+ * @addr: guest virtual address
+ * @len: access length
+ * @attrs: memory access attributes
+ * @flags: watchpoint access type
+ * @ra: unwind return address
+ *
+ * Check for a watchpoint hit in [addr, addr+len) of the type
+ * specified by @flags. Exit via exception with a hit.
+ */
+void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
+ MemTxAttrs attrs, int flags, uintptr_t ra);
+
+/**
+ * cpu_watchpoint_address_matches:
+ * @cpu: cpu context
+ * @addr: guest virtual address
+ * @len: access length
+ *
+ * Return the watchpoint flags that apply to [addr, addr+len).
+ * If no watchpoint is registered for the range, the result is 0.
+ */
+int cpu_watchpoint_address_matches(CPUState *cpu, vaddr addr, vaddr len);
+
+#endif
+
#endif /* TCG_CPU_OPS_H */
--
2.38.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH-for-8.0 3/3] softmmu: Restore use of CPU watchpoint for all accelerators
2023-03-28 16:02 [PATCH-for-8.0 0/3] softmmu: Restore use of CPU watchpoint for non-TCG accelerators Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 1/3] softmmu/watchpoint: Add missing 'qemu/error-report.h' include Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 2/3] softmmu: Restrict cpu_check_watchpoint / address_matches to TCG accel Philippe Mathieu-Daudé
@ 2023-03-28 16:02 ` Philippe Mathieu-Daudé
2 siblings, 0 replies; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-28 16:02 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, kvm, qemu-s390x, Fabiano Rosas,
David Hildenbrand, Marcel Apfelbaum, Paolo Bonzini, Greg Kurz,
Christian Borntraeger, Thomas Huth, Peter Maydell,
Richard Henderson, Ilya Leoshkevich, Halil Pasic,
Cédric Le Goater, Daniel Henrique Barboza, David Gibson,
Yanan Wang, qemu-ppc, Alex Bennée, qemu-arm,
Philippe Mathieu-Daudé
CPU watchpoints can be use by non-TCG accelerators.
KVM uses them:
$ git grep CPUWatchpoint|fgrep kvm
target/arm/kvm64.c:1558: CPUWatchpoint *wp = find_hw_watchpoint(cs, debug_exit->far);
target/i386/kvm/kvm.c:5216:static CPUWatchpoint hw_watchpoint;
target/ppc/kvm.c:443:static CPUWatchpoint hw_watchpoint;
target/s390x/kvm/kvm.c:139:static CPUWatchpoint hw_watchpoint;
See for example commit e4482ab7e3 ("target-arm: kvm - add support
for HW assisted debug"):
This adds basic support for HW assisted debug. The ioctl interface
to KVM allows us to pass an implementation defined number of break
and watch point registers. [...]
This partially reverts commit 2609ec2868e6c286e755a73b4504714a0296a.
Fixes: 2609ec2868 ("softmmu: Extract watchpoint API from physmem.c")
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/hw/core/cpu.h | 2 +-
softmmu/watchpoint.c | 4 ++++
softmmu/meson.build | 2 +-
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index ce312745d5..397fd3ac68 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -949,7 +949,7 @@ static inline bool cpu_breakpoint_test(CPUState *cpu, vaddr pc, int mask)
return false;
}
-#if !defined(CONFIG_TCG) || defined(CONFIG_USER_ONLY)
+#if defined(CONFIG_USER_ONLY)
static inline int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
int flags, CPUWatchpoint **watchpoint)
{
diff --git a/softmmu/watchpoint.c b/softmmu/watchpoint.c
index 9d6ae68499..5350163385 100644
--- a/softmmu/watchpoint.c
+++ b/softmmu/watchpoint.c
@@ -104,6 +104,8 @@ void cpu_watchpoint_remove_all(CPUState *cpu, int mask)
}
}
+#ifdef CONFIG_TCG
+
/*
* Return true if this watchpoint address matches the specified
* access (ie the address range covered by the watchpoint overlaps
@@ -220,3 +222,5 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
}
}
}
+
+#endif /* CONFIG_TCG */
diff --git a/softmmu/meson.build b/softmmu/meson.build
index 0180577517..1a7c7ac089 100644
--- a/softmmu/meson.build
+++ b/softmmu/meson.build
@@ -5,11 +5,11 @@ specific_ss.add(when: 'CONFIG_SOFTMMU', if_true: [files(
'physmem.c',
'qtest.c',
'dirtylimit.c',
+ 'watchpoint.c',
)])
specific_ss.add(when: ['CONFIG_SOFTMMU', 'CONFIG_TCG'], if_true: [files(
'icount.c',
- 'watchpoint.c',
)])
softmmu_ss.add(files(
--
2.38.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH-for-8.0 2/3] softmmu: Restrict cpu_check_watchpoint / address_matches to TCG accel
2023-03-28 16:02 ` [PATCH-for-8.0 2/3] softmmu: Restrict cpu_check_watchpoint / address_matches to TCG accel Philippe Mathieu-Daudé
@ 2023-03-28 16:15 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-28 16:15 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, kvm, qemu-s390x, Fabiano Rosas,
David Hildenbrand, Marcel Apfelbaum, Paolo Bonzini, Greg Kurz,
Christian Borntraeger, Thomas Huth, Peter Maydell,
Richard Henderson, Ilya Leoshkevich, Halil Pasic,
Cédric Le Goater, Daniel Henrique Barboza, David Gibson,
Yanan Wang, qemu-ppc, Alex Bennée, qemu-arm
On 28/3/23 18:02, Philippe Mathieu-Daudé wrote:
> Both cpu_check_watchpoint() and cpu_watchpoint_address_matches()
> are specific to TCG system emulation. Declare them in "tcg-cpu-ops.h"
> to be sure accessing them from non-TCG code is a compilation error.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> include/hw/core/cpu.h | 37 ------------------------------
> include/hw/core/tcg-cpu-ops.h | 43 +++++++++++++++++++++++++++++++++++
> 2 files changed, 43 insertions(+), 37 deletions(-)
>
> diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
> index 821e937020..ce312745d5 100644
> --- a/include/hw/core/cpu.h
> +++ b/include/hw/core/cpu.h
> @@ -970,17 +970,6 @@ static inline void cpu_watchpoint_remove_by_ref(CPUState *cpu,
> static inline void cpu_watchpoint_remove_all(CPUState *cpu, int mask)
> {
> }
> -
> -static inline void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
> - MemTxAttrs atr, int fl, uintptr_t ra)
> -{
> -}
> -
> -static inline int cpu_watchpoint_address_matches(CPUState *cpu,
> - vaddr addr, vaddr len)
> -{
> - return 0;
> -}
> #else
> int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
> int flags, CPUWatchpoint **watchpoint);
> @@ -988,32 +977,6 @@ int cpu_watchpoint_remove(CPUState *cpu, vaddr addr,
> vaddr len, int flags);
> void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint);
> void cpu_watchpoint_remove_all(CPUState *cpu, int mask);
> -
> -/**
> - * cpu_check_watchpoint:
> - * @cpu: cpu context
> - * @addr: guest virtual address
> - * @len: access length
> - * @attrs: memory access attributes
> - * @flags: watchpoint access type
> - * @ra: unwind return address
> - *
> - * Check for a watchpoint hit in [addr, addr+len) of the type
> - * specified by @flags. Exit via exception with a hit.
> - */
> -void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
> - MemTxAttrs attrs, int flags, uintptr_t ra);
> -
> -/**
> - * cpu_watchpoint_address_matches:
> - * @cpu: cpu context
> - * @addr: guest virtual address
> - * @len: access length
> - *
> - * Return the watchpoint flags that apply to [addr, addr+len).
> - * If no watchpoint is registered for the range, the result is 0.
> - */
> -int cpu_watchpoint_address_matches(CPUState *cpu, vaddr addr, vaddr len);
> #endif
>
> /**
> diff --git a/include/hw/core/tcg-cpu-ops.h b/include/hw/core/tcg-cpu-ops.h
> index 20e3c0ffbb..0ae08df47e 100644
> --- a/include/hw/core/tcg-cpu-ops.h
> +++ b/include/hw/core/tcg-cpu-ops.h
> @@ -175,4 +175,47 @@ struct TCGCPUOps {
>
> };
>
> +#if defined(CONFIG_USER_ONLY)
> +
> +static inline void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
> + MemTxAttrs atr, int fl, uintptr_t ra)
> +{
> +}
> +
> +static inline int cpu_watchpoint_address_matches(CPUState *cpu,
> + vaddr addr, vaddr len)
> +{
> + return 0;
> +}
> +
> +#else
> +
> +/**
> + * cpu_check_watchpoint:
> + * @cpu: cpu context
> + * @addr: guest virtual address
> + * @len: access length
> + * @attrs: memory access attributes
> + * @flags: watchpoint access type
> + * @ra: unwind return address
> + *
> + * Check for a watchpoint hit in [addr, addr+len) of the type
> + * specified by @flags. Exit via exception with a hit.
> + */
> +void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
> + MemTxAttrs attrs, int flags, uintptr_t ra);
> +
> +/**
> + * cpu_watchpoint_address_matches:
> + * @cpu: cpu context
> + * @addr: guest virtual address
> + * @len: access length
> + *
> + * Return the watchpoint flags that apply to [addr, addr+len).
> + * If no watchpoint is registered for the range, the result is 0.
> + */
> +int cpu_watchpoint_address_matches(CPUState *cpu, vaddr addr, vaddr len);
> +
> +#endif
> +
> #endif /* TCG_CPU_OPS_H */
This hunk is missing:
-- >8 --
diff --git a/target/arm/tcg/mte_helper.c b/target/arm/tcg/mte_helper.c
index fee3c7eb96..22802b659d 100644
--- a/target/arm/tcg/mte_helper.c
+++ b/target/arm/tcg/mte_helper.c
@@ -29,2 +29,3 @@
#include "qemu/guest-random.h"
+#include "hw/core/tcg-cpu-ops.h"
diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c
index 9a8951afa4..ace2d88f8d 100644
--- a/target/arm/tcg/sve_helper.c
+++ b/target/arm/tcg/sve_helper.c
@@ -29,3 +29,3 @@
#include "sve_ldst_internal.h"
-
+#include "hw/core/tcg-cpu-ops.h"
diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c
index b93dbd3dad..1e7f72a2f2 100644
--- a/target/s390x/tcg/mem_helper.c
+++ b/target/s390x/tcg/mem_helper.c
@@ -30,2 +30,3 @@
#include "qemu/atomic128.h"
+#include "hw/core/tcg-cpu-ops.h"
#include "trace.h"
---
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-03-28 16:16 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-28 16:02 [PATCH-for-8.0 0/3] softmmu: Restore use of CPU watchpoint for non-TCG accelerators Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 1/3] softmmu/watchpoint: Add missing 'qemu/error-report.h' include Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 2/3] softmmu: Restrict cpu_check_watchpoint / address_matches to TCG accel Philippe Mathieu-Daudé
2023-03-28 16:15 ` Philippe Mathieu-Daudé
2023-03-28 16:02 ` [PATCH-for-8.0 3/3] softmmu: Restore use of CPU watchpoint for all accelerators Philippe Mathieu-Daudé
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).